基于Spring Boot和Spring Cloud微服务架构的分布式系统开发

摘要

随着社会的发展,IT公司开发系统的业务需求呈级数倍增加,如果继续使用传统的SSH,SSM等市场上常用的开发框架,将给系统设计人员,开发人员包括后期维护人员带来前所未有的麻烦。随着Spring4.0的发布,伴随着Spring Boot的诞生,而这一技术的诞生也颠覆了传统JavaEE的开发。由于Spring Boot自带了spring-boot-starter-web,spring-boot-starter-jdbc,spring-boot-starter-actuator等子项目,它使得编码,配置,部署和监控等方面都变得简单,相比传统框架的开发,使用Spring Boot将大大节省开发成本,而且也大大提升了系统的性能。但Spring Boot微框架面对呈级数倍增长的业务需求,也显得力不从心,这就需要对传统的单体系统进行拆分,而Spring Cloud作为一个解决微服务架构实施的综合性分布式解决框架,恰恰可以解决这一难题,它将单体系统根据不同的模块拆分成不同的服务,并将不同的服务部署在不同的进程中,这使得不同服务之间的运行和更新互不影响,如果系统产生了新的需求,也只需要增加新的服务即可。总而言之,在现在的企业系统开发中,采用基于Spring Boot和Spring Cloud微服务架构的分布式系统开发是一个很不错的选择,具有很好的参考意义。

引言

在传统的企业系统架构中,我们针对一个复杂的业务需求通常使用对象或业务类型来构建一个单体项目。但是随着企业的发展,系统为了应对不同的业务需求会不断为该单体项目增加不同的业务模块,不断扩大的需求会使得单体应用变得越来越臃肿。单体应用的问题就逐渐凸显出来,由于单体系统部署在一个进程内,往往我们修改了一个很小的功能,为了部署上线会影响其他功能的运行。而且单体应用中各功能模块的并发量、消耗的资源类型都各不相同,对于资源的利用又互相影响,所以单体系统在初期虽然可以非常方便地进行开发和使用,但是随着系统开发,维护成本会变得越来越大,且难以控制。为了解决单体系统臃肿之后难以维护的问题,微服务架构应用而生。
微服务架构是将系统的不同功能模块拆分成不同的服务,而每个服务都运行在自己的进程内,这样每个服务的更新都不会影响其他服务的运行。而在市场上各种微服务架构中,阿里巴巴的Dubbo,百度的Disconf,Twitter的Zipkin等等只解决了微服务中的某一个问题,而Spring Cloud则是一个解决微服务架构实施的综合性解决框架,这也是我们选择Spring Cloud作为微服务架构的原因。

一、Spring Boot与Spring Cloud概述

