今天我们所说的“微服务”是一个庞大且复杂的概念集合,它既是一种架构模式,也是实现这种架构模式时所使用的技术方案的集合。
“微服务”不是银弹
微服务并不是一劳永逸的解决了所有的问题,相反的,如果不能正确的使用微服务,则有可能被微服务自身的限制拖入另一个泥潭:
- 分布式的代价。原本在单体应用中,很多简单的问题都会在分布式环境下被几何级的放大。例如分布式事务、分布式锁、远程调用等,不光要考虑如何实现他们,相关场景的异常处理也是必须要考虑到的问题。
- 协同代价。如果你经历过一个项目上线需要发布十几个应用,而这些应用又分别由多个团队在维护。你就能深刻的体会到协同是一件多么痛苦的事情了。
- 服务拆分需要很强的设计功力。微服务的各种优势,其中一个重要的基础是对服务领域的正确切分。如果使用了不合适的切分粒度,或者是错误的切分方法,都会让服务不能很好的实现高内聚低耦合的要求。
框架篇
从 Spring 到 Spring Cloud
Spring
熟悉 java 语言的同学,对 Spring 框架应该都不陌生。从 2004 年 1.0 版本发布开始,便由于其灵活易用的特性受到了整个 Java 行业的广泛关注。经过十多年的发展,Spring 框架早已经成为 Java 语言下编程模型的事实标准。其所倡导的 IOC/AOP 概念也早已深入人心。
在 Spring 框架的早期,大家都喜欢称其为“轻量化”框架(现在好像早就没人提这个词了^_^),“轻量”是相对于 EJB 等企业级开发框架而言的。其“轻”的特性体现在:框架本身的大小很小,早期版本的jar包不超过1MB;同时不依赖于运行容器,也是说任何容器里都可以运行Spring框架;更加重要的是 Spring 是非侵入的,使用Spring开发的应用可以不完全依赖Spring的类;
Spring Boot
但是事情总会发生变化,随着 Spring 的不断发展,越来越多的组件被集成到了框架中。Spring 框架也从一个小巧精简的 IOC 容器框架变成了一套大而全的框架集合。开发者为了实现组件的整合工作,往往需要在大量的 xml 文件、java 注解 中完成各种 bean 的配置。曾经屠龙的少年,如今也变成了恶龙。
那个时候,很多比 Spring 更加简单小巧的 IOC 容器如雨后春笋般的出现。业界开始出现一种声音:Spring 是不是已经不行了,或者是在走下坡路了。就在这个时候 Pivotal 推出了 Spring Boot 来彻底的解决这些问题。
使用 Spring Boot 可以大大简化 Spring 应用的开发工作。在 Spring Boot 中无论是官方组件还是第三方框架都会提供各种“starter”来方便开发者进行依赖和集成。由于采用了“约定大于配置”的思想,开发者在引入“stater”以后只需要做少量的配置工作就可以完成框架集成工作。往往开发者只需要很少量的代码就可以实现以前大量配置文件才能做到的功能。
同时 Spring Boot 还是一套面向生产环境设计的框架。配置外化、运行情况检查功能,可以很方便的在系统外部实现对系统的管理。同时 Spring Boot 还是一个运行时容器。通过内嵌 Tomcat 、Jetty 等使得程序的运行不在依赖传统的应用服务器。这一点在云原生时代意义尤其重大。
Spring 官方对 Spring Boot 特色定义如下:
- 创建独立的Spring应用程序
- 直接嵌入Tomcat,Jetty或Undertow(无需部署WAR文件)
- 提供自以为是的“starter”依赖项,以简化构建配置
- 尽可能自动配置Spring和三方类库
- 提供可用于生产的功能,例如指标,运行状况检查和外部化配置
- 完全没有代码生成,也不需要XML配置
Spring Cloud
Spring Cloud 是什么,没有比官方的定义更能说明问题了:
Spring Cloud provides tools for developers to quickly build some of the common patterns in distributed systems (e.g. configuration management, service discovery, circuit breakers, intelligent routing, micro-proxy, control bus, one-time tokens, global locks, leadership election, distributed sessions, cluster state). Coordination of distributed systems leads to boiler plate patterns, and using Spring Cloud developers can quickly stand up services and applications that implement those patterns. They will work well in any distributed environment, including the developer’s own laptop, bare metal data centres, and managed platforms such as Cloud Foundry.
这里面提到几个关键词:
- 分布式系统中的常见模式
- 任何分布式环境
“分布式系统中的常见模式”给了 Spring Cloud 一个清晰的定位,即“模式”。也就是说 Spring Cloud 是针对分布式系统开发所做的通用抽象,是标准模式的实现。
这个定义非常抽象,看完之后并不能知道 Spring Cloud 具体包含什么功能。再来看一下 Spring 官方给出的一个 High Light 的架构图,就可以对这套模式有更清晰的认识:
可以看到这个图中间就是各个Microservice,也就是我们的这个微服务的实现,周边周围的话就是去围绕这个微服务来去做各种辅助的信息事情。例如分布式追踪、服务注册、配置服务等,都绕微服务运行时所依赖的必不可少的的支持性功能。我们可以得出这样一个结论:Spring Cloud 是以微服务为核心的分布式系统的一个构建标准。
Spring Cloud Alibaba
既然说 Spring Cloud 是标准,那么自然少不了针对标准的实现。参与这个标准实现的公司有很多,例如:Google 的 Spring Cloud GCP,Netflix 的 Spring Cloud Netflix,Microsoft 的 Spring Cloud Azure 等等。当然还有我们阿里巴巴的 Spring Cloud Alibaba。
Spring Cloud Alibaba 从 19 年初开始提交代码就获得了业界的广泛关注,从下面这张图中可以看到,在很短的时间之内,Spring Cloud Alibaba 就成为了 Spring Cloud 家族中最受关注的框架:
下面这张图很好的说明了 Spring Cloud Alibaba 的组成以及与 Spring Cloud 的关系:图中深色的部分,其实它就是 Spring Cloud 标准,一共有3层。中间颜色最深的部分就是及整个微服务最核心的内容,包括了“ RPC 调用”以及“服务注册与发现”。第二层,也就是围绕着核心的这一圈,是一些辅助微服务更好的工作功能,包括了负载均衡、路由、网关、断路器,还有分就是追踪等等这些内容。再外层的话,主要是些分布式云环境里通用能力。
最外面这一圈,是 Spring Cloud Alibaba 对 Spring Cloud 的实现。右上部分是对于 Spring Cloud 标准的实现。例如,我们通过 Dubbo 实现了 RPC 调用功能,通过 Nacos 实现了“服务注册与发现”、“分布式配置”,通过 Sentinel 实现了断路器等等,这里就不一一列举了。左下部分是我们 Spring Cloud Alibaba 对阿里云各种服务的集成。可能很多同学会有这样的一个问题:为什么要加上这一部分呢?此时回头审视一下 Spring Cloud ,它仅仅是一个微服务的一个框架。但是在实际生产过程中,单独使用微服务框架其实并不足以支撑我们去构建一个完整的系统。所以这部分是用阿里帮助开发者完成微服务以外的云产品集成的功能。
为什么要分成两个部分呢,这也是为了打消大家对于使用了 Spring Cloud Alibaba 以后就会被平台绑定的担忧。虽然在品牌商都叫做SpringCloudAlibaba,但是在代码上,我们采用了两个独立的项目维护。分别是 Spring Cloud Alibaba 和 Aliyun Spring Boot
目前,Spring Cloud Alibaba 包含如下组件:
开源部分
- Sentinel:把流量作为切入点,从流量控制、熔断降级、系统负载保护等多个维度保护服务的稳定性。
- Nacos:一个更易于构建云原生应用的动态服务发现、配置管理和服务管理平台。
- RocketMQ:一款开源的分布式消息系统,基于高可用分布式集群技术,提供低延时的、高可靠的消息发布与订阅服务。
- Dubbo:Apache Dubbo? 是一款高性能 Java RPC 框架。
- Seata:阿里巴巴开源产品,一个易于使用的高性能微服务分布式事务解决方案。
平台服务部分
- Alibaba Cloud OSS: 阿里云对象存储服务(Object Storage Service,简称 OSS),是阿里云提供的海量、安全、低成本、高可靠的云存储服务。您可以在任何应用、任何时间、任何地点存储和访问任意类型的数据。
- Alibaba Cloud SchedulerX: 阿里中间件团队开发的一款分布式任务调度产品,提供秒级、精准、高可靠、高可用的定时(基于 Cron 表达式)任务调度服务。
- Alibaba Cloud SMS: 覆盖全球的短信服务,友好、高效、智能的互联化通讯能力,帮助企业迅速搭建客户触达通道。
工具篇
Java 工程脚手架
Java 工程脚手架,用于帮助开发者快速生成工程骨架。解决开发者在创建工程时的组件引入、解决版本依赖、基础配置、查询样例代码等繁琐问题。只需要简单的点点鼠标,就可以生成一套标准工程骨架。
脚手架的访问地址是 https://start.aliyun.com/bootstrap.html, 打开后页面见下图:
编译框架、坐标&名称、其他基础信息等,根据实际情况按需填写。当然,很多参数默认值就可以满足大部分需求。开发者重点关注的是下面3个部分:
组件依赖
很少有开发者会使用语言最原始的sdk来实现所有功能。通常来说,大家都会使用各种技术产品的高级封装来实现相关的技术特性。这里就需要做2件事情:引入对应组件的sdk、在应用中配置组件。而通过Java 工程脚手架就可以很轻易的完成这些工作。
Java 工程脚手架中提供了2中寻找组件的方式:根据分类浏览&关键字搜索
这里根据组件分类寻找需要使用的组件:
也可以根据组件的关键字直接使用搜索功能寻找需要使用的组件:
无论通过哪种方式,都可以通过组件右侧的加好实现组件的选择。
应用架构
在生成的工程里,代码需要根据其逻辑职责进行分层,从而获得更好的代码组织与管理效果。在这里提供了3种应用架构供开发者选用。
- None:不做任何代码分层。
- 分层架构:标准的4层架构。分为 WEB层、控制器层、服务层、持久化层。本架构参考了《Java 编码规约》的应用分层章节。
- COLA:领域驱动设计(DDD)的实现框架之一。采用了标准的六边形架构设计,并且辅之以一套灵活的扩展体系,可以有效提升复杂业务系统开发的效率。具体参考COLA 的 GIthub工程
示例代码
我们为组件准备了很多使用方法的参考样例,这样开发者就不需要选择外组件以后,再去别的搜索引擎寻找相关组件的使用方法了。
未选择任何组件时,是不会给出任何示例代码的。示例代码是在选择了组件依赖以后,才会出现于用户选择的组件相关的示例,如下图:
由于很多案例自身也依赖其他组件,所以在选择了某个案例以后,会多出一些案例,同时依赖的组件也会增多。
本次课程使用到的案例,都可以在这里寻找到。
生成代码
仅仅完成项目配置是不够的,最终开发者需要的是项目的代码。so, show me the code
无论是出于查阅组件用法的目的,还是出于需要工程完整代码的目的,脚手架都可以很好的支持:
如果仅仅需要查阅代码,而不是下载完整工程,可以直接通过点击“浏览代码”来实现。点击该按钮以后,会打开一个包含了完整代码树以及允许查看每个文件的内容窗口:
如果需要获取所有代码内容,则可以通过点击“获取代码”来实现:
这里提供了2种获取代码的途径:直接下载代码包 & 通过 git 命令 clone 工程。如果选择使用Git命令来Clone工程,需要注意一下,这个仓库地址只能下载不能上传哦。