1.springcloud alibaba
1.1主要功能
服务限流降级:默认支持WebService、WebFlux、OpenFeign、RestTemplate、SpringCloudGateway、Zuul、Dubbo和RocketMQ限流降级功能的接入。
服务注册与发现:适配SpringCloud服务注册与发现标准,默认集成Ribbon支持。
消息驱动能力:基于SpringCLoudStream为微服务应用构建消息驱动能力。
分布式事务:使用@GlobalTransactional注解,高效并且对业务零侵入地解决分布式事务问题。
阿里云对象存储:阿里云提供云存储服务。
分布式任务调度:提供秒级定时(基于Cron)任务调度。同时提供分布式的任务执行模型。网格任务支持海量子任务均匀分配到所有Worker(scheduler-clirnt)上
阿里云短信服务:...
1.2组件
Sentinel:从流量控制,熔断降级,系统负载保护等多个维度保护服务稳定性。
Nacos:动态服务发现,配置管理和服务管理平台。
RocketMQ:分布式消息系统
Dubbo:高可用Java RPC框架
Seata:高性能微服务分布式事务解决方案。
Alibaba Cloud OSS:阿里云对象存储服务。
Alibaba Cloud SchedulerX:分布式任务调度产品
Alibaba Cloud SMS:短信服务
1.3使用
地址:https://spring.io/projects/spring-cloud-alibaba
github:https://github.com/projects/spring-cloud-alibaba
父工程依赖
<dependencyManagement>
<dependencies>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-dependencies</artifactId>
<version>2021.0.1.0</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
1.4版本对应
2.SpringCloud Alibaba Nacos服务注册和配置中心
2.1是什么?
1.Nacos:服务注册和配置中心
github:https://github.com/alibaba/Nacos
Nacos= Eureka + Config + Bus
2.Nacos概念
Nacos文档:https://nacos.io/zh-cn/
2.2Nacos2.0
新增长链接功能:Nacos2.0比1.x新增gRPC的通信方式。因此需要增加2个端口,新增端口是在配置的主端口(server.port)基础上,进行一定偏移量自动生成。
2.3对比
2.4下载
1.下载地址:https://github.com/alibaba/nacos/releases
2.下载压缩包解压,进入bin目录,打开dos窗口,执行startup命令启动它。
startup.cmd -m standalone #单机模式
3.端口8848
4.访问http://locaohost:8848/nacos/index.html 默认账号密码nacos
2.5注册中心功能
1.服务提供者nacos-provider8000
依赖
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
yml
server:
port: 8000
spring:
application:
name: nacos-provider
cloud:
nacos:
discovery:
server-addr: localhost:8848
主启动类
@EnableDiscoveryClient
2.新建nacos-provider8001
同上
查看nacos服务管理
3. 搭建nacos-consumer9000
同上,注意alibaba已经不支持ribbon做负载均衡了,使用loadbalancer替换
pom:
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
<dependency>
<exclusions>
<exclusion>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-ribbon</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-loadbalancer</artifactId>
<version>3.1.1</version>
</dependency>
</dependencies>
application.yml:
server:
port: 9000
spring:
application:
name: nacos-consumer
cloud:
loadbalancer:
ribbon:
enable: false
nacos:
discovery:
server-addr: localhost:8848
4.整合feign
导包+写feign接口
代码:https://gitee.com/xuyu294636185/xuy-cloud-alibaba.git
2.6服务与注册中心对比
A:可用性 B:一致性 C:分区容错性
Nacos默认AP,qiehuanCP: curl -X PUT '$NACOS_SERVER:8848/nacos/v1/ns/operator/switches?entry=serverMode&value=CP'
2.7配置中心功能
1.创建工程nacos-client7777
1.pom
2.appliction.yml
3.bootstrap.yml
2.分类配置
问题:实际开发中,通常一个系统会准备dev/test/prod环境,如何保证环境启动时服务能正确读取nacos上相应环境的配置文件?
答:namespace区分
问题:一个大型分布式微服务系统有很多微服务子项目,每个微服务项目又都会有相应的开发环境,测试环境,预发环境,正式环境,那怎么对微服务配置进行管理呢?
答:用group把不同的微服务划分到同一个分组去。
*service就是微服务,一个service可以包含多个cluster集群,nacos默认cluster是DEFAULT,cluser是对指定微服务的一个虚拟划分。
比方说为了容灾,将service微服务分别部署在了北京机房和上海机房,这是就可以给北京机房的微服务起一个集群名BJ,给上海的service微服务起SH,还可以尽量让同一个机房的微服务互相调用,以提升效率。最后instance就是微服务的实例。
dgn方案:
最后三者关系如下:
2.8集群和持久化配置(重要)
2.8.1Nacos部署环境
nacos定义一个IDC内部应用组件,并非全面向内网环境的产品,建议在内部隔离环境中部署,强烈不建议部署在公共网络环境。
2.8.2nacos支持三种部署模式
*单机模式:用于测试和单机试用
*集群模式:用于生产环境,确保高可用
*多集群模式:用于多数据中心场景
2.8.3单机模式下运行nacos
linux:startup.sh -m standalone
windows:startup.cmd -m standalone
2.8.4单机模式(0.7版本之后)支持mysql
1.mysql要求:5.6.5+
2.初始化mysql数据库,数据库初始化文件:nacos-mysql.sql
3.修改conf/applicaion.properties文件,增加支持msyql数据源配置,添加mysql数据源的url等信息
#放开注释
spring.datasource.platform=mysql
db.num=1
db.url.0=jdbc:mysql://localhost:3306/nacos_devtest?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true&serverTimeZone=GMT%2B8
db.user=nacos_devtest
db.password=root
再以单机模式启动nacos,所有写嵌入式数据库的数据都写到了mysql
2.8.5集群部署说明
集群模式部署
1.预备环境
64bitOs Linux/Unix/Mac、64bitJDK1.8+、Maven3.2.x+、3个以上Nacos节点
2.下载源码:
https://github.com/alibaba/nacos/relesases
unzip nacos -source.zip
cd nacos/
mvn -Prelease-nacos clean install -U
cd nacos/distribution/target/nacos-server-1.3.0/nacos/bin
3.配置集群配置文件
在nacos的解压目录nacos/的conf目录下,有配置文件cluster.conf,请每行配置IP:port
4.确定数据源
使用内置数据源:无需配置
使用外置数据源:建议成产至少主备模式
初始化sql数据库:sql语句源文件
application.properties配置文件
5.启动服务器 集群模式
使用内置数据源:sh startup.sh -p embedded
使用外置数据源:sh startup.sh
nginx下载:http://nginx.org/download/nginx-1.20.2.tar.gz
安装:百度
upstream cluster{
server 192.168.246.128:6666
server 192.168.246.128:7777
server 192.168.246.128:8888
}
server{
//监听5555端口,转发至上述集群
listen 5555;
server_name localhost;
location / {
proxy_pass http://cluster;
}
}
代码:https://gitee.com/xuyu294636185/xuy-cloud-alibaba.git
3.SpringCloudAlibaba Sentinel实现熔断与限流
3.1简介
hystrix的替代。
sentinel分为两个部分:
核心库:(java客户端)不依赖任何框架,能够运行于所有java运行时环境,同时对Dubbo/SpringCloud支持。
控制台(Dashboard)基于SPringBoot开发,打包后可以直接运行,不需要额外的Tomcat等应用容器。
3.2下载
https://github.com/alibaba/Sentinel/releases
运行:java -jar sentinel-dashboard-1.8.4.jar
http://localhost:8080
默认账户密码:sentinel
3.3初始化演示工程
cloudalibaba-sentinel-service8000
1.pom
2.配置文件
3.启动类添加注解
4.调用口测试
代码:https://gitee.com/xuyu294636185/xuy-cloud-alibaba.git
3.4流量控制
资源名:唯一名称,默认请求路径
针对来源:sentinel可以针对调用者进行限流,填写微服务名,默认default
阈值类型/单机值:
QPS(每秒请求数):当调用该api就QPS达到阈值时进行限流
线程数:当调用该api线程数达到阈值时限流
是否集群:不需要集群
流控模式:
直连:api达到限流条件时,直接限流
关联:当关联的值到阈值,就限流自己,
链路:只记录指定链路上的流量
1.(@SentinelResource("goods"))
2.web-context-unify: false #关闭收敛URL
流控效果:
快速失败:直接抛异常
warm up:根据codeFactor的值,从阈值预热达到QPS阈值
排队等待:匀速排队,让请求以匀速通过,阈值类型必须设置为QPS,否则无效。
3.5熔断降级
微服务之间的相互调用链路上某一环不稳定,就可能会层层级联,导致整个链路不稳定,因此我们需要不稳定的弱依赖服务调用进行熔断降级,暂时切断不稳定调用,避免局部不稳定因素导致整体的雪崩,熔断降级作为保护自身的手段,通常在客户端进行配置。
sentinel提供下几种熔断策略:
1.慢调用比例(SLOW_REQUEST_RATIO):需要设置允许慢调用RT(最大响应时间),请求的响应大于该阈值则统计为慢带调用,当单位统计时长(statIntervalMs)内请求数目大于设置的最下请求数目,并且慢调用比例大于阈值,则接下来的熔断时长内请求会自动被熔断,经过熔断时长后熔断器会进入探测恢复状态(HALF-OPEN),若接下来的一个请求响应时间小于设置的慢调用RT则结束熔断,若大于设置的慢调用RT则会再次被熔断。
2.异常比例(ERROR_RATIO)
3.异常数(ERROR_COUNT)
注意异常降级仅针对业务异常,对Sentinel限流降级本身的异常(BlockException)不生效。
3.6热点参数限流
热点即经常访问的数据,我们希望统计某个热点数据中访问频次最高的TopK数据,并对其进行访问限制,比如:商品Id或用户ID。Sentinel利用LRU策略统计最近最常访问的热点数据,结合令牌桶算法来进行参数级别的流控。热点参数限流支持集群模式。
1.添加依赖:
<dependency>
<groupId>com.alibaba.csp</groupId>
<artifactId>sentinel-parameter-flow-control</artifactId>
<version>1.8.4</version>
</dependency>
2.设置规则
3.错误标志处理
例外情况:
秒杀情况下,某个参数goodsId=100,最新手机id,单独设置阈值1000.
注意:业务上的错误,sentinel不会管,热点key吸纳之,sentinel才会管。
3.7系统自适应限流
Sentinel系统自适应限流从整体维度对应用入口流量进行控制,结合应用的load,CPU使用率,总体平均RT,入口QPS和并发线程数等几个维度的监控指标,通过自适应的流控策略,让系统的入口流量和系统的负载达到一个平衡,让系统尽可能泡在最大吞吐量的同时保证系统整体的稳定性
3.8@SentinelResource
代码:https://gitee.com/xuyu294636185/xuy-cloud-alibaba.git
3.9降级
熔断:微服务自己限流,不可用了
降级:调用方,提供方错了,返回给客户端一个友好对象。
新建上述三个项目。
不同情况下blockHandler与fallback情况
1.不配置
直接报错
2.只配置fallback
3.只配置blockHandler
4.都配置
都生效
5.忽略某些异常
@SentinelResource(value = "add",blockHandler="fail_add",fallback = "fallback_add",exceptionsToIgnore = {IllegalAccessException.class})
3.10feign调用
导包、启动类+注解、feign功能实现,调用,实现见代码
3.11配置持久化
导包
<dependency>
<groupId>com.alibaba.csp</groupId>
<artifactId>sentinel-datasource-nacos</artifactId>
</dependency>
yml
sentinel:
datasource:
ds1:
nacos:
server-addr: localhost:8848
dataId: ${spring.application.name}
groupId: DEFAULT_GROUP
data-type: json
rule-type: flow
nacos添加配置
代码:https://gitee.com/xuyu294636185/xuy-cloud-alibaba.git
BV1tT4y1a7LA