微服务架构基础(Spring Boot+Spring Cloud+Docker)
上QQ阅读APP看书,第一时间看更新

1.3 如何构建微服务架构

了解了微服务架构的概念、优点与不足后,相信很多人对微服务架构都会产生这样一些疑问,例如我要何时使用微服务架构?又如何将应用程序分解为微服务?分解后,要如何去搭建微服务架构?同时,在微服务架构中,因为会涉及多个组件,那么这些组件又可以使用什么技术来实现呢?接下来的几个小节中,我们将对这些问题进行详细地讲解。

1.3.1 微服务的拆分

对于一般的公司而言,实践微服务有非常大的技术挑战,所以并不是所有的公司都适合将单体架构拆分成微服务架构。一般来说,微服务架构比较适合未来有一定的扩展复杂度,且有很大用户增量预期的应用,例如一些新兴的互联网公司应用。这些公司在创业初期,不可能买大量的或很贵的机器,但是又必须考虑应对成功后巨量的用户问题,这时微服务架构就成了最好的选择。除此之外,对于那些项目规模较大、业务复杂度较高,且需要长期跟进的项目,也适合考虑使用微服务架构。

在决定使用微服务架构后,所面临的另一个问题就是如何将系统拆分为微服务。对于微服务的拆分,可以参考如下几点建议。

·通过业务功能分解并定义与业务功能相对应的服务。

·将域驱动设计分解为多个子域。

·按照动词或用例分解,并定义负责特定操作的服务,例如一个负责完成订单的航运服务。

·通过定义一个对给定类型的实体或资源的所有操作负责的服务来分解名词或资源,例如一个负责管理用户账户的账户服务。

由于每个公司项目的实际情况不同,所以微服务的拆分在实际操作时,会涉及到很多不同的细节问题,这里就不一一描述了,但总体来说,项目在拆分时按照上述几点建议即可。

1.3.2 微服务架构的组件

在正式学习如何搭建微服务架构之前,我们先来了解一下微服务架构中涉及的一些常见组件名称及其作用。

·服务注册中心:注册系统中所有服务的地方。

·服务注册:服务提供方将自己调用地址注册到服务注册中心,让服务调用方能够方便地找到自己。

·服务发现:服务调用方从服务注册中心找到自己需要调用服务的地址。

·负载均衡:服务提供方一般以多实例的形式提供服务,使用负载均衡能够让服务调用方连接到合适的服务节点。

·服务容错:通过断路器(也称熔断器)等一系列的服务保护机制,保证服务调用者在调用异常服务时快速地返回结果,避免大量的同步等待。

·服务网关:也称为API网关,是服务调用的唯一入口,可以在这个组件中实现用户鉴权、动态路由、灰度发布、负载限流等功能。

·分布式配置中心:将本地化的配置信息(properties、yml、yaml 等)注册到配置中心,实现程序包在开发、测试、生产环境的无差别性,方便程序包的迁移。

除此之外,读者在学习时,可能还会在一些参考资料中看到服务的健康检查、日志处理等组件内容。由于使用上面所描述的组件即可实现微服务架构的快速入门,所以本书中并未对这些额外的组件进行讲解,有兴趣的读者可自行学习。

1.3.3 微服务架构的搭建

通过前两个小节的学习,我们已经了解了如何将传统业务拆分为微服务,并熟悉了微服务架构中所涉及的组件。为了使读者在整体上对微服务架构有一个认识,下面我们通过一张图来讲解如何搭建一个微服务架构,如图1-5所示。

图1-5 如何搭建微服务架构

在图1-5中,部署了一系列的微服务,每个微服务都会访问自己的数据库(Database)。当这些微服务启动时,会将其信息注册到服务注册中心(Service Registry),在客户端发送请求时,请求首先会被API网关(API GateWay)拦截,API网关会读取请求数据,并从注册中心获取对应的服务信息,然后API网关会根据服务信息调用所需的微服务。

小提示

图 1-5 中展示的只是一个简单的微服务架构,然而要判断一个架构是否是微服务架构,还需要满足以下几点要求。

