使用Spring Cloud需要了解一些概念

时间:2024-07-22 12:36:50

Spring Cloud是一个基于Spring Boot实现的微服务架构开发工具,它为基于JVM的微服务开发中的配置管理、服务发现、断路器、智能路由、微代理、控制总线、全局锁、决策竞选、分布式会话和集群状态管理等操作提供了一站式的开发框架。而上文提到的微服务架构就是将一个完整的应用从数据存储开始垂直拆分成多个不同的服务,每个服务都能独立部署、独立维护、独立扩展,服务与服务间通过RESTful API方式进行通信。

一次典型的对基于Spring Cloud架构的访问如下

#1 client请求通过统一的API智能路由网关Zuul来访问内部服务,这样客户端就不用知道服务端的详细地址或者相关信息,仅仅通过API gateway就可以访问后端服务,同时zuul可以对请求进行鉴权或者验证。

#2 智能路由网关Zuul接收到请求后,从服务注册发现中心Eureka获取可用服务的host列表,通过负载均衡算法计算后获取服务实例的host并转发请求;这样内部服务于外部调用方,或者内部服务之间的依赖耦合转变成了对Eureka的依赖。

#3 获取到指定类型的服务后由客户端负载均衡器Ribbon统一分发到后端service具体实例。

#4 后端独立的service之间通过Feign进行通信处理业务信息。
#5 断路由Hystrix负责处理服务超时熔断,从而避免因为服务提供者不可用导致的服务消费者不可用的雪崩效应。
#6 集群监控Turbine用于监控服务间的调用和熔断相关指标。

使用Spring Cloud需要了解一些概念

使用Spring Boot快速构建spring app
随着spring整合套件的增多,配置文件也越来越多,spring boot用于简化冗余的配置文件,基于约定和包路径自动进行配置;spring-boot-starter-parent表示引用父项目模板中的缺省依赖和默认配置(比如src/main/resources/application.properties为spring boot项目的缺省配置文件);spring-boot-starter-web表示引入spring web全栈模块,包含spring MVC和Tomcat;spring-boot-maven-plugin表示可以直接通过mvc命令控制spring boot的启停。
@RestController:于sprint 4.0引入,是@Controller和@ResponseBody的集合,表示定义支持REST接口的控制器。
@EnableAutoConfiguration:启用基于约定和包路径的自动配置
@SpringBootApplication:基于spring boot的全家桶配置

使用spring cloud eureka进行服务注册和发现管理
随着系统内服务的增加,维护服务实例的访问host:port成为一件非常费时费力的事情,各种服务的host:port可能随时变化,而这类变化需要实时被记录下来,否则可能导致服务不可用;eureka就是用于充当service provider和service client之间的一个呼叫中心,提供服务注册和服务发现功能,让provider和client完全解耦独立,不互相依赖。
@EnableEurakaServer:创建并启动一个服务注册中心。
@EnableDiscoveryClient:将当前app注册成为eureka的客户端应用(自身成为eureka管理的一个服务提供方)并具有发现其他服务的能力。
RestTemplate.getForEntity("http://HELLO-SERVICE/hello", String.class).getBody():生成GET请求(也提供了postForEntity, put, delete请求的封装),eureka会返回一个Map包含hello-service和服务实例的地址列表,然后通过使用RestTemplate调用指定的服务HELLO-SERVICE/hello,spring cloud会将服务名字转换成对应的服务实例地址,string.class表示返回结果的数据类型;

使用spring cloud ribbon实现客户端负载均衡
通常所说的负载均衡一般指的是服务端负载均衡(硬件如F5,软件如Nginx),作用于服务端,将来自客户端的请求按一定策略分配给内部的服务实例;而客户端负载均衡则是作用于客户端,每一个客户端都可以从注册中心获取一份可用服务实例的清单,通过客户端的负载均衡实现对系统的高可用、网络压力的缓解和处理能力的扩容。
通过spring cloud的封装可以将面向服务的REST模板请求自动封装成客户端负载均衡的服务调用;由于spring cloud内部基本都是基于REST的通信,而服务方基本都可以做集群部署,因此ribbon是作为一个工具框架应用于大部分spring cloud的服务中。
@LoadBalanced:使用LoadBalancerInterceptor对Http请求进行客户端的负载均衡,所有通过restTemplate进行的请求都会被其拦截并动态分配服务实例 。

