视频链接:小破站视频
官网地址:
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
Spring Cloud 为开发者提供了工具来快速构建分布式系统中的一些常见模式(例如配置管理、服务发现、断路器、智能路由、微代理、控制总线、一次性令牌、全局锁、领导选举、分布式会话,集群状态)。分布式系统的协调导致了样板模式,使用 Spring Cloud 开发人员可以快速建立实现这些模式的服务和应用程序。它们在任何分布式环境中都能很好地工作,包括开发人员自己的笔记本电脑、裸机数据中心以及 Cloud Foundry 等托管平台。
Spring Cloud 专注于为典型用例提供良好的开箱即用体验,并提供可扩展机制以覆盖其他用例。
如果您想要将 Spring Cloud 添加到该应用程序的现有 Spring Boot 应用程序,则第一步是确定您应该使用的 Spring Cloud 版本。您在应用程序中使用的版本取决于您使用的 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
<properties>
<spring.cloud-version>Hoxton.SR8spring.cloud-version>
properties>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloudgroupId>
<artifactId>spring-cloud-dependenciesartifactId>
<version>${spring.cloud-version}version>
<type>pomtype>
<scope>importscope>
dependency>
dependencies>
dependencyManagement>
如果我们使用的是maven版本,我们可以在父项目里面使用management 并把这个依赖放进去,这样我们可以管理版本spring-cloud相关依赖项(重点是版本控制) |
---|
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}"
}
}
Spring Cloud Alibaba 提供分布式应用开发的一站式解决方案。它包含开发分布式应用程序所需的所有组件,使您可以轻松地使用 Spring Cloud 开发应用程序。
使用 Spring Cloud Alibaba,您只需要添加一些注解和少量配置,即可将 Spring Cloud 应用连接到阿里巴巴的分布式解决方案,并通过阿里巴巴中间件构建分布式应用系统。
:::info
最简单的入门方法是包含 Spring Cloud BOM,然后添加spring-cloud-alibaba-dependencies到应用程序的类路径中。如果您不想包含所有 Spring Cloud Alibaba 功能,您可以为您想要的功能添加单独的启动器。
<dependencyManagement>
<dependencies>
<dependency>
<groupId>com.alibaba.cloudgroupId>
<artifactId>spring-cloud-alibaba-dependenciesartifactId>
<version>{project-version}version>
<type>pomtype>
<scope>importscope>
dependency>
dependencies>
dependencyManagement>
父项目主要依赖:
<properties>
<spring.cloud.version>Hoxton.SR5spring.cloud.version>
<spring.cloud.alibaba.version>2.2.7.RELEASEspring.cloud.alibaba.version>
<spring.boot.version>2.2.10.RELEASEspring.boot.version>
<java.version>1.8java.version>
properties>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloudgroupId>
<artifactId>spring-cloud-dependenciesartifactId>
<version>${spring.cloud.version}version>
<type>pomtype>
<scope>importscope>
dependency>
<dependency>
<groupId>com.alibaba.cloudgroupId>
<artifactId>spring-cloud-alibaba-dependenciesartifactId>
<version>${spring.cloud.alibaba.version}version>
<type>pomtype>
<scope>importscope>
dependency>
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-bootartifactId>
<version>${spring.boot.version}version>
<type>pomtype>
<scope>importscope>
dependency>
dependencies>
dependencyManagement>
其他依赖
<properties>
<spring.cloud.version>Hoxton.SR5spring.cloud.version>
<spring.cloud.alibaba.version>2.2.7.RELEASEspring.cloud.alibaba.version>
<spring.boot.version>2.2.10.RELEASEspring.boot.version>
<maven-deploy-plugin.version>2.8.2maven-deploy-plugin.version>
<java.version>1.8java.version>
<junit.version>4.13.2junit.version>
<log4j.version>1.2.12log4j.version>
<lombok.version>1.16.10lombok.version>
<logback.version>1.2.5logback.version>
<mybatis.springboot.start.version>1.3.2mybatis.springboot.start.version>
<alibaba.druid.version>1.1.10alibaba.druid.version>
<mysql.version>5.1.47mysql.version>
properties>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>mysqlgroupId>
<artifactId>mysql-connector-javaartifactId>
<version>${mysql.version}version>
dependency>
<dependency>
<groupId>com.alibabagroupId>
<artifactId>druidartifactId>
<version>${alibaba.druid.version}version>
dependency>
<dependency>
<groupId>org.mybatis.spring.bootgroupId>
<artifactId>mybatis-spring-boot-starterartifactId>
<version>${mybatis.springboot.start.version}version>
dependency>
<dependency>
<groupId>org.projectlombokgroupId>
<artifactId>lombokartifactId>
<version>${lombok.version}version>
dependency>
<dependency>
<groupId>junitgroupId>
<artifactId>junitartifactId>
<version>${junit.version}version>
dependency>
<dependency>
<groupId>log4jgroupId>
<artifactId>log4jartifactId>
<version>${log4j.version}version>
dependency>
<dependency>
<groupId>ch.qos.logbackgroupId>
<artifactId>logback-coreartifactId>
<version>${logback.version}version>
dependency>
dependencies>
dependencyManagement>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.pluginsgroupId>
<artifactId>maven-compiler-pluginartifactId>
<configuration>
<source>${java.version}source>
<target>${java.version}target>
configuration>
plugin>
plugins>
build>
端口 模块名称
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
快速下载地址:https://sourceforge.net/mirror/nacos/activity
控制台网址 :http://ip:8848/nacos 账号 :nacos 密码:nacos
<dependency>
<groupId>com.alibaba.cloudgroupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discoveryartifactId>
dependency>
@EnableDiscoveryClient
快速下载地址:https://sourceforge.net/projects/sentinel.mirror/
文档:https://github.com/alibaba/Sentinel/wiki/%E4%BB%8B%E7%BB%8D
Sentinel 的主要特性:
Sentinel 分为两个部分:
Sentinel 社区官方网站:https://sentinelguard.io/
注意:注解方式埋点不支持 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.cloudgroupId>
<artifactId>spring-cloud-starter-alibaba-sentinelartifactId>
dependency>
流量控制(flow control),其原理是监控应用流量的 QPS 或并发线程数等指标,当达到指定的阈值时对流量进行控制,以避免被瞬时的流量高峰冲垮,从而保障应用的高可用性。
同一个资源可以创建多条限流规则。FlowSlot 会对该资源的所有限流规则依次遍历,直到有规则触发限流或者所有规则遍历完毕。
一条限流规则主要由下面几个因素组成,我们可以组合这些元素来实现不同的限流效果:
resource:资源名,即限流规则的作用对象
count: 限流阈值
grade: 限流阈值类型(QPS 或并发线程数)
limitApp: 流控针对的调用来源,若为 default 则不区分调用来源
strategy: 调用关系限流策略
controlBehavior: 流量控制效果(直接拒绝、Warm Up、匀速排队)
除了流量控制以外,对调用链路中不稳定的资源进行熔断降级也是保障高可用的重要措施之一。一个服务常常会调用别的模块,可能是另外的一个远程服务、数据库,或者第三方 API 等。例如,支付的时候,可能需要远程调用银联提供的 API;查询某个商品的价格,可能需要进行数据库查询。然而,这个被依赖服务的稳定性是不能保证的。如果依赖的服务出现了不稳定的情况,请求的响应时间变长,那么调用服务的方法的响应时间也会变长,线程会产生堆积,最终可能耗尽业务自身的线程池,服务本身也变得不可用。
Sentinel 提供以下几种熔断策略:
熔断降级规则(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 引入) |
步骤:
1.引入依赖
<dependency>
<groupId>org.springframework.cloudgroupId>
<artifactId>spring-cloud-starter-openfeignartifactId>
dependency>
//不能缺少注册发现
<dependency>
<groupId>com.alibaba.cloudgroupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discoveryartifactId>
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{
}
https://sentinelguard.io/zh-cn/docs/api-gateway-flow-control.html
依赖
com.alibaba.cloud
spring-cloud-starter-alibaba-sentinel
com.alibaba.cloud
spring-cloud-alibaba-sentinel-gateway
org.springframework.cloud
spring-cloud-starter-netflix-zuul
配置
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
发生限流之后的处理流程 :
比如:
// 自定义 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”:“/” }
** 注意**:
https://sentinelguard.io/zh-cn/docs/api-gateway-flow-control.html
您可以在 GatewayCallbackManager 注册回调进行定制:
依赖
com.alibaba.cloud
spring-cloud-starter-alibaba-sentinel
com.alibaba.cloud
spring-cloud-alibaba-sentinel-gateway
org.springframework.cloud
spring-cloud-starter-gateway
配置文件:
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 的字段
重要的常量 见常量类 SentinelGatewayConstants
{
"resource": "some_customized_api",
"resourceMode":1,//针对的自定义api进行限流
"count": 2,
"paramItem":{
"parseStrategy":3,//针对url参数的解析策略
"fieldName":"name"
}
}
RocketMQ启动错误:找不到或无法加载主类:https://www.cnblogs.com/luguojun/p/16132759.html
github(demo)
https://github.com/alibaba/spring-cloud-alibaba/tree/2.2.7.RELEASE/spring-cloud-alibaba-examples/rocketmq-example
核心启动命令
#启动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
**版本:**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 | 订阅标签 |
**版本: **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 |
官网: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
<dependency>
<groupId>io.seatagroupId>
<artifactId>seata-spring-boot-starterartifactId>
<version>最新版version>
dependency>
<dependency>
<groupId>com.alibaba.cloudgroupId>
<artifactId>spring-cloud-starter-alibaba-seataartifactId>
<version>最新版本version>
<exclusions>
<exclusion>
<groupId>io.seatagroupId>
<artifactId>seata-spring-boot-starterartifactId>
exclusion>
exclusions>
dependency>
整体机制
两阶段提交协议的演变:
一个分布式的全局事务,整体是 两阶段提交 的模型。全局事务是由若干分支事务组成的,分支事务要满足 两阶段提交 的模型要求,即需要每个分支事务都具备自己的:
整体机制:
根据两阶段行为模式的不同,我们将分支事务划分为 Automatic (Branch) Transaction Mode 和 TCC (Branch) Transaction Mode.
AT 模式(参考链接 TBD)基于 支持本地 ACID 事务 的 关系型数据库:
相应的,TCC 模式,不依赖于底层数据资源的事务支持:
所谓 TCC (Try-Confirm-Cancel)模式,是指支持把 自定义 的分支事务纳入到全局事务的管理中。
整体机制:
适用场景:
优势:
缺点:
整体机制:
在 Seata 定义的分布式事务框架内,利用事务资源(数据库、消息服务等)对 XA 协议的支持,以 XA 协议的机制来管理分支事务的一种 事务模式。
https://gitee.com/seata-io/seata/tree/develop/server/src/main/resources
存放用于客户端的配置和SQL
存放server侧所需SQL和部署脚本
用于存放各种配置中心的初始化脚本,执行时都会读取 config.txt配置文件,并写入配置中心