Spring Cloud Alibaba快速上手
1、简单了解 SpringCloud
官网地址:https://spring.io/projects/spring-cloud
spring-cloud-alibaba:(基于2.2.7.RELEASE )
https://spring-cloud-alibaba-group.github.io/github-pages/hoxton/en-us/index.html
1.1 概述:
Spring Cloud 为开发者提供了工具来快速构建分布式系统中的一些常见模式(例如配置管理、服务发现、断路器、智能路由、微代理、控制总线、一次性令牌、全局锁、领导选举、分布式会话,集群状态)。
分布式系统的协调导致了样板模式,使用 Spring Cloud 开发人员可以快速建立实现这些模式的服务和应用程序。它们在任何分布式环境中都能很好地工作,包括开发人员自己的笔记本电脑、裸机数据中心以及 Cloud Foundry 等托管平台。
1.2 特征
Spring Cloud 专注于为典型用例提供良好的开箱即用体验,并提供可扩展机制以覆盖其他用例。
- 分布式/版本化配置
- 服务注册和发现
- 路由
- 服务到服务调用
- 负载均衡
- 断路器
- 全局锁
- leader选举和集群状态
- 分布式消息传递
如果您想要将 Spring Cloud 添加到该应用程序的现有 Spring Boot 应用程序,则第一步是确定您应该使用的 Spring Cloud 版本。您在应用程序中使用的版本取决于您使用的 Spring Boot 版本。
SpringCloud 与 Spring Boot 兼容性(版本对应关系)
Spring Cloud 发行版本 | Spring Boot 版本 |
---|---|
2021.0.x aka Jubilee | 2.6.x |
2020.0.x aka Ilford | 2.4.x, 2.5.x (Starting with 2020.0.3) |
Hoxton | 2.2.x, 2.3.x (Starting with SR5) |
Greenwich | 2.1.x |
Finchley | 2.0.x |
Edgware | 1.5.x |
Dalston | 1.5.x |
Spring Cloud Dalston, Edgware, Finchley, and Greenwich 都已达到生命周期结束状态,不再受支持.
spring-cloud==> Hoxton.SR5
spring-cloud-alibaba==> 2.2.7.RELEASE
spring-boot ==> 2.2.10.RELEASE
1.3 引入依赖
1.3.1 以maven的方式
1 |
|
如果我们使用的是maven版本,我们可以在父项目里面使用management 并把这个依赖放进去,这样我们可以管理版本spring-cloud相关依赖项(重点是版本控制)
1.3.2 以gradle的方式
1 |
|
2.关于Spring Cloud Alibaba
2.1概念与特性
Spring Cloud Alibaba 提供分布式应用开发的一站式解决方案。它包含开发分布式应用程序所需的所有组件,使您可以轻松地使用 Spring Cloud 开发应用程序。
使用 Spring Cloud Alibaba,您只需要添加一些注解和少量配置,即可将 Spring Cloud 应用连接到阿里巴巴的分布式解决方案,并通过阿里巴巴中间件构建分布式应用系统。
- 流量控制和服务降级:支持WebServlet、WebFlux、OpenFeign、RestTemplate、Dubbo接入限流降级功能。可以在运行时通过控制台实时修改限流和降流规则,还支持对限流和降流Metrics的监控。
- 服务注册和发现:可以注册服务,客户端可以使用 Spring 管理的 bean,自动集成 Ribbon 发现实例。
- 分布式配置:支持分布式系统的外部化配置,配置变化时自动刷新。
- Rpc Service:扩展 Spring Cloud 客户端 RestTemplate 和 OpenFeign 以支持调用 Dubbo RPC 服务。
- 事件驱动:支持构建与共享消息系统连接的高度可扩展的事件驱动微服务。
- 分布式事务:支持高性能、易用的分布式事务解决方案。
- 阿里云对象存储:海量、安全、低成本、高可靠的云存储服务。支持随时随地在任何应用程序中存储和访问任何类型的数据。
- 阿里云SchedulerX:精准、高可靠、高可用的定时作业调度服务,响应时间秒级。
- 阿里云短信:覆盖全球的短信服务,阿里短信提供便捷、高效、智能的通信能力,帮助企业快速联系客户。
2.2 父依赖:
最简单的入门方法是包含 Spring Cloud BOM,然后添加spring-cloud-alibaba-dependencies到应用程序的类路径中。如果您不想包含所有 Spring Cloud Alibaba 功能,您可以为您想要的功能添加单独的启动器。
1 |
|
父项目主要依赖:
1 |
|
其他依赖
1 |
|
2.3 相关端口
1 |
|
2.4 Nacos (服务注册与发现 )
快速下载地址:https://sourceforge.net/mirror/nacos/activity/
控制台网址 :http://ip:8848/nacos 账号 :nacos 密码:nacos
服务注册/服务发现 核心依赖:
1 |
|
核心注解:
@EnableDiscoveryClient
2.5 Sentinel (哨兵:流量控制、流量路由、熔断降级)
快速下载地址:https://sourceforge.net/projects/sentinel.mirror/
Sentinel 的主要特性:
Sentinel 分为两个部分:
- 核心库(Java 客户端)不依赖任何框架/库,能够运行于所有 Java 运行时环境,同时对 Dubbo / Spring Cloud 等框架也有较好的支持。
- 控制台(Dashboard)基于 Spring Boot 开发,打包后可以直接运行,不需要额外的 Tomcat 等应用容器。
Sentinel 社区官方网站:https://sentinelguard.io/
@SentinelResource 注解
注意:注解方式埋点不支持 private 方法。
@SentinelResource 用于定义资源,并提供可选的异常处理和 fallback 配置项。
@SentinelResource 注解包含以下属性:
value:资源名称,必需项(不能为空)
entryType:entry 类型,可选项(默认为 EntryType.OUT)
blockHandler / blockHandlerClass: blockHandler 对应处理 BlockException 的函数名称,可选项。blockHandler 函数访问范围需要是 public,返回类型需要与原方法相匹配,参数类型需要和原方法相匹配并且最后加一个额外的参数,类型为 BlockException。blockHandler 函数默认需要和原方法在同一个类中。若希望使用其他类的函数,则可以指定 blockHandlerClass 为对应的类的 Class 对象,注意对应的函数必需为 static 函数,否则无法解析。
fallback / fallbackClass
fallback 函数名称,可选项,用于在抛出异常的时候提供 fallback 处理逻辑。fallback 函数可以针对所有类型的异常(除了 exceptionsToIgnore 里面排除掉的异常类型)进行处理。fallback 函数签名和位置要求:
- 返回值类型必须与原函数返回值类型一致;
- 方法参数列表需要和原函数一致,或者可以额外多一个 Throwable 类型的参数用于接收对应的异常。
- fallback 函数默认需要和原方法在同一个类中。若希望使用其他类的函数,则可以指定 fallbackClass 为对应的类的 Class 对象,注意对应的函数必需为 static 函数,否则无法解析。
defaultFallback
since 1.6.0:默认的 fallback 函数名称,可选项,通常用于通用的 fallback 逻辑(即可以用于很多服务或方法)。默认 fallback 函数可以针对所有类型的异常(除了 exceptionsToIgnore 里面排除掉的异常类型)进行处理。若同时配置了 fallback 和 defaultFallback,则只有 fallback 会生效。defaultFallback 函数签名要求:
- 返回值类型必须与原函数返回值类型一致;
- 方法参数列表需要为空,或者可以额外多一个 Throwable 类型的参数用于接收对应的异常。
- defaultFallback 函数默认需要和原方法在同一个类中。若希望使用其他类的函数,则可以指定 fallbackClass 为对应的类的 Class 对象,注意对应的函数必需为 static 函数,否则无法解析。
exceptionsToIgnore(since 1.6.0):用于指定哪些异常被排除掉,不会计入异常统计中,也不会进入 fallback 逻辑中,而是会原样抛出。
核心依赖
1 |
|
服务限流
概述
流量控制(flow control),其原理是监控应用流量的 QPS 或并发线程数等指标,当达到指定的阈值时对流量进行控制,以避免被瞬时的流量高峰冲垮,从而保障应用的高可用性。
同一个资源可以创建多条限流规则。FlowSlot 会对该资源的所有限流规则依次遍历,直到有规则触发限流或者所有规则遍历完毕。
一条限流规则主要由下面几个因素组成,我们可以组合这些元素来实现不同的限流效果:
- resource:资源名,即限流规则的作用对象
- count: 限流阈值
- grade: 限流阈值类型(QPS 或并发线程数)
- limitApp: 流控针对的调用来源,若为 default 则不区分调用来源
- strategy: 调用关系限流策略
- controlBehavior: 流量控制效果(直接拒绝、Warm Up、匀速排队)
熔断降级
概述
除了流量控制以外,对调用链路中不稳定的资源进行熔断降级也是保障高可用的重要措施之一。一个服务常常会调用别的模块,可能是另外的一个远程服务、数据库,或者第三方 API 等。例如,支付的时候,可能需要远程调用银联提供的 API;查询某个商品的价格,可能需要进行数据库查询。然而,这个被依赖服务的稳定性是不能保证的。如果依赖的服务出现了不稳定的情况,请求的响应时间变长,那么调用服务的方法的响应时间也会变长,线程会产生堆积,最终可能耗尽业务自身的线程池,服务本身也变得不可用。
熔断策略
Sentinel 提供以下几种熔断策略:
- 慢调用比例 (SLOW_REQUEST_RATIO):选择以慢调用比例作为阈值,需要设置允许的慢调用 RT(即最大的响应时间),请求的响应时间大于该值则统计为慢调用。当单位统计时长(statIntervalMs)内请求数目大于设置的最小请求数目,并且慢调用的比例大于阈值,则接下来的熔断时长内请求会自动被熔断。经过熔断时长后熔断器会进入探测恢复状态(HALF-OPEN 状态),若接下来的一个请求响应时间小于设置的慢调用 RT 则结束熔断,若大于设置的慢调用 RT 则会再次被熔断。
- 异常比例 (ERROR_RATIO):当单位统计时长(statIntervalMs)内请求数目大于设置的最小请求数目,并且异常的比例大于阈值,则接下来的熔断时长内请求会自动被熔断。经过熔断时长后熔断器会进入探测恢复状态(HALF-OPEN 状态),若接下来的一个请求成功完成(没有错误)则结束熔断,否则会再次被熔断。异常比率的阈值范围是 [0.0, 1.0],代表 0% - 100%。
- 异常数 (ERROR_COUNT):当单位统计时长内的异常数目超过阈值之后会自动进行熔断。经过熔断时长后熔断器会进入探测恢复状态(HALF-OPEN 状态),若接下来的一个请求成功完成(没有错误)则结束熔断,否则会再次被熔断。
熔断降级规则说明
熔断降级规则(DegradeRule)包含下面几个重要的属性:
Field | 说明 | 默认值 |
---|---|---|
resource | 资源名,即规则的作用对象 | |
grade | 熔断策略,支持慢调用比例/异常比例/异常数策略 | 慢调用比例 |
count | 慢调用比例模式下为慢调用临界 RT(超出该值计为慢调用);异常比例/异常数模式下为对应的阈值 | |
timeWindow | 熔断时长,单位为 s | |
minRequestAmount | 熔断触发的最小请求数,请求数小于该值时即使异常比率超出阈值也不会熔断(1.7.0 引入) | 5 |
statIntervalMs | 统计时长(单位为 ms),如 60*1000 代表分钟级(1.8.0 引入) | 1000 ms |
slowRatioThreshold | 慢调用比例阈值,仅慢调用比例模式有效(1.8.0 引入) |
集成Feign
步骤:
1.引入依赖
1 |
|
2.编写配置
1 |
|
3.编写代码
1 |
|
Zuul(路由)
https://sentinelguard.io/zh-cn/docs/api-gateway-flow-control.html
依赖
1 |
|
配置
1 |
|
发生限流之后的处理流程 :
- 发生限流之后可自定义返回参数,通过实现 SentinelFallbackProvider 接口,默认的实现是 DefaultBlockFallbackProvider。
- 默认的 fallback route 的规则是 route ID 或自定义的 API 分组名称。
比如:
1 |
|
限流发生之后的默认返回:
{
“code”: 429,
“message”: “Sentinel block exception”,
“route”: “/“
}
注意:
- Sentinel 网关流控默认的粒度是 route 维度以及自定义 API 分组维度,默认不支持 URL 粒度。若通过 Spring Cloud Alibaba 接入,请将 spring.cloud.sentinel.filter.enabled 配置项置为 false(若在网关流控控制台上看到了 URL 资源,就是此配置项没有置为 false)。
- 若使用 Spring Cloud Alibaba Sentinel 数据源模块,需要注意网关流控规则数据源类型是 gw-flow,若将网关流控规则数据源指定为 flow 则不生效。
GateWay(网关)
https://sentinelguard.io/zh-cn/docs/api-gateway-flow-control.html
您可以在 GatewayCallbackManager 注册回调进行定制:
- setBlockHandler:注册函数用于实现自定义的逻辑处理被限流的请求,对应接口为 BlockRequestHandler。默认实现为 DefaultBlockRequestHandler,当被限流时会返回类似于下面的错误信息:Blocked by Sentinel: FlowException。
依赖
1 |
|
配置文件:
1 |
|
网关限流规则 GatewayFlowRule 的字段
- resource:资源名称,可以是网关中的 route 名称或者用户自定义的 API 分组名称。
- resourceMode:规则是针对 API Gateway 的 route(RESOURCE_MODE_ROUTE_ID)还是用户在 Sentinel 中定义的 API 分组(RESOURCE_MODE_CUSTOM_API_NAME),默认是 route。
- grade:限流指标维度,同限流规则的 grade 字段。
- count:限流阈值
- intervalSec:统计时间窗口,单位是秒,默认是 1 秒。
- controlBehavior:流量整形的控制效果,同限流规则的 controlBehavior 字段,目前支持快速失败和匀速排队两种模式,默认是快速失败。
- burst:应对突发请求时额外允许的请求数目。
- maxQueueingTimeoutMs:匀速排队模式下的最长排队时间,单位是毫秒,仅在匀速排队模式下生效。
- paramItem:参数限流配置。若不提供,则代表不针对参数进行限流,该网关规则将会被转换成普通流控规则;否则会转换成热点规则。其中的字段:
- parseStrategy:从请求中提取参数的策略,目前支持提取来源 IP(PARAM_PARSE_STRATEGY_CLIENT_IP)、Host(PARAM_PARSE_STRATEGY_HOST)、任意 Header(PARAM_PARSE_STRATEGY_HEADER)和任意 URL 参数(PARAM_PARSE_STRATEGY_URL_PARAM)四种模式。
- fieldName:若提取策略选择 Header 模式或 URL 参数模式,则需要指定对应的 header 名称或 URL 参数名称。
- pattern:参数值的匹配模式,只有匹配该模式的请求属性值会纳入统计和流控;若为空则统计该请求属性的所有值。(1.6.2 版本开始支持)
- matchStrategy:参数值的匹配策略,目前支持精确匹配(PARAM_MATCH_STRATEGY_EXACT)、子串匹配(PARAM_MATCH_STRATEGY_CONTAINS)和正则匹配(PARAM_MATCH_STRATEGY_REGEX)。(1.6.2 版本开始支持)
重要的常量 见常量类 SentinelGatewayConstants
1 |
|
2.6 RocketMQ(消息订阅与发布)
RocketMQ启动错误:找不到或无法加载主类:https://www.cnblogs.com/luguojun/p/16132759.html
参考案例
核心启动命令
1 |
|
broker.conf
1 |
|
核心代码:
消息发送的核心代码
1 |
|
头部标签:TAGS, DELAY, TRANSACTIONAL_ARG, KEYS, WAIT_STORE_MSG_OK, FLAG
RocketMQConsumerProperties(RocketMq消费方属性 )
**版本:**2.2.7发布版
**包名:**com.alibaba.cloud.stream.binder.rocketmq.properties
参数格式前缀:spring.cloud.stream.rocketmq.bindings..consumer..
常用参数
属性 | 作用 | 默认值 |
---|---|---|
orderly | 同时或有序地接收消息 | false |
enabled | 启用消费者绑定 | true |
delayLevelWhenNextConsume | 并发消费的消息消费重试策略 | - -1,不重试,直接放入DLQ - 0,broker控制重试频率 - >0,客户端控制重试频率 - 默认值:0. |
suspendCurrentQueueTimeMillis | 消息消费重试的时间间隔,用于有序消费 | 1000 |
subscription | 订阅标签 |
RocketMQProducerProperties (RocketMq生产方属性 )
**版本: **2.2.7发布版
**包名: **com.alibaba.cloud.stream.binder.rocketmq.properties
参数格式前缀: spring.cloud.stream.rocketmq.bindings..producer..
常用参数
属性 | 作用 | 默认值 |
---|---|---|
group | 生产者组名称 | |
enabled | 启用生产者绑定 | true |
maxMessageSize | 允许的最大消息大小(以字节为单位) | 8249344 |
producerType | 生产者类型,分别为Normal,Trans; | Normal (如果要开启事务需要设置为Trans) |
transactionListener | 发送事务消息 | false |
sync | 以同步方式发送消息 | false |
sendMessageTimeout | 发送消息超时的毫秒数 | 3000 |
2.7 Seata (分布式事务架构)
官网:https://seata.io/zh-cn/docs/overview/what-is-seata.html
https://github.com/seata/seata
快速下载地址:https://github.com/seata/seata/releases/tag/v1.4.1
推荐下载版本: seata-server-1.4.1.zip
概念:
用于微服务架构的具有高性能和易用性的分布式事务解决方案。
分布式事务产生:
(不同服务自己的调度 产生的)
seata-server启动参数
1 |
|
单机启动命令 : start seata-server.bat -p 8091 -m file
注: file模式为单机模式,全局事务会话信息内存中读写并持久化本地文件root.data,性能较高; db模式为高可用模式,全局事务会话信息通过db共享,相应性能差些;
版本兼容:
查看版本说明 2.1.0内嵌seata-all 0.7.1,2.1.1内嵌seata-all 0.9.0,2.2.0内嵌seata-spring-boot-starter 1.0.0, 2.2.1内嵌seata-spring-boot-starter 1.1.0
2.1.0和2.1.1兼容starter解决方案: @SpringBootApplication注解内exclude掉spring-cloud-starter-alibaba-seata内的com.alibaba.cloud.seata.GlobalTransactionAutoConfiguration
- spring-cloud-starter-alibaba-seata推荐依赖配置方式
1 |
|
事务的四种模式
01. AT
整体机制
两阶段提交协议的演变:
- 一阶段:业务数据和回滚日志记录在同一个本地事务中提交,释放本地锁和连接资源。
- 二阶段:
- 提交异步化,非常快速地完成。
- 回滚通过一阶段的回滚日志进行反向补偿。
02. TCC
一个分布式的全局事务,整体是 两阶段提交 的模型。全局事务是由若干分支事务组成的,分支事务要满足两阶段提交 的模型要求,即需要每个分支事务都具备自己的:
- 一阶段 prepare 行为
- 二阶段 commit 或 rollback 行为
整体机制:
根据两阶段行为模式的不同,我们将分支事务划分为 Automatic (Branch) Transaction Mode 和 TCC (Branch) Transaction Mode.
AT 模式(参考链接 TBD)基于 支持本地 ACID 事务 的 关系型数据库:
- 一阶段 prepare 行为:在本地事务中,一并提交业务数据更新和相应回滚日志记录。
- 二阶段 commit 行为:马上成功结束,自动 异步批量清理回滚日志。
- 二阶段 rollback 行为:通过回滚日志,自动 生成补偿操作,完成数据回滚。
相应的,TCC 模式,不依赖于底层数据资源的事务支持:
- 一阶段 prepare 行为:调用 自定义 的 prepare 逻辑。
- 二阶段 commit 行为:调用 自定义 的 commit 逻辑。
- 二阶段 rollback 行为:调用 自定义 的 rollback 逻辑。
所谓 TCC (Try-Confirm-Cancel)模式,是指支持把 自定义 的分支事务纳入到全局事务的管理中。
03.Saga
整体机制:
适用场景:
- 业务流程长、业务流程多
- 参与者包含其它公司或遗留系统服务,无法提供 TCC 模式要求的三个接口
优势:
- 一阶段提交本地事务,无锁,高性能
- 事件驱动架构,参与者可异步执行,高吞吐
- 补偿服务易于实现
缺点:
- 不保证隔离性(应对方案见后面文档)
04.XA
整体机制:
在 Seata 定义的分布式事务框架内,利用事务资源(数据库、消息服务等)对 XA 协议的支持,以 XA 协议的机制来管理分支事务的一种 事务模式。
相关脚本说明:
https://gitee.com/seata-io/seata/tree/develop/server/src/main/resources
https://gitee.com/seata-io/seata/tree/develop/script/client
存放用于客户端的配置和SQL
- at: AT模式下的 undo_log 建表语句
- conf: 客户端的配置文件
- saga: SAGA 模式下所需表的建表语句
- spring: SpringBoot 应用支持的配置文件
https://gitee.com/seata-io/seata/tree/develop/script/server
存放server侧所需SQL和部署脚本
- db: server 侧的保存模式为 db 时所需表的建表语句
- docker-compose: server 侧通过 docker-compose 部署的脚本
- helm: server 侧通过 Helm 部署的脚本
- kubernetes: server 侧通过 Kubernetes 部署的脚本
https://gitee.com/seata-io/seata/tree/develop/script/config-center
用于存放各种配置中心的初始化脚本,执行时都会读取 config.txt配置文件,并写入配置中心
- nacos: 用于向 Nacos 中添加配置
- zk: 用于向 Zookeeper 中添加配置,脚本依赖 Zookeeper 的相关脚本,需要手动下载;ZooKeeper相关的配置可以写在 zk-params.txt 中,也可以在执行的时候输入
- apollo: 向 Apollo 中添加配置,Apollo 的地址端口等可以写在 apollo-params.txt,也可以在执行的时候输入
- etcd3: 用于向 Etcd3 中添加配置
- consul: 用于向 consul 中添加配置