使用spring cloud hystrix 实现服务容错保护
微服务架构中server之间可能存在相互调用的依赖,服务A需要调用服务B,同时服务A也为服务C提供服务;如果因为某些网络故障导致服务A队服务B的调用不可达,最终导致服务A也不可用,这样的情况称为服务故障雪崩,spring cloud Hystrix通过引入断路由的故障监控,在服务不可用并且满足某些条件的前提下,向服务调用方返回一个错误响应,而不是一味地等待。
@EnableCircuitBreaker:标注于服务调用方的启动类,表示开启断路由功能
@HystrixCommand(fallbackMethod=”failCallBackFunc”):标注于服务提供方的目标方法上,表示如果目标方法调用超时或者失败的话,返回名字为failCallBackFunc的资源方法。

使用spring cloud feign整合ribbon和hystrix的功能进行声明式服务调用
一般应用中使用spring cloud ribbon和spring cloud hystrix都是同时出现,为了简化配置流程,使用feign统一配置客户端负载均衡和微服务容错保护。
@FeignClient(“target-service”):标注于目标服务的资源类,绑定服务名并指定@RequestMapping资源,
@EnableFeignClients:标注于服务调用方的启动类,然后通过@Controller就可以直接访问对应的资源,并且拥有负载均衡和服务容错保护功能。

使用spring cloud zuul实现对外API网关服务
外部请求访问内部服务的时候往往需要通过F5或者Nginx进行路由和负载均衡,最终发送到对应的服务实例上,运维人员需要手动维护路由规则、负载均衡规则和服务实例的地址,随着内部复杂性的增加,需要一个类似façade的服务对外部请求进行统一处理。Zuul不仅可以实现路由和负载均衡(自动集成了ribbon和hystrix),还可以通过添加过滤器的方式实现用户登录验证和访问鉴权的功能。
@EnableZuulProxy:开启zuul的API网关服务功能,并通过在application.properties中添加路由规则的配置就可以实现转发功能:
zuul.routes.api-a-url.path=/api-a-url/**
zuul.routes.api-a-url.url=http://localhost:8081/
但是还是推荐使用与eureka结合使用service id的方式,所有来自外部的请求首先会到达zuul实现的API网关服务器集群,然后根据路由规则找到request对应的serviceId,接着根据eureka注册中心获取serviceId和host:port list的mapping,并且自动实现负载均衡和断路由,最终将请求送到微服务的实例上。
zuul.routes.api-b-url.path=/api-b-url/**
zuul.routes.api-b-url.serviceId=helo-service
在zuul API网关上通过继承ZuulFilter并实现抽象方法来实现拦截器的定义:
public String filterType():表示过滤器在请求的那个生命阶段执行,pre类型实现请求鉴权和路由映射,routing类型实现请求转发到具体的实例,post类型处理请求返回的结果,error类型处理蒸锅过程里的异常错误。
public int filterOrder():当一个生命阶段有多个过滤器的时候需要决定执行的先后顺序
public boolean shouldFilter():当前的过滤器是否需要生效
public Object run():具体过滤的操作逻辑

使用spring cloud config实现集中式的外部配置支持
随着spring cloud集群的增大,各项配置也需要统一进行管理和统一配置,spring cloud config可以实现通过一个作为微服务的实例统一从GIT仓库获取配置文件。
@EnableConfigServer:标注微服务实例的启动类,并且在appication.properties中配置GIT的访问URL,路径分支,用户名,密码,文件版本等。