https://seata.apache.org/zh-cn/solution
Spring Cloud 是一系列有序框架的集合,简单易懂、易部署易维护的分布式系统开发工具包。Spring Cloud依赖于SpringBoot,利用
SpringBoot开放的便捷性可以简化分布式系统基础设施的开发。开箱即用,Spring Cloud使用Spring Boot作为基础提供了一套分布式方案,只需少量的代码便可以轻松实现服务中心、负载均衡和熔断等功能。
SpringCloud组成
服务注册与发现:consul 阿里Nacos
服务调用和负载均衡:OpenFeign LoadBalance
分布式事务:阿里Seata
服务熔断和降级:阿里Sentinel Circuit Breaker
服务链路追踪:Micrometer Tracing
服务网关:GateWay
分布式配置管理:consul 阿里Nacos
服务发现与注册
consul 是一套开源的分布式服务发现和配置管理系统,consul默认端口是8005,由GO语言开发,提供了微服务系统中的服务治理,配置中心,控制总线等功能 优点:基于raft协议,比较简洁、支持健康检查,同时支持HTTP和、DNS协议,提供图形化界面
实践:实现2个微服务注册与发现,服务提供者,端口8001: 服务消费者,端口80,注册到consul
服务提供者8001注册进consul
1、maven项目8001服务的pom.xml文件,引入spring-cloud-starter-consul-discovery
2、修改maven项目resources下application.yaml文件
server:
port:8001
spring:
application:
name:cloud-payment-service
cloud:
consul:
host:localhost
port:8500
discovery:
service-name:${spring.application.name}
服务cloud-payment-service以端口8001注册到consul
3、开启服务发现
maven项目main下找到8001服务的主启动类 添加@EnableDiscoveryClient
4、启动8001主启动类
5、检查consul是否注册成功
服务消费者80
1、80服务的pom.xml文件,引入spring-cloud-starter-consul-discovery
2、修改yaml文件
server:
port:80
spring:
application:
name:cloud-consumer-service
cloud:
consul:
host:localhost
port:8500
discovery:
service-name:${spring.application.name}
服务cloud-consumer-service以端口80注册到consul
3、开启服务发现
找到80服务的主启动类 添加@EnableDiscoveryClient
4、修改maven项目下main的ontroller类
原配置:paymentSrv_URL=“http://localhost:8001”
修改为:paymentSrv_URL=paymentSrv_URL=http://cloud-payment-service(服务名)
4、启动80主启动类
5、检查consul是否注册成功
分布式系统全局配置和动态刷新:
业务系统拆分成多个子服务,系统会出现大量的服务,每个服务需要必要的配置信息才能运行,所以集中式、动态配置管理是必不可少的,某些配置文件中的内容大部分都是相同的,只有个别配置项不同,例如数据库配置,每个微服务关于数据库的配置基本相同,当数据库配置修改,要使微服务处处生效
微服务自带一个application.yaml,当上百微服务的时候,管理维护配置文件不太方便
通用全局配置信息,直接注册进Consul服务器,从Consul获取,实现一次修改,全局广播
实践:
1、
修改8001微服务的pom.xml文件,引入spring-cloud-starter-consul-config spring-cloud-starter-bootstap
2、新增bootstap.yaml
application 用户级别的
bootstap.yaml 系统级别,优先级更高
bootstap.yaml 替代application或者两者共存
bootstap.yaml
server:
port:80
spring:
application:
name:cloud-consumer-service
cloud:
consul:
host:localhost
port:8500
discovery:
service-name:${spring.application.name}
config:
profile-separator:'-' 文件分隔符
format: YAML
application.yaml
spring:
…
profiles:
active:dev
配置规则说明
Key Valus配置分布式配置和全局刷新
1、创建config文件夹,以/结尾
2、config文件夹分别创建其他3个文件夹
动态刷新
Maven项目主启动类添加@RefreshScope
@EnableDiscoveryClient
@RefreshScope
阿里云MSE Nacos
https://help.aliyun.com/zh/mse/use-cases/create-a-service-registry-on-mse-for-spring-cloud-applications?spm=a2c4g.11174283.0.0.412e7b26BY8hAO&shareId=aa1fce1325f3814c0fd355c755cbcc1c
负载均衡
Spring Cloud loadBalance是由SpringCloud官方提供的一个开源简单易用的客户端负载均衡
组件:spring-cloud-starter-loadbalancer
loadbalancer工作逻辑:
1、Consul Server从服务端查询并拉取服务列表它有多个服务(上图3个服务),这3个服务实现是完全一样的,默认轮询调用用谁都可以正常执行,
2、按照指定的负载均衡策略从server收到的服务注册列表中由客户端自己选择一个地址
实践:80通过轮询负载访问8001/8002/8003
步骤:
1、将服务提供者8001微服务拷贝2个微服务,新拷贝的微服务注册到consul
2、80微服务修改pom.xml文件新增loadbalancer依赖组件,RestTemplateconfig配置文件增加@loadBalance、修改80微服务controller文件并启动
OpenFeign(服务接口调用):声明式的Web服务客户端,只需要创建一个Rest接口并在该接口上添加注释@FeignClient即可
实际开发中,由于服务依赖调用可能不止一处往往一个接口会被多处调用所以通常都会针对每一个微服务自行封装一些客户端类来包装这些依赖的调用,所以Openfeign在此基础上做了进一步封装
由他来帮助我们定义和实现依赖服务接口的定义在OpenFeign的实现下,我们只需要创建一个接口并使用注解的方式来配置,即可完成对服务提供方的接口绑定,统一对外暴露可以被调用的接口方法,也即由服务提供者给出调用接口清单,消费这直接通过openFeign调用即可
Openfeign同时还集成SpringCloud loadBalance可以使用openfeign试提供http客户端的负载均衡,也可以集成阿里sentinel来提供熔断,降级等功能,与SpringCloud loadBalance不同的是,通过openfeign只需要定义服务绑定接口且声明式的方法,优雅而简单的实现服务调用
实践:
两个微服务通过openfeign调用 80的微服务通过openfeign调用8001微服务
步骤:
1、创建Maven项目微服务80
2、修改pom.xml引入依赖
3、application.yaml注册到微服务
4、主启动
主启动类添加
@Enableopenfeign 激活
创建Maven项目cloud-api-commons openfeign(通用模块)
新建服务接口
@openfeign(“服务提供者的微服务名”)
public interface 接口名 #定义接口
{暴露方法}
修改80微服务controller定义访问openfeign的接口
分布式链路追踪 -micrometer
一次分布式请求还原成调用链路,进行日志记录,性能监控,并将一次分布式请求的调用情况集中展示,比如各个服务节点上的耗时、请求具体到达那台机器上,每个服务节点的请求状态
图形化展示:链路调用追踪的数据发送到zipkin展示
链路追踪原理:一条链路追踪会在每个服务调用的时候加上Trace ID和Span ID,链路通过Trace ID唯一标识,Span标识发起请求信息,各个span通过parent id关联起来(Span表示调用链路来源,可以理解为一次请求信息)
gateway
API网关服务,为微服务架构提供一种简单有效的统一的API路由管理方式
gateway核实组件是一系列的过滤器,通过这些过滤器可以将客户端发送的请求转发到对应的微服务,隐藏微服务的节点ip及端口信息,gateway本身也是一个微服务,需要注册到服务注册中心
三大核心:路由 断言 过滤
路由:由ID 目标URL 一些列断言和过滤器组成,如果断言为true则匹配该路由
断言:匹配HTTP请求中的所有内容(例如请求头或请求参数),如果请求与断言匹配则进行路由
过滤:可以在请求被路由或者之后对请求进行修改
gateway工作流程(图)
请求前的过滤器可以做参数校验,权限校验、流量监控,日志输出、协议转换等
请求后类型过滤器可以做响应内容,响应头修改,日志输出,流量监控等
实践:
1、创建gateway注册到注册中心
2、实现两个微服务80 8001通过gateway隔离
过程:
2、创建gateway的maven项目端口9527
3、改pom.xml引入gateway依赖
4、改application.yaml文件注册到微服务
修改新增网关application.yaml文件
spring:
…
gateway:增加配置
routes:
id:
uri:
predicaes:
5、修改主启动类及主启动
6、gateway是否注册成功
8001微服务前添加gateway–完成
80微服务通过feign接口调用gateway访问8001微服务步骤:
1、修改Feignapi调用接口
2、新建修改80微服务的 controller
3、开启网关验证
4、关闭网关验证
5、修改80项目application.yaml配置文件Feignapi指向网关服务名
gateway网关9527路由以服务名-动态获取URI
修改新增网关application.yaml文件
spring:
…
gateway:
routes:
id:
uri:ib://server (服务名)
predicaes:
断言-predicate
两种配置二选一:sortcuts和fully
配置语法:
predicates:
-After=
-Before
-Between
-cookie
-Header=属性,正则
-Query=
-RemoteAddr=
过滤器语法
分布式事务:一次业务操作需要跨多个数据源或需要跨多个系统进行远程调用,就会产生分布式事务
分布式事务解决方案
2PC(两阶段提交):2PC即两阶段提交协议,是将整个事务流程分为两个阶段,准备阶段(Prepare phase)、提交阶段(commit
phase)
- 准备阶段(Prepare phase):事务管理器给每个参与者发送Prepare消息,每个数据库参与者在本地执行事务,并写本地的Undo/Redo日志,此时事务没有提交。
(Undo日志是记录修改前的数据,用于数据库回滚,Redo日志是记录修改后的数据,用于提交事务后写入数据文件) - 提交阶段(commit phase):如果事务管理器收到了参与者的执行失败或者超时消息时,直接给每个参与者发送回滚(Rollback)消息;否则,发送提交(Commit)消息;参与者根据事务管理器的指令执行提交或者回滚操作,并释放事务处理过程中使用的锁资源
3PC(三阶段提交)
TCC 补偿事务
独立消息服务+消息队列组件,实现最终一致性
Seata(简单扩扩展自治事务框架):官网:https://seata.apache.org/zh-cn/
https://seata.apache.org/zh-cn/docs/overview/what-is-seata
Seata工作流程
XID全局事务唯一标识,它可以在服务调用链路中传递、绑定到服务的事务上下文
TC-TM-RM
TC (Transaction Coordinator) - 事务协调者,
维护全局和分支事务的状态,驱动全局事务提交或回滚。
TM (Transaction Manager) - 事务管理器-- 标注全局@GlobalTransactional启动入口动作微服务模块(例如订单模块),它是事务的发起者,负责定义全局事务范围,并根据TC维护的全局事务和分支事务状态,做出开始事务、提交事务、回滚事务的决议
RM (Resource Manager) - 资源管理器 数据库本身、多个RM负责管理分支事务上的资源、向TC注册分支事务、汇报分支事务状态、驱动分支事务的提交或会滚
三个组件相互独立、TC以Seata服务器(server)形式独立部署、TM、RM以Seata client集成在微服务中运行
TM申请向TC开启一个全局事务、全局事务创建成功并生成一个全局唯一的XID
XID在微服务调用链路上下文传递
RM向TC注册分支事务、将其纳入XID对应全局事务的管辖
TM向TC发起针对XID的全局提交或回滚决议
TC调度XID下管辖的全部分支事务完成提交或回滚请求
使用:
本地@Transactional
全局@GlobalTransactional
MSE
https://help.aliyun.com/document_detail/404845.html