共计 20059 个字符,预计需要花费 51 分钟才能阅读完成。
视频链接: 小破站视频
代码链接: 码云
(https://github.com/ten-ken/ken-spring-cloud-alibaba-demo)
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/zh-cn/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 的形式
<properties>
<spring.cloud-version>Hoxton.SR8</spring.cloud-version>
</properties>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>${spring.cloud-version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
如果咱们应用的是 maven 版本,咱们能够在父我的项目外面应用 management 并把这个依赖放进去,这样咱们能够治理版本 spring-cloud 相干依赖项(重点是版本控制) |
---|
1.3.2 以 gradle 的形式
buildscript {
dependencies {classpath "io.spring.gradle:dependency-management-plugin:1.0.10.RELEASE"}
}
ext {set('springCloudVersion', "Hoxton.SR8")
}
apply plugin: "io.spring.dependency-management"
dependencyManagement {
imports {mavenBom "org.springframework.cloud:spring-cloud-dependencies:${springCloudVersion}"
}
}
2. 对于 Spring Cloud Alibaba
2.1 概念与个性
Spring Cloud Alibaba 提供分布式应用开发的一站式解决方案。它蕴含开发分布式应用程序所需的所有组件,使您能够轻松地应用 Spring Cloud 开发应用程序。
应用 Spring Cloud Alibaba,您只须要增加一些注解和大量配置,即可将 Spring Cloud 利用连贯到阿里巴巴的分布式解决方案,并通过阿里巴巴中间件构建分布式应用零碎。
:::info
- 流量管制和服务降级:反对 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 性能,您能够为您想要的性能增加独自的启动器。
<dependencyManagement>
<dependencies>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-dependencies</artifactId>
<version>{project-version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
父我的项目次要依赖:
<properties>
<spring.cloud.version>Hoxton.SR5</spring.cloud.version>
<spring.cloud.alibaba.version>2.2.7.RELEASE</spring.cloud.alibaba.version>
<spring.boot.version>2.2.10.RELEASE</spring.boot.version>
<java.version>1.8</java.version>
</properties>
<dependencyManagement>
<dependencies>
<!--spring-cloud 相干依赖集 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>${spring.cloud.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<!--spring-cloud-alibaba 相干依赖集 -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-dependencies</artifactId>
<version>${spring.cloud.alibaba.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<!-- spring-boot 版本 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot</artifactId>
<version>${spring.boot.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
其余依赖
<properties>
<spring.cloud.version>Hoxton.SR5</spring.cloud.version>
<spring.cloud.alibaba.version>2.2.7.RELEASE</spring.cloud.alibaba.version>
<spring.boot.version>2.2.10.RELEASE</spring.boot.version>
<maven-deploy-plugin.version>2.8.2</maven-deploy-plugin.version>
<java.version>1.8</java.version>
<junit.version>4.13.2</junit.version>
<log4j.version>1.2.12</log4j.version>
<lombok.version>1.16.10</lombok.version>
<logback.version>1.2.5</logback.version>
<mybatis.springboot.start.version>1.3.2</mybatis.springboot.start.version>
<alibaba.druid.version>1.1.10</alibaba.druid.version>
<mysql.version>5.1.47</mysql.version>
</properties>
<dependencyManagement>
<dependencies>
<!-- 数据库 -->
<!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>${mysql.version}</version>
</dependency>
<!-- 数据源 -->
<!-- https://mvnrepository.com/artifact/com.alibaba/druid -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>${alibaba.druid.version}</version>
</dependency>
<!--spring-boot-mybatis 启动器 -->
<!-- https://mvnrepository.com/artifact/org.mybatis.spring.boot/mybatis-spring-boot-starter -->
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>${mybatis.springboot.start.version}</version>
</dependency>
<!--lombok-->
<!-- https://mvnrepository.com/artifact/org.projectlombok/lombok-maven-plugin -->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>${lombok.version}</version>
</dependency>
<!--junit-->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>${junit.version}</version>
</dependency>
<!--log4j-->
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>${log4j.version}</version>
</dependency>
<!--logback-core-->
<!-- https://mvnrepository.com/artifact/ch.qos.logback/logback-core -->
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-core</artifactId>
<version>${logback.version}</version>
</dependency>
</dependencies>
</dependencyManagement>
<build>
<plugins>
<!-- 指定 jdk 版本 -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<!-- 源码的编译器版本 -->
<source>${java.version}</source>
<!-- class 的编译器版本 -->
<target>${java.version}</target>
</configuration>
</plugin>
</plugins>
</build>
2.3 相干端口
端口 模块名称
8848 (默认) 注册核心
8801 Nacos 配置服务
8081 生产者 1
8082 生产者 2
8083 生产者 3
8282 消费者
8383 服务熔断降级、限流
8384 Sentinel-Feign
8385 网关 Zuul
8386 网关 GateWay
8686 RocketMQ
8900 seata-business-Service
8980 seata-storage-Service
8981 seata-order-Service
8982 seata-account-Service
2.4 Nacos (服务注册与发现)
疾速下载地址:https://sourceforge.net/mirro…
控制台网址:http://ip:8848/nacos 账号:nacos 明码:nacos
服务注册 / 服务发现 外围依赖:
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
外围注解:
@EnableDiscoveryClient
2.5 Sentinel (哨兵:流量管制、流量路由、熔断降级)
疾速下载地址:https://sourceforge.net/proje…
文档:https://github.com/alibaba/Sentinel/wiki/%E4%BB%8B%E7%BB%8D
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 逻辑中,而是会原样抛出。
外围依赖
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
</dependency>
服务限流
概述
流量管制(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. 引入依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
// 不能短少注册发现
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
2. 编写配置
spring:
cloud:
sentinel:
transport:
port: 8719
dashboard: localhost:8080
feign:
sentinel:
enabled: true
3. 编写代码
@FeignClient(name = "nacos-provider", fallback = EchoServiceFallback.class, configuration = FeignConfiguration.class)
public interface EchoService {@GetMapping(value = "/user/list")
List<User> userList();}
class FeignConfiguration {
@Bean
public EchoServiceFallback echoServiceFallback() {return new EchoServiceFallback();
}
}
class EchoServiceFallback implements EchoService {
@Override
public List<User> userList() {return null;}
}
// 主启动类
@SpringbootApplication
@EnableFeignClients
public class Application{}
Zuul(路由)
https://sentinelguard.io/zh-cn/docs/api-gateway-flow-control.html
依赖
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-sentinel-gateway</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-zuul</artifactId>
</dependency>
配置
spring:
application:
name: sentinel-zuul
cloud:
sentinel:
transport:
port: 8719
dashboard: localhost:8080
#filter:
# enabled: false
datasource.ds2.file:
file: "classpath: gateway.json"
ruleType: gw-flow
datasource.ds1.file:
file: "classpath: api.json"
ruleType: gw-api-group
zuul.enabled: true
eager: true
server:
port: 8385
management.endpoints.web.exposure.include: "*"
zuul:
routes:
myUser:
path: /myUser1/**
serviceId: nacos-provider
#url: http://localhost:8081
#stripPrefix: false
#nacos-provider:
# ribbon:
# NIWSServerListClassName: com.netflix.loadbalancer.ConfigurationBasedServerList
# listOfServers: http://localhost:8081,http://localhost:8082
# ConnectTimeout: 1000
# ReadTimeout: 3000
# MaxTotalHttpConnections: 500
# MaxConnectionsPerHost: 100
产生限流之后的解决流程:
- 产生限流之后可自定义返回参数,通过实现 SentinelFallbackProvider 接口,默认的实现是 DefaultBlockFallbackProvider。
- 默认的 fallback route 的规定是 route ID 或自定义的 API 分组名称。
比方:
// 自定义 FallbackProvider
public class MyBlockFallbackProvider implements ZuulBlockFallbackProvider {private Logger logger = LoggerFactory.getLogger(DefaultBlockFallbackProvider.class);
// you can define route as service level
@Override
public String getRoute() {return "/book/app";}
@Override
public BlockResponse fallbackResponse(String route, Throwable cause) {RecordLog.info(String.format("[Sentinel DefaultBlockFallbackProvider] Run fallback route: %s", route));
if (cause instanceof BlockException) {return new BlockResponse(429, "Sentinel block exception", route);
} else {return new BlockResponse(500, "System Error", route);
}
}
}
// 注册 FallbackProvider
ZuulBlockFallbackManager.registerProvider(new MyBlockFallbackProvider());
限流产生之后的默认返回:
{“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。
依赖
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-sentinel-gateway</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-gateway</artifactId>
</dependency>
配置文件:
server:
port: 8386
spring:
application:
name: sentinel-gateway
cloud:
sentinel:
transport:
dashboard: localhost:8080
datasource.ds2.file:
file: "classpath: gateway.json"
ruleType: gw-flow
datasource.ds1.file:
file: "classpath: api.json"
ruleType: gw-api-group
gateway:
enabled: true
discovery:
locator:
lower-case-service-id: true
routes:
# Add your routes here.
- id: userList
uri: http://localhost:8081
predicates:
- Path=/user/list
- id: userInfo
uri: http://localhost:8081
predicates:
- Path=/user/get/**
网关限流规定 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
{
"resource": "some_customized_api",
"resourceMode":1,// 针对的自定义 api 进行限流
"count": 2,
"paramItem":{
"parseStrategy":3,// 针对 url 参数的解析策略
"fieldName":"name"
}
}
2.6 RocketMQ(音讯订阅与公布)
RocketMQ 启动谬误:找不到或无奈加载主类:https://www.cnblogs.com/luguojun/p/16132759.html
参考案例
github(demo)
https://github.com/alibaba/sp…
外围启动命令
# 启动 namesrv
start mqnamesrv.cmd
#启动 broker
start mqbroker.cmd -n 127.0.0.1:9876 -c ../conf/broker.conf autoCreateTopicEnable=true
broker.conf
# 承受客户端连贯的监听端口, 默认 10911
listenPort=10911
#name server 服务器地址及端口,能够是多个,分号隔开
namesrvAddr=192.168.1.100:9876
brokerClusterName = DefaultCluster
brokerName = broker-a
brokerId = 0
deleteWhen = 04
fileReservedTime = 48
brokerRole = ASYNC_MASTER
flushDiskType = ASYNC_FLUSH
#检测物理文件磁盘空间
diskMaxUsedSpaceRatio=88
#存储门路
storePathRootDir=E:/dev-soft/rocketmq-all-4.3.2-bin-release/store
#commitLog 存储门路
storePathCommitLog=E:/dev-soft/rocketmq-all-4.3.2-bin-release/store/commitlog
#生产队列存储门路
storePathConsumeQueue=E:/dev-soft/rocketmq-all-4.3.2-bin-release/store/consumequeue
#音讯索引存储门路
storePathIndex=E:/dev-soft/rocketmq-all-4.3.2-bin-release/store/index
#checkpoint 文件存储门路
storeCheckpoint=E:/dev-soft/rocketmq-all-4.3.2-bin-release/store/checkpoint
#abort 文件存储门路
abortFile=E:/dev-soft/rocketmq-all-4.3.2-bin-release/store/abort
外围代码:
音讯发送的外围代码
MessageBuilder builder = MessageBuilder.withPayload(msg)
.setHeader(RocketMQHeaders.TAGS, "binder")
.setHeader(RocketMQHeaders.KEYS, "my-key")
.setHeader(MessageConst.PROPERTY_DELAY_TIME_LEVEL, "1");
Message message = builder.build();
output().send(message);
头部标签: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.<channelName>.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.<channelName>.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 启动参数
-h: 注册到注册核心的 ip
-p: Server rpc 监听端口
-m: 全局事务会话信息存储模式,file、db、redis,优先读取启动参数 (Seata-Server 1.3 及以上版本反对 redis)
-n: Server node,多个 Server 时,需辨别各自节点,用于生成不同区间的 transactionId,免得抵触
-e: 多环境配置参考 http://seata.io/en-us/docs/ops/multi-configuration-isolation.html
单机启动命令:
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 举荐依赖配置形式
<dependency> <groupId>io.seata</groupId> <artifactId>seata-spring-boot-starter</artifactId> <version> 最新版 </version> </dependency> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-seata</artifactId> <version> 最新版本 </version> <exclusions> <exclusion> <groupId>io.seata</groupId> <artifactId>seata-spring-boot-starter</artifactId> </exclusion> </exclusions> </dependency>
事务的四种模式
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
client
寄存用于客户端的配置和 SQL
- at: AT 模式下的 undo_log 建表语句
- conf: 客户端的配置文件
- saga: SAGA 模式下所需表的建表语句
-
spring: SpringBoot 利用反对的配置文件
server
寄存 server 侧所需 SQL 和部署脚本
- db: server 侧的保留模式为 db 时所需表的建表语句
- docker-compose: server 侧通过 docker-compose 部署的脚本
- helm: server 侧通过 Helm 部署的脚本
-
kubernetes: server 侧通过 Kubernetes 部署的脚本
config-center
用于寄存各种配置核心的初始化脚本,执行时都会读取 config.txt 配置文件,并写入配置核心
- nacos: 用于向 Nacos 中增加配置
- zk: 用于向 Zookeeper 中增加配置,脚本依赖 Zookeeper 的相干脚本,须要手动下载;ZooKeeper 相干的配置能够写在 zk-params.txt 中,也能够在执行的时候输出
- apollo: 向 Apollo 中增加配置,Apollo 的地址端口等能够写在 apollo-params.txt,也能够在执行的时候输出
- etcd3: 用于向 Etcd3 中增加配置
- consul: 用于向 consul 中增加配置