1.1 Spring Boot简介
Spring Boot是2013年由Pivotal团队提供的全新项目,其设计目的是用来简化Spring框架的搭建、配置、开发、调试以及部署过程。该框架仅需在特定的文件如Maven、Gradle配置文件添加少量配置信息进行配置,从而使开发人员不再需要像传统的Spring框架,自行编写XML文件,并在Maven、Gradle添加相应的框架依赖Jar包。Spring Boot对目前主流的基础框架几乎都做了集成如日志框架,持久化框架,JMS框架,缓存框架,此外Spring Boot提供运行时的应用监控,极大提高了开发和部署的效率。
1.2 Spring Boot主要功能特性
1.2.1 SpringApplication类
SpringApplication类是启动Spring Boot应用的入口类,提供了一种从main()方法启动Spring应用的便捷方式。通过调用SpringApplication.run这个静态方法启动应用本身。
1.2.2 外化配置
在Spring Boot中,允许不同环境配置不同的参数,这些参数可以写入到properties文件,也可以使用YAML配置文件来记录。配置文件中参数可以系统环境变量、命令行参数等外部环境。
1.2.3 日志
Spring Boot使用Commons Logging作为内部记录日志,你也可以使用Java Util Logging,Log4J,Log4J2和Logback来记录日志。默认情况下,如果你使用了Starter POMs,则会使用Logback来记录日志。默认情况,是输INFO类型的日志,你可以通过设置命令行参数–debug来设置:$java -jar myapp.jar -debug。
1.2.4 Profiles
Spring Boot允许使用@Profile注解标注当前应用的环境,也可以通过@Profile来限制某些配置类的加载。同时可以使用spring.profile.active变量来定义应用**的profile。
1.3 Spring Cloud简介
Spring Cloud是一个基于Spring Boot实现的微服务架构开发工具。它为微服务架构中涉及的配置管理、服务治理、断路器、智能路由、微代理、控制总线、全局锁、决策竞选、分布式会话和集群状态管理等操作提供了一种简单的开发方式。
Spring Cloud包含了多个子项目(针对分布式系统涉及的多个不同开源产品,还可能会新增),如下所述:
• Spring Cloud Config:配置管理工具,支持使用Git存储配置内容,可以使用它实现应用配置的外部化存储,并支持客户端配置信息刷新、加密/解密配置内容等。
• Spring Cloud Netflix:核心组件,对多个Netflix OSS开源套件进行整合。
• Feign:基于Ribbon和Hystrix的声明式服务调用组件。
• Eureka:服务治理组件,包括服务注册中心、服务注册与发现机制的实现。
• Zuul:网关组件,提供智能路由、访问过滤等功能。
• Archaius:外部化配置组件。
• Ribbon:客户端负载均衡的服务调用组件。
• Hystrix:容错管理组件,实现断路器模式,帮助服务依赖中出现的延迟和为故障提供强大的容错能力。
• Spring Cloud Sleuth:Spring Cloud应用的分布式跟踪实现,可以完美整合Zipkin。
• Spring Cloud ZooKeeper:基于ZooKeeper的服务发现与配置管理组件。
• Spring Cloud Starters:Spring Cloud的基础组件,它是基于Spring Boot风格项目的基础依赖模块。
• Spring Cloud Bus:事件、消息总线,用于传播集群中的状态变化或事件,以触发后续的处理,比如用来动态刷新新配置等。
• Spring Cloud Cluster:针对Zookeeper、Redis、Hazelcast、Consul的选举算法和通用状态模式的实现。
• Spring Cloud AWS:用于简化整合Amazon Web Service的组件。
• Spring Cloud Security:安全工具包,提供在Zuul代理中对OAuth2客户端请求的中继器。
• Spring Cloud Cloudfoundry:与Pivotal Cloudfoundry 的整合支持。
• Spring Cloud Consul:服务发现与配置管理工具。
• Spring Cloud Stream:通过Redis、Rabbit或者Kafka实现的消费微服务,可以通过简单的声明式模型来发送和接收消息。
• Spring Cloud CLI:用于在Groovy中快速创建Spring Cloud应用的Spring Boot CLI插件。
• ……

二、SpringCloud微服务架构的分布式系统搭建

