Spring Cloud
4.1 Spring Cloud简介
4.1.1 什么是Spring Cloud
Spring Cloud是在Spring Boot的基础上构建的,用于简化分布式系统构建的工具集。该工具集为微服务架构中所涉及的配置管理、服务发现、智能路由、断路器、微代理和控制总线等操作提供了一种简单的开发方式。
- Spring Cloud Netflix:集成了各种OSS组件,其中包括Eureka、Ribbon、Hystrix、Zuul、Feign、Archaius。
- Spring Cloud Config:配置管理工具,支持使用Git存储配置内容,可以使用它实现应用配置的外部化存储,并支持客户端配置信息刷新、加密和解密等配置内容。
- Spring Cloud Starters:Spring Cloud的基础组件,是基于Spring Boot风格项目的基础依赖模块。
Spring Cloud中的子项目还包括Spring Cloud Bus、Spring Cloud Consul和Spring Cloud CLI等,这些项目都有特定的功能。
4.1.2 spring cloud的特点
最大的特点是它的集成性,很多开源产品都集成到自身的框架中,使其越来越强大。
1.使用方便
2.功能齐全
3.易于扩展和维护
4.适用于各种环境
4.1.3 spring cloud的版本
根据英文字母顺序,采用伦敦的地名+版本号的方式来命名的。
4.2 服务发现
在微服务架构中,服务发现可以说是最为核心和基础的模块,该模块主要用于实现各个微服务实例的自动化注册和发现。
4.2.1 eureka介绍
eureka是netflix开发的一个服务发现框架,本身是一个基于REST的服务,主要用于定位运行在AWS(Amazon web services)域中的中间层服务,以达到负载均衡和中间层服务故障转移的目的。spring cloud将其集成在自己的子项目spring cloud netflix中,以实现spring cloud的服务发现功能。
eureka的服务发现包含两大组件:服务端发现组件eureka server和客户端发现组件eureka client。服务端发现组件也被称为服务注册中心,主要提供了服务的注册功能,而客户端发现组件主要用于处理服务的注册和发现。
当客户端服务通过注解等方式嵌入到程序的代码中运行时,客户端发现组件就会向注册中心注册自身提供的服务,并周期性地发送心跳来更新服务(默认时间为30s,如果连续三次心跳都不能够发现服务,eureka就会将这个服务节点从服务注册表中移除)。与此同时,客户端发现组件还会从服务端查询当前注册的服务信息并缓存到本地,即使eureka server出现了问题,客户端组件也可以通过缓存中的信息调用服务节点的服务。各个服务之间会通过注册中心的注册信息以rest的方式来实现调用,并且可以直接通过服务名进行调用。
eureka服务发现机制包含了3个角色:服务注册中心、服务提供者和服务消费者。
服务注册中心即eureka server,服务提供者和消费者是eureka client。服务提供者是指提供服务的应用,可以是spring boot应用,也可以是其他技术平台且遵循eureka通信机制的应用,应用在运行时会自动地将自己的服务注册到eureka server以供其他应用发现。
服务消费者就是需要服务的应用,该服务在运行时会从服务注册中心获取服务列表,然后通过服务列表知道去何处调用其他服务。服务消费者会与服务注册中心保持心跳连接,一旦服务提供者的地址发生变更时,注册中心会通知服务消费者。
eureka服务提供者和服务消费者之间的角色是可以相互转换的,因为一个服务既可以服务消费者,也可以是服务提供者。
4.2.2 如何使用eureka注册服务
1.搭建maven父工程
在eclipse中,创建一个maven父工程,并在工程的pom.xml中添加spring cloud的版本依赖信息。
<denpendencyManagement>
<dependencies>
<denpendency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>Dalston.SR3</version>
<type>pom</type>
<scope>import</scope>
</denpendency>
</dependencies>
</denpendencyManagement>
2.搭建服务端工程
(1)添加依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-eureka-server</artifactId>
</dependency>
(2)编写配置文件
server:
port:8761
(3)修改服务端Java代码
在项目的引导类上添加注解@EnableEurekaServer,该注解用于声明标注类是一个eureka server。(4)启动应用,查看信息。访问地址http://localhost:8761即看到eureka信息面板。
3.搭建客户端工程
(1)添加依赖
(2)编写配置文件
在配置文件中添加eureka服务实例的端口号、服务端地址。
(3)修改客户端Java代码
在项目引导类上添加注解@ EnableEurekaClient,该注解用于声明标注类是一个eureka客户端组件。
(4)启动应用,查看信息。分别启动服务器工程和客户端工程,访问http://localhost:8761在eureka信息面板中看到注册的服务信息。
4.2.3 如何实现服务间的调用
1.搭建订单服务工程
(1)添加依赖
(2)编写配置文件。在配置文件中添加eureka服务实例的端口号、服务端地址等信息
(3)创建订单实体类
(4)创建订单控制器类
(5)在引导类中添加@EnableEurekaClient注解
2.编写用户服务功能
(1)创建spring实例
(2)创建用户控制器类
3.启动服务应用,测试服务调用
4.3 客户端负载均衡
4.3.1 ribbon介绍
ribbon是netflix发布的开源项目,主要功能是提供客户端的软件负载均衡算法,将netflix中间层服务连接在一起。ribbon客户端组件提供一系列完善的配置项,例如连接超时、重试等。
4.3.2 ribbon的使用
只需要在实例化方法resttemplate的方法上添加@LoadBalanced注解,并在其执行方法中使用服务实例的名称即可。
(1)添加@LoadBalanced注解。
(2)使用服务实例名称
(3)创建服务监听类
(4)添加输出语句
(5)启动服务,测试应用
5.1 服务容错保护
5.1.1 spring cloud hystrix介绍
在微服务架构中,通常会存在多个服务层调用的情况,如果基础服务出现故障可能会发生级联传递,导致整个服务链上的服务不可用。
为了解决服务级联失败这种问题,在分布式架构中产生了断路器等一系列服务保护机制。
spring cloud hystrix是基于netflix的开源框架hystrix实现的,该框架的使用目标在于通过控制那些访问远程系统服务和库的节点,从而对延迟和故障提供更强大的容错能力。
5.1.2 spring cloud hystrix的使用
(1)引入依赖
(2)编辑配置文件,添加eureka服务实例的端口号、服务端地址
(3)在工程主类使用@EnableCircuitBreaker注解开启断路器功能
(4)修改用户控制器类
(5)分别启动注册中心、服务提供者、服务消费者
5.1.3 hystrix dashboard
(1)添加依赖
(2)编写配置文件,指定端口号和名称
(3)编写启动类,添加@EnableHystrixDashboard注解开启hystrix仪表板功能
(4)启动工程,访问hystrix.stream
5.2 API网关服务
5.2.1 为什么需要API网关
1.增加开发和维护成本
2.微服务重构困难
3.微服务协议限制
5.2.2 使用zuul构建API网关服务
zuul原是netflix公司开发的基于JVM的路由器和服务器端负载均衡器,后来被加入到spring cloud中。zuul属于边缘服务,可以用来执行认证、动态路由、服务迁移、负载均衡、安全和动态响应处理。
(1)添加依赖
(2)编辑配置文件,端口号、服务端地址
(3)在工程主类中使用@EnableZuulProxy注解开启zuulAPI网关功能。
(4)分别启动注册中心、服务提供者、网关服务后,注册中心显示已注册服务。
5.3 分布式配置管理
5.3.1 springcloud config简介
spring cloud config是spring cloud团队创建的一个全新的项目,该项目主要用来为分布式系统中的外部配置提供服务器和客户端支持。
config server称为分布式配置中心,它是一个独立的微服务应用,主要用于集中管理应用程序各个环境下的配置,默认使用Git存储配置文件内容,也可以使用SVN或本地文件存储。
config client即微服务架构中各个微服务应用,通过指定配置中心来管理应用资源以及与业务相关的配置内容,并在启动时从配置中心获取和加载配置信息。
5.3.2 使用Git存储方式实现配置管理
(1)配置Git,在Git上创建目录,并在目录中增加开发、预发布、和测试的配置文件
(2)修改服务端配置文件,指定Git仓库的网络地址。
(3)修改客户端配置文件,label:master
(4)启动工程,测试应用。