·根据业务模块划分服务种类。

·每个服务可独立部署且相互隔离。

·通过轻量级API调用服务。

·服务需保证良好的高可用性。

只有满足以上几点要求的架构,才能称之为微服务架构,所以在搭建微服务架构时,一定要注意这些问题。

1.3.4 微服务架构的技术选型

在微服务架构中,不同的组件(包括微服务实例、注册中心和API网关等组件)需要根据不同的情况来选取相应的技术,那么我们可以使用哪些技术呢?本小节将对微服务架构中各个组件可使用的技术,以及本书所选用的技术进行简单介绍。

1.微服务实例的开发

微服务的开发可以选用的框架技术有 Spring 团队的 Spring Boot、Jboss 公司的 WildFly Swarm和Java EE官方的微服务框架KumuluzEE等。

2.服务的注册与发现

架构中服务的注册与发现功能,可以使用的技术有 Spring Cloud Eureka、Apache Zookeeper、Consul、Etcd和Dubbo等,它们都是用于服务注册和发现的技术。

3.负载均衡

负载均衡可以使用的技术有Spring Cloud Ribbon和Dubbo等。

4.服务容错

服务容错的技术可以选用Hystrix,在Spring Cloud的子项目中包含Spring Cloud Hystrix。

5.API网关

架构中的API网关服务,可以使用的技术有Spring Cloud Zuul、Spring Reactor、Netty或NodeJS等。

6.分布式配置中心

分布式配置中心可以使用Spring Cloud Config。

7.调试

微服务应用的测试工作可以使用Swagger。Swagger是当前最受欢迎的REST API文档生成工具之一,它提供了强大的页面测试功能来调试每个RESTful API。

8.部署

微服务的官方文档中推荐使用Docker来打包和部署微服务。由于Docker是一个开源的应用容器引擎,具有可移植性强、启动速度快等特点,所以适合跑一些轻量的应用。

9.持续集成

为了实现服务的自动化部署,我们可以通过 Jenkins 搭建自动化部署系统,并使用 Docker进行容器化封装。

在上面的技术选型中,从微服务注册与发现、负载均衡、容错、API网关和分布式配置中心组件的可选技术内,我们都看到了Spring Cloud的身影。实际上,Spring Cloud的子项目中,已经提供了构建微服务所需的所有解决方案。

为了方便读者学习,并能快速地掌握微服务架构的使用,本书将使用 Spring Boot+Spring Cloud+Docker技术来实现微服务架构。书中的主要技术选型如图1-6所示。

图1-6 微服务架构的主要技术选型

从图1-6中可以看出,我们会使用Spring Boot实现微服务实例的开发,使用Spring Cloud Eureka来实现服务的注册与发现,使用Spring Cloud Hystrix的断路器功能来实现服务容错,使用Spring Cloud Ribbon实现服务间的负载均衡,使用Spring Cloud Zuul实现服务网关,使用Spring Cloud Config作为分布式配置中心,使用Swagger对微服务进行测试,并使用Jenkins的持续集成功能来实现自动化部署。

微服务架构中各个组件的技术选型有很多,对于已经实施过微服务并且项目自成体系的公司来说,Spring Cloud可能并没有太大的吸引力,但对于还未实施微服务或项目没有自成体系的公司来说,Spring Cloud将是一个非常好的选择。

小提示

除了Spring Cloud之外,Dubbo也是目前国内比较流行的分布式服务框架,它们都具备分布式服务治理相关的功能,都能够提供服务注册、发现、路由和负载均衡的能力。相比之下,Spring Cloud提供了更加完整的一套企业级分布式云应用的解决方案,包含了微服务组件中的方方面面,并能够结合Spring Boot、Docker实现快速开发的目的,而Dubbo只有Spring Cloud的一部分功能。由于二者具体的实现方式不同,因此并没有好坏之分。企业在选用时,需根据自身情况选择。

需要注意的是,本书中只是针对Java中微服务技术进行的选型,其他开发语言也有着自己的微服务技术栈,在选用时,同样需要依据实际情况慎重考虑。