2.1微服务架构的九大特性
2.1.1 服务组件化
2.1.2 按业务组织团队
2.1.3 做“产品”的态度
2.1.4 智能端点与哑管道
2.1.5 去中心化治理
2.1.6 去中心化管理数据
2.1.7 基础设施自动化
2.1.8 容错设计
2.1.9 演进式设计
2.2 Spring Boot微服务构建
2.2.1 环境准备
Java版本:1.8.0_101
IDE:Spring Tool Suite 3.9.3.RELEASE
Maven版本:apache-maven-3.3.9
2.2.2 Spring Boot搭建
①STS集成配置maven,配置含有本地仓库、*仓库和远程仓库的settings.xml
②打开STS->新建Spring Starter Project->填写Project Metadata信息->添加相关的starter集成依赖->在Controller中编写RESTful API接口->编写SpringApplication类启动Spring Boot项目->打开浏览器访问刚才的RESTful API接口->成功访问即可证明测试成功->Spring Boot快速搭建成功
③分层次开发Spring Boot项目
基于Spring Boot和Spring Cloud微服务架构的分布式系统开发
2.3 Spring Cloud微服务架构构建
2.3.1 Spring Cloud Eureka服务治理
• 搭建服务注册中心
• 注册服务提供者
• 高可用注册中心
• 服务发现与消费
基于Spring Boot和Spring Cloud微服务架构的分布式系统开发
2.3.2 Spring Cloud Hystrix服务容错保护
• hystrix工作流程
基于Spring Boot和Spring Cloud微服务架构的分布式系统开发
基于Spring Boot和Spring Cloud微服务架构的分布式系统开发
• hystrix集成
基于Spring Boot和Spring Cloud微服务架构的分布式系统开发
2.3.3 Spring Cloud Zuul API网关服务
• 动态路由
• 动态过滤器
基于Spring Boot和Spring Cloud微服务架构的分布式系统开发
2.3.4 Spring Cloud Ribbon客户端负载均衡
• 客户端负载均衡
基于Spring Boot和Spring Cloud微服务架构的分布式系统开发
• RestTemplate详解
• doExecute方法
基于Spring Boot和Spring Cloud微服务架构的分布式系统开发
• RestTemplate内部方法
基于Spring Boot和Spring Cloud微服务架构的分布式系统开发
2.3.5 Spring Cloud Zipkin分布式链路调用监控系统
• 调用链路
基于Spring Boot和Spring Cloud微服务架构的分布式系统开发
• 通过web UI查看延迟高的服务
基于Spring Boot和Spring Cloud微服务架构的分布式系统开发
2.3.6 Spring Cloud Feign声明式服务调用
• application.properties配置
基于Spring Boot和Spring Cloud微服务架构的分布式系统开发
• Ribbon配置

• Hystrix配置
2.3.7 Spring Cloud Config分布式配置中心
• 服务端详解
基于Spring Boot和Spring Cloud微服务架构的分布式系统开发
• 客户端详解
2.3.8 Spring Cloud Bus消息总线
• 原理分析
基于Spring Boot和Spring Cloud微服务架构的分布式系统开发
• RabbitMQ实现消息总线
基于Spring Boot和Spring Cloud微服务架构的分布式系统开发

2.3.9 Spring Cloud Stream消息驱动的微服务
• 绑定器
• 发布-订阅模式
• 消费组
• 消息分区
2.3.10 Spring Cloud Sleuth分布式服务跟踪
• 跟踪原理
①为了实现请求跟踪,当请求发送到分布式系统的入口端口时,只需要服务跟踪框架为该请求创建一个唯一的跟踪标识,同时在分布式系统内部流转的时候,框架始终保持传递该唯一标识,直到返回给请求方为止,这个唯一标识就是前文中提到的Trace ID。通过Trace ID的记录,我们就能将所有请求过程的日志关联起来。
②为了统计各处理单元的时间延迟,当请求到达各个服务组件时,或是处理逻辑到达某个状态时,也通过一个唯一标识来标记它的开始、具体过程以及结束,该标识就是Span ID。对于每个Span来说,它必须有开始和结束两个节点,通过记录开始Span和结束Span的时间戳,就能统计出该Span的时间延迟,除了时间戳记录之外,它还可以包含一些其他元数据,比如事件名称、请求信息等。
• 与Zipkin整合(主要有如下三部分)
• microservice-zipkin-server:负责数据收集以及信息展示功能;
• microservice-zipkin-server具体实现
基于Spring Boot和Spring Cloud微服务架构的分布式系统开发
• microservice-zipkin-client-backend:负责微服务的生产者;
• microservice-zipkin-client:负责微服务的调用。
• zipkin-client-backend和zipkin-client具体实现
基于Spring Boot和Spring Cloud微服务架构的分布式系统开发

三、结论

Spring Boot对于Spring平台无疑是巨大的提升,无论在开发阶段还是部署测试阶段,甚至系统在线运行阶段,Spring Boot都在发挥着它的作用,使web系统开发在多方面整体提升。而采用基于Spring Boot的Spring Cloud微服务架构设计的分布式系统,则是目前解决单体系统臃肿和设计微服务架构最好的综合性解决框架。所以基于Spring Boot和Spring Cloud的微服务架构的分布式系统将给架构师一个很好的参考。