Spring Cloud 学习
2024-02-21 18:08:02 3 举报
AI智能生成
Spring Cloud 学习
作者其他创作
大纲/内容
1、微服务架构
https://gitee.com/moxi159753/LearningNotes/tree/master/SpringCloud/SpringCloud2020/
2、从2.2.x和H版开始说起
3、关于Cloud各种组件的停更/升级/替换
由停更引发的"升级惨案"
停更不停用
被动修复Bugs
不再接受合并请求
不再发布新版本
补充,O(∩_∩)O哈哈~
停课不停学
明细条目
SpringCloud 以前组件
Eureka 服务注册与发现
Netflix Ribbon 负载均衡
Netflix Feign 服务调用
Netflix Hystrix 服务熔断降级
Netflix Zuul 服务网关
Spring Cloud Config 服务分布式配置
Spring Boot 服务开发
Spring Cloud升级
服务注册中心
Eureka
Zookeeper
Consul
Nacos
负载均衡
Ribbon 客户端负载均衡、达到系统的HA(高可用)<br>
LoadBalancer <br>
服务调用<br>
Feign
OpenFeign
服务降级
Hystrix<br>
resilience4j
sentienl
服务网关
Zuul
Zuul2
gateway
服务配置
Config
Nacos
服务总线
Bus
Nacos<br>
参考资料见官网
Spring Cloud<br>
Spring Cloud英文文档<br>
https://cloud.spring.io/spring-cloud-static/Hoxton.SR1/reference/htmlsingle/
Spring Cloud中文文档<br>
https://www.bookstack.cn/read/spring-cloud-docs/docs-index.md<br>
Spring Boot<br>
https://docs.spring.io/spring-boot/docs/2.2.2.RELEASE/reference/htmlsingle/
4、微服务架构编码架构
约定 > 配置 > 编码
IDEA新建project工作空间<br>
1、微服务cloud整体聚合父工程Project<br>
父工程步骤
1、New Project
2、聚合总父工程名字<br>
3、Maven选版本<br>
4、工程名字
5、字符编码
6、注解生效激活
7、java编译版本选8
8、File Type过滤
9、多个微服务启动
2、父工程POM
3、Maven 工程落地 细节复习
Maven中的 DependencyManagement 和 Dependencies<br>
Maven中跳过单元测试
4、父工程创建完成执行mvn:install将父工程发布到仓库方便子工程继承<br>
5、MySql驱动说明<br>
Rest微服务工程构建
1、构建步骤
1、cloud-provider-payment8001<br>微服务提供者支付Module模块
1、建cloud-provider-payment8001<br>
创建完成后请回到父工程查看pom文件变化
2、改POM
3、写YML
4、主启动
5、业务类
1、建表SQL
2、entity
主实体Payment
Json封装响应体
CommonResult<T>
ResponseCode<br>
3、mapper<br>
接口PaymentMapper
mybaits的映射文件PaymentMapper.xml<br>
路径
src\main\resources\mapper\PaymentMapper.xml
文件头
PaymentMapper.xml
4、service<br>
接口PaymentService
实现类PaymentServiceImpl
5、controller
6、测试
postman模拟Get请求<br>
http://localhost:8001/payment/get/1
postman模拟Post请求
http://localhost:8001/payment/create<br>
第一步设置 Headers<br>
第二部设置 Body<br>
运行
通过修改idea的workspace.xml的方式来快速打开Run Dashboard窗口<br>
开启Run DashBoard
部分同学可能由于idea版本不同,需要关闭重启
7、小总结
1、建module
2、改POM
3、写YML
4、主启动
5、业务类
2、热部署Devtools
1、Adding devtools to your project<br> 下段配置我们粘贴进 8001 子项目中添加依赖
2、Adding plugin to your pom.xml<br>下段配置我们粘贴进聚合父类总工程的pom.xml里<br>
3、Enabling automatic build<br> 勾选启用自动构建
4、Update the value of<br> 更新值<br>
①:快捷键 Ctrl + Shift + Alt + /
②:选择复选框
5、重启IDEA
3、cloud-consumer-order8080<br>微服务消费者订单Module模块<br>
1、建cloud-consumer-order8080
2、改POM
3、写YML application.yml
4、主启动 MainApp8080
5、业务类
entity
主实体Payment
Json封装响应体
CommonResult<T>
ResponseCode<br>
首说RestTemplate
是什么
官网及使用
config配置类
ApplicationContextConfig<br>
controller
6、测试
http://localhost:8080/consumer/payment/get/1<br>
http://localhost:8080/consumer/payment/create?serial=金额100
<br>
4、工程重构 cloud-api-commons
观察问题<br>
系统中有重复部分,重构
新建
cloud-api-commons
POM
entity<br>
主实体Payment
Json封装响应体
CommonResult<T>
ResponseCode<br>
maven命令clean install<br>
订单80和支付8001分别改造
删除各自的原先有过的entities文件夹
各自粘贴POM内容
cloud-consumer-order8080
cloud-provider-payment8001
2、目前工程样图
5、Eureka服务注册与发现<br>
Dubbo
Eureka基础知识
什么是服务治理
什么是服务注册<br>
Eureka两组件
单机Eureka构建步骤<br>
IDEA生成eurekaServer端服务注册中心<br>类似物业公司<br>cloud-eureka-server7001<br>
建Module cloud-eureka-server7001
改POM<br>
1.X和2.X的对比说明
写YML<br>
主启动<br>
@EnableEurekaServer
测试<br>
http://localhost:7001/<br>
结果页面
No application available 没有服务被发现 O(∩_∩)O<br>因为没有注册服务进来当然不可能有服务被发现
EurekaClient端cloud-provider-payment8001<br>将注册进EurekaServer成为服务提供者provider,类似学校对外提供授课服务<br>
cloud-provider-payment8001
改POM<br>
1.X和2.X的对比说明
写YML<br>
子主题
主启动<br>
@EnableEurekaClient
测试<br>
先要启动EurekaServer
http://localhost:7001/<br>
微服务注册名配置说明<br>
自我保护机制
EurekaClient端cloud-consumer-order8080<br>将注册进EurekaServer成为服务消费者consumer,类似上课消费的各位同学<br>
cloud-consumer-order8080
POM<br>
YML<br>
主启动<br>
@EnableEurekaClient
测试<br>
先要启动EurekaServer,7001服务<br>
再要启动服务提供者provider,8001服务<br>
eureka服务器<br>
http://localhost:8080/consumer/payment/get/1<br>
bug
Failed to bind properties under 'eureka.client.service-url' to java.util.Map<java.lang.String, java.lang.String>
集群Eureka构建步骤
Eureka集群原理说明
Eureka集群注册原理<br>
EurekaServer集群环境构建步骤<br>
1、参考cloud-eureka-server7001
2、新建cloud-eureka-server7002<br>
3、改 cloud-eureka-server7002 POM<br>
4、修改映射配置<br>
找到C:\Windows\System32\drivers\etc路径下的hosts文件<br>
修改映射配置添加进hosts文件<br>
5、写<b> Eureka</b> YML(以前单机)<br>
<b>Eureka</b> 7001 yml文件
<b>Eureka</b> 7002 yml文件
6、主启动
7、浏览器访问注册中心
http://localhost:7001/<br>
http://eureka7001.com:7001/<br>
http://localhost:7002/
http://eureka7002.com:7002/
将支付服务8001微服务发布到上面2台Eureka集群配置中<br>
YML
将订单服务8080微服务发布到上面2台Eureka集群配置中<br>
YML
测试01<br>
①、先要启动EurekaServer,7001/7002服务
②、再要启动服务提供者provider,8001<br>
③、再要启动消费者,8080<br>
④、查看消费者和生产者是否注册成功
http://localhost:7001/<br>
http://eureka7001.com:7001/<br>
http://localhost:7002/
http://eureka7002.com:7002/<br>
⑤、http://localhost:8080/consumer/payment/get/1<br>
ok
支付服务提供者8001集群环境构建<br>
参考cloud-provider-payment8001<br>
新建cloud-provider-payment8002<br>
改POM<br>
写YML<br>
主启动<br>
业务类<br>
直接从8001粘
修改8001/8002的Controller<br>
8001<br>
8002<br>
负载均衡<br>
①、bug
订单服务(cloud-consumer-order8080) OrderController类中 访问地址不能写死<br>
②、bug
订单服务(cloud-consumer-order8080) ApplicationContextConfig中不添加@LoadBalanced报异常
③、使用@LoadBalanced注解赋予RestTemplate负载均衡的能力<br>
订单服务(cloud-consumer-order8080) ApplicationContextConfig中修改
提前说一下Ribbon的负载均衡功能
测试02
先要启动EurekaServer,7001/7002服务
再要启动服务提供者provider,8001/8002服务<br>
http://localhost:8080/consumer/payment/get/1<br>
结果
负载均衡效果达到<br>
8001/8002端口交替出现<br>
Ribbon和Eureka整合后Consumer可以直接调用服务而不用再关心地址和端口号,且该服务还有负载功能了。O(∩_∩)O<br>
actuator微服务信息完善
主机名称:服务名称修改<br>
解决的问题:含有主机名
修改cloud-provider-payment8001<br>
YML
修改部分
完整内容<br>
修改之前 localhost:cloud-payment-service:8001<br>
修改之后 payment8001
访问信息有IP信息提示<br>
解决的问题:没有IP提示
修改cloud-provider-payment8001<br>
YML
修改部分
完整内容<br>
修改之前 http://localhost:8001/actuator/info<br>
修改之后 http://172.:8001/actuator/info<br>
服务发现Discovery<br>
对于注册进eureka里面的微服务,可以通过服务发现来获得该服务的信息
修改cloud-provider-payment8001的Controller<br>
8001主启动类<br>
@EnableDiscoveryClient
自测<br>
先要启动EurekaServer
再启动8001主启动类,需要稍等一会儿<br>
http://localhost:8001/payment/discovery<br>
Eureka自我保护
故障现象
导致原因<br>
一句话:某时刻某一个微服务不可用了,Eureka不会立刻清理,依旧会对该微服务的信息进行保存
属于CAP里面的AP分支<br>
怎么禁止自我保护<br>
注册中心eureakeServer端7001
出厂默认,自我保护机制是开启的
eureka.server.enable-self-preservation=true<br>
使用eureka.server.enable-self-preservation = false 可以禁用自我保护模式<br>
关闭效果<br>
在eurekaServer端7001处设置关闭自我保护机制<br>
生产者客户端eureakeClient端8001
默认
eureka.instance.lease-renewal-interval-in-seconds=30
单位为秒(默认是30秒)
eureka.instance.lease-expiration-duration-in-seconds=90<br>
单位为秒(默认是90秒)
配置<br>
测试<br>
7001和8001都配置完成
先启动7001再启动8001访问结果<br>
先关闭8001<br>
马上被删除了
6、Zookeeper服务注册与发现<br>
Eureka停止更新了你怎么办
https://github.com/Netflix/eureka/wiki
SpringCloud整合Zookeeper代替Eureka
Zookeeper Windows下载安装步骤地址
Windows环境下安装zookeeper 可参考:
https://blog.csdn.net/qq_33316784/article/details/88563482
http://www.manongjc.com/detail/6-gnqmxbkcmeasqxq.html
Windows环境下安装与使用
第一步:安装包下载路径 https://download.csdn.net/download/weixin_44954939/19235391
第二步:解压到常用的安装目录
第三步:将conf目录下的zoo_sample.cfg文件,复制一份,重命名为zoo.cfg
第四步:修改zoo.cfg配置文件
在配置文件中新增<br>dataDir=D:\\apache-zookeeper-3.6.3-bin\\data<br>dataLogDir=D:\\apache-zookeeper-3.6.3-bin\\logs
第五步:新建文件夹,需要在安装目录下面新建一个空的data文件夹和logs文件夹
第六步:zookeeper启动和控制台窗口
zookeeper启动
控制台窗口
Windows环境下zookeeper常用命令操作:
https://blog.csdn.net/zhangphil/article/details/100010629
注册中心Zookeeper
zookeeper是一个分布式协调工具,可以实现注册中心功能
关闭Linux服务器防火墙后启动zookeeper服务器
zookeeper服务器取代Eureka服务器,zk作为服务注册中心
服务提供者
新建cloud-provider-payment8004<br>
POM<br>
YML<br>
主启动类<br>
Controller<br>
启动8004注册进zookeeper<br>
启动后问题:zookeeper版本jar包冲突问题<br>
why<br>
解决zookeeper版本jar包冲突问题
排出zk冲突后的新POM
验证测试1<br>
http://localhost:8004/payment/zk<br>
验证测试2<br>
获得json串后用在线工具查看试试
linux环境下zookeeper
windows环境下zookeeper
思考<br>
服务节点是临时节点还是持久节点
ls /services/cloud-provider-payment
服务消费者
新建cloud-consumerzk-order8080<br>
POM
YML
主启动<br>
业务类<br>
配置Bean
Controller
验证测试
linux环境下zookeeper
windows环境下zookeeper
访问测试地址<br>
http://localhost:8080/consumer/payment/zk<br>
7、Consul服务注册与发现<br>
Consul简介
是什么
https://www.consul.io/intro/index.html
能干嘛<br>
服务发现
提供HTTP和DNS两种发现方式。
健康监测<br>
支持多种方式,HTTP、TCP、Docker、Shell脚本定制化监控
KV存储
Key、Value的存储方式
多数据中心<br>
Consul支持多数据中心
可视化Web界面
下载和安装<br>
①、下载地址<br>
https://www.consul.io/downloads.html<br>
②、windows版下载后的文件(你可以选择任何系统)
③、配置环境变量
添加 计算机 右键 属性 高级属性设置环境变量设置<br>在path下加上:D:\consul_1.9.5_windows_amd64<br>
④、启动
第一步:Consul 默认启动为 dev 模式<br>
第二步:consul agent -dev<br>
⑤、校验
输入网址:http://localhost:8500<br>
怎么玩
https://www.springcloud.cc/spring-cloud-consul.html
安装并运行Consul
官网安装说明
https://learn.hashicorp.com/consul/getting-started/install.html
下载完成后只有一个consul.exe文件,<br>硬盘路径下双击运行,查看版本号信息
consul -version
使用开发模式启动
consul agent -dev<br>
通过以下地址可以访问Consul的首页:http://localhost:8500<br>
结果页面
服务提供者
新建Module支付服务provider8006
cloud-providerconsul-payment8006<br>
POM<br>
YML<br>
主启动类<br>
业务类Controller<br>
验证测试<br>
http://localhost:8006/payment/consul<br>
http://localhost:8500/ui/dc1/services<br>
服务消费者<br>
新建Module消费服务order8080
cloud-consumerconsul-order8080<br>
POM<br>
YML
主启动类<br>
配置Bean<br>
Controller<br>
验证测试<br>
http://localhost:8080/consumer/payment/consul<br>
http://localhost:8500/ui/dc1/services<br>
三个注册中心异同点
CAP
C:Consistency(强一致性)
A:Availability(可用性)<br>
P:Partition tolerance(分区容错性)<br>
CAP理论关注粒度是数据,而不是整体系统设计的策略<br>
经典CAP图
AP(Eureka)<br>
CP(Zookeeper/Consul)
8、Ribbon负载均衡服务器调用<br>
概述
是什么<br>
官网资料<br>
https://github.com/Netflix/ribbon/wiki/Getting-Started
Ribbon目前也进入维护模式
未来替换方案
能干吗
LB(负载均衡)
集中式LB
进程内LB<br>
前面我们讲解过了8080通过轮询负载访问8001/8002<br>
一句话<br>
负载均衡+RestTemplate调用
Ribbon负载均衡演示<br>
架构说明
总结:Ribbon其实就是一个软负载均衡的客户端组件,<br>他可以和其他所需请求的客户端结合使用,和eureka结合只是其中的一个实例。
POM<br>
二说RestTemplate的使用<br>
官网
https://docs.spring.io/spring-framework/docs/5.2.2.RELEASE/javadoc-api/org/springframework/web/client/RestTemplate.html
getForObject方法/getForEntity方法<br>
案例代码
postForObject/postForEntity<br>
GET请求方法<br>
POST请求方法<br>
Ribbon核心组件IRule<br>
IRule:根据特定算法中从服务列表中选取一个要访问的服务
com.netflix.loadbalancer.RoundRobinRule<br>
轮询 (ruang 的 ruai 本如)<br>
com.netflix.loadbalancer.RandomRule<br>
随机
com.netflix.loadbalancer.RetryRule<br>
先按照RoundRobinRule的策略获取服务,如果获取服务失败则在指定时间内会进行重试,获取可用的服务
WeightedResponseTimeRule<br>
对RoundRobinRule的扩展,响应速度越快的实例选择权重越大,越容易被选择
BestAvailableRule<br>
会先过滤掉由于多次访问故障而处于断路器跳闸状态的服务,然后选择一个并发量最小的服务
AvailabilityFilteringRule<br>
先过滤掉故障实例,再选择并发较小的实例
ZoneAvoidanceRule<br>
默认规则,复合判断server所在区域的性能和server的可用性选择服务器
如何替换
修改cloud-consumer-order80
注意配置细节<br>
①
②
新建package <br>
com.wtl.myrule<br>
上面包下新建MySelfRule规则类<br>
主启动类添加@RibbonClient<br>
测试<br>
http://localhost:8080/consumer/payment/get/1<br>
Ribbon负载均衡算法
原理
RoundRobinRule源码<br>
手写
自己试着写一个本地负载均衡器试试
7001/7002集群启动
8001/8002微服务改造
controller
8080订单微服务改造
①、ApplicationContextBean去掉注解@LoadBalanced<br>
②、新建com.wtl.springcloud.lb<br>
③、LoadBalancer接口
④、新建com.wtl.springcloud.lb.impl<br>
⑤、LoadBalancerImpl<br>
⑥、OrderController<br>
⑦、测试
http://localhost:8080/consumer/payment/lb
9、OpenFeign服务接口调用<br>
概述
OpenFeign是什么
Feign是一个声明式的Web服务客户端,让编写Web服务客户端变得非常容易,只需创建一个接口并在接口上添加注解即可
GitHub
https://github.com/spring-cloud/spring-cloud-openfeign
能干嘛<br>
Feign和OpenFeign两者区别
OpenFeign使用步骤
接口+注解
微服务调用接口+@FeignClient
新建cloud-consumer-feign-order8080<br>
Feign在消费端使用
POM<br>
YML<br>
主启动<br>
@EnableFeignClients
业务类<br>
EnableFeignClients
新建PaymentFeignService接口并新增注解@FeignClient<br>
@FeignClient
控制层Controller<br>
测试<br>
先启动2个eureka集群7001/7002
再启动2个微服务8001/8002<br>
启动OpenFeign启动:cloud-consumer-feign-order8080<br>
http://localhost:8080/orderFeign/consumer/payment/get/1<br>
Feign自带负载均衡配置项<br>
小总结<br>
OpenFeign超时控制<br>
超时设置,故意设置超时演示出错情况
服务提供方8001故意写暂停程序 controller<br>
服务消费方8080添加超时方法PaymentFeignService<br>
服务消费方8080添加超时方法OrderFeignController
测试<br>
http://localhost:8080/orderFeign/consumer/payment/feign/timeout<br>
错误页面
OpenFeign默认等待1秒钟,超过后报错
是什么
OpenFeign默认支持Ribbon
服务消费方8080、YML文件里需要开启OpenFeign客户端超时控制
OpenFeign日志打印功能
日志打印功能
是什么<br>
日志级别<br>
配置日志bean<br>
YML文件里需要开启日志的Feign客户端<br>
http://localhost:8080/orderFeign/consumer/payment/get/1
后台日志查看<br>
10、Hystrix断路器<br>
概述<br>
分布式系统面临的问题
是什么
能干嘛
服务降级
服务熔断<br>
接近实时的监控<br>
。。。。。。
官网资料<br>
https://github.com/Netflix/Hystrix/wiki/How-To-Use
Hystrix官宣,停更进维<br>
https://github.com/Netflix/Hystrix
被动修复bugs
不再接受合并请求
不再发布新版本
Hystrix重要概念
服务降级 fallback<br>
服务器忙,请稍后再试,不让客户端等待并立刻返回一个友好提示,fallback
哪些情况会出发降级
程序运行异常
超时<br>
服务熔断触发服务降级<br>
线程池/信号量打满也会导致服务降级
服务熔断 break<br>
类比保险丝达到最大服务访问后,直接拒绝访问,拉闸限电,然后调用服务降级的方法并返回友好提示
就是保险丝
服务的降级->进而熔断->恢复调用链路
服务限流 flowlimit<br>
秒杀高并发等操作,严禁一窝蜂的过来拥挤,大家排队,一秒钟N个,有序进行
Hystrix案例
构建
新建cloud-provider-hystrix-payment8001<br>
POM<br>
YML<br>
主启动<br>
业务类<br>
service
controller<br>
正常测试<br>
①、启动eureka7001
②、启动cloud-provider-hystrix-payment8001<br>
③、访问<br>
success的方法<br>
http://localhost:8001/payment/hystrix/ok/1<br>
每次调用耗费3秒钟<br>
http://localhost:8001/payment/hystrix/timeout/1<br>
上述module均OK
以上述为根基平台,从正确->错误->降级熔断->恢复
高并发测试<br>
上述在非高并发情形下,还能勉强满足 but......
Jmeter安装和使用
Jmeter 下载路径
https://download.csdn.net/download/weixin_44954939/19763454
Jmeter 启动
D:\apache-jmeter-5.1.1\binjmeter.bat<br>
Jmeter 使用
新建线程组
Jmeter压测测试<br>
①、开启Jmeter,来20000个并发压死8001,20000个请求都去访问paymentInfo_TimeOut服务
1、新建线程组
2、线程组数据信息配置
②、再来一个访问<br>
1、Jmeter 新建 HTTP请求
2、HTTP请求参数配置
③、浏览器再次访问 http://localhost:8001/payment/hystrix/ok/1
④、看演示结果<br>
两个都在自己转圈圈<br>
为什么会被卡死<br>
Jmeter压测结论<br>
上面还是服务提供者8001自己测试,假如此时外部的消费者8080也来访问,<br>那消费者只能干等,最终导致消费端8080不满意,服务端8001直接被拖死
看热闹不嫌弃事大,8080新建加入<br>
cloud-consumer-feign-hystrix-order8080<br>
新建
cloud-consumer-feign-hystrix-order8080
POM<br>
YML<br>
主启动<br>
业务类<br>
PaymentHystrixService
OrderHystirxController<br>
正常测试<br>
http://localhost:8080/consumer/payment/hystrix/ok/1
高并发测试
2W个线程压8001
消费端8080微服务再去访问正常的Ok微服务8001地址<br>
http://localhost:8080/consumer/payment/hystrix/ok/1<br>
消费者8080,o(╥﹏╥)o<br>
要么转圈圈等待<br>
要么消费端报超时错误<br>
故障现象和导致原因<br>
8001同一层次的其它接口服务被困死,因为tomcat线程池里面的工作线程已经被挤占完毕
8080此时调用8001,客户端访问响应缓慢,转圈圈
上诉结论<br>
正因为有上述故障或不佳表现<br>才有我们的降级/容错/限流等技术诞生
如何解决?解决的要求
超时导致服务器变慢(转圈)
超时不再等待
出错(宕机或程序运行出错)<br>
出错要有兜底
解决
对方服务(8001)超时了,调用者(8080)不能一直卡死等待,必须有服务降级
对方服务(8001)down机了,调用者(8080)不能一直卡死等待,必须有服务降级<br>
对方服务(8001)down机了,调用者(8080)不能一直卡死等待,必须有服务降级
服务降级<br>
降级配置
@HystrixCommand<br>
8001先从自身找问题<br>
设置自身调用超时时间的峰值,峰值内可以正常运行,<br>超过了需要有兜底的方法处理,作服务降级fallback<br>
8001fallback<br>
业务类启用<br>
@HystrixCommand报异常后如何处理<br>
一旦调用服务方法失败并抛出了错误信息后,<br>会自动调用@HystrixCommand标注好的<br>fallbackMethod调用类中的指定方法
图示
主启动类激活<br>
添加新注解@EnableCircuitBreaker<br>
测试
http://localhost:8001/payment/hystrix/timeout/1
8080fallback<br>
题外话,切记
我们自己配置过的热部署方式对java代码的改动明显,<br>但对@HystrixCommand内属性的修改建议重启微服务
8001业务类启用 PaymentService<br>
8080 YML<br>
8080 主启动<br>
@EnableHystrix<br>
8080 业务类
Controller
Service <br>
测试
http://localhost:8080/consumer/payment/hystrix/timeout/1
目前问题<br>
每个业务方法对应一个兜底的方法,代码膨胀<br>
统一和自定义的分开<br>
解决问题<br>
每个方法配置一个???膨胀<br>
feign接口系列<br>
@DefaultProperties(defaultFallback = "")<br>
说明
controller配置<br>
Controller中使用<br>
测试
http://localhost:8080/consumer/payment/hystrix/exception/2
和业务逻辑混一起???混乱<br>
服务降级,客户端去调用服务端,碰上服务端宕机或关闭
本次案例服务降级处理是在客户端80实现完成的,与服务端8001没有关系<br>只需要为Feign客户端定义的接口添加一个服务降级处理的实现类即可实现解耦<br>
未来我们要面对的异常
运行<br>
超时<br>
宕机<br>
再看我们的业务类PaymentController<br>
修改cloud-consumer-feign-hystrix-order8080<br>
根据cloud-consumer-feign-hystrix-order8080已经有的PaymentHystrixService接口,<br>重新新建一个类(PaymentFallbackService)实现该接口,统一为接口里面的方法进行异常处理<br>
PaymentFallbackService类实现PaymentHystrixService接口<br>
YML<br>
PaymentHystrixService接口<br>
测试
单个eureka先启动7001
PaymentHystrixMain8001启动<br>
OrderHystrixMain8080 启动<br>
正常访问测试<br>
http://localhost:8080/consumer/payment/hystrix/ok/1<br>
故意关闭微服务8001<br>
客户端自己调用提示<br>
此时服务端provider已经down了,但是我们做了服务降级处理,<br>让客户端在服务端不可用时也会获得提示信息而不会挂起耗死服务器
服务熔断<br>
断路器<br>
一句话就是家里的保险丝
熔断是什么<br>
大神论文<br>
https://martinfowler.com/bliki/CircuitBreaker.html
实操<br>
修改cloud-provider-hystrix-payment8001<br>
PaymentService<br>
why配置这些参数
PaymentController<br>
测试<br>
自测cloud-provider-hystrix-payment8001<br>
正确<br>
http://localhost:8001/payment/circuit/1<br>
错误<br>
http://localhost:8001/payment/circuit/-1<br>
一次正确一次错误 try try<br>
重点测试<br>
多次进行错误请求测试,直到正确的请求后也错误 测试成功,然后在进行多次的正确请求、直到正确请求成功...
原理(小总结)<br>
大神结论<br>
熔断类型<br>
熔断打开<br>
请求不再进行调用当前服务,内部设置时钟一般为MTTR(平均故障处理时间),当打开时长达到所设时钟则进入半熔断状态<br>
熔断关闭<br>
熔断关闭不会对服务进行熔断
熔断半开<br>
部分请求根据规则调用当前服务,如果请求成功且符合规则则认为当前服务恢复正常,关闭熔断
官网断路器流程图<br>
官网步骤
断路器在什么情况下开始起作用<br>
断路器开启或者关闭的条件<br>
1、当满足一定的阀值的时候(默认10秒内超过20个请求次数)
2、当失败率达到一定的时候(默认10秒内超过50%的请求失败)<br>
3、到达以上阀值,断路器将会开启<br>
4、当开启的时候,所有请求都不会进行转发<br>
5、一段时间之后(默认是5秒),这个时候断路器是半开状态,会让其中一个请求进行转发。<br>如果成功,断路器会关闭,若失败,继续开启。重复第4 和 第5步
断路器打开之后<br>
All配置<br>
服务限流
后面高级篇讲解alibaba的Sentinel说明
Hystrix工作流程
https://github.com/Netflix/Hystrix/wiki/How-it-Works
Hystrix工作流程<br>
官网图例<br>
蓝色:调用路径
红色:返回路径
完整的请求路线:
1、选择一个Hystrix注册方式
2、二选一即可<br>
3、判断缓存中是否包含需要返回的内容(如果有直接返回)<br>
4、断路器是否为打开状态(如果是,直接跳转到8,返回)
5、断路器为健康状态,判断是否有可用资源(没有,直接跳转8)
6、构造方法和Run方法
7、将正常,超时,异常的消息发送给断路器
8、调用getFallback方法,也就是服务降级
9、直接返回正确结果
步骤说明<br>
服务监控HystrixDashboard
概述<br>
仪表盘9001<br>
新建cloud-consumer-hystrix-dashboard9001<br>
POM<br>
YML<br>
HystrixDashboardMain9001+新注解@EnableHystrixDashboard<br>
所有Provider微服务提供类(8001/8002/8003)都需要监控依赖配置<br>
启动cloud-consumer-hystrix-dashboard9001该微服务后续将监控微服务8001
http://localhost:9001/hystrix<br>
断路器演示(服务监控hystrixDashboard)<br>
修改cloud-provider-hystrix-payment8001<br>
1、pom.xml中一定要有这两个依赖
2、注意:新版本Hystrix需要在主启动类 MainAppHystrix8001中指定监控路径
3、Unable to connect to Command Metric Stream.<br>
4、404<br>
监控测试<br>
启动1个eureka或者3个eureka集群均可
观察监控窗口<br>
9001监控8001<br>
填写监控地址<br>
http://localhost:8001/hystrix.stream<br>
测试地址<br>
http://localhost:8001/payment/circuit/1<br>
http://localhost:8001/payment/circuit/-1<br>
上述测试通过<br>
ok
先访问正确地址,再访问错误地址,再正确地址,会发现图示断路器都是慢慢放开的。<br>
监控结果,成功
监控结果,失败<br>
如何看?<br>
7色<br>
1圈<br>
1线<br>
整图说明<br>
如图所示:
整图说明2<br>
如图所示:
搞懂一个才能看懂复杂的<br>
如图所示:
11、Zuul路由网关<br>
概述简介<br>
官网资料<br>
https://github.com/Netflix/zuul/wiki/Getting-Started<br>
https://cloud.spring.io/spring-cloud-static/spring-cloud-netflix/2.2.1.RELEASE/reference/html/#router-and-filter-zuul<br>
是什么<br>
能干嘛<br>
路由<br>
过滤<br>
负载均衡<br>
灰度发布<br>
又称金丝雀发布<br>
路由基本配置<br>
功能<br>
路由功能负责将外部请求转发到具体的服务实例上去,是实现统一访问入口的基础<br>
新建Module模块cloud-zuul-gateway9527<br>
POM<br>
YML<br>
hosts修改<br>
127.0.0.1 myzuul.com
主启动类<br>
@EnableZuulProxy
启动<br>
三个eureka集群<br>
一个服务提供类microservicecloud-provider-dept-8001<br>
一个路由<br>
测试<br>
不用路由<br>
http://localhost:8001/paymentInfo<br>
启用路由<br>
zuul映射配置+注册中心注册后对外暴露的服务名称+rest调用地址<br>
http://myzuul.com:9527/cloud-provider-payment/paymentInfo<br>
路由访问映射规则<br>
工程microservicecloud-zuul-gateway-9527<br>
代理名称<br>
YML<br>
此时问题<br>
路由访问OK<br>
http://myzuul.com:9527/weixin/paymentInfo<br>
原路径访问OK<br>
http://myzuul.com:9527/cloud-provider-payment/paymentInfo
如果不想使用默认的路由规则,可以添加以下配置来忽略默认路由配置<br>
原有真实服务名忽略<br>
YML<br>
上一步配置后,cloud-provider-payment就不行了<br>
http://myzuul.com:9527/cloud-provider-payment/paymentInfo
单个具体,多个可以用"*"<br>
路由转发和负载均衡功能<br>
服务提供者SMS短信模块<br>
建模块cloud-provider-sms8008<br>
POM<br>
YML<br>
业务类<br>
主启动<br>
启动8008并成功注册进eureka服务器上<br>
修改我们的zuul服务9527<br>
修改YML,体现路由转发和负载均衡<br>
YML<br>
由于Zuul自动集成了Ribbon和Hystrix,所以Zuul天生就有负载均衡和服务容错能力<br>
测试<br>
http://myzuul.com:9527/weixin/paymentInfo<br>
负载均衡<br>
http://myzuul.com:9527/mysms/sms<br>
路由转发<br>
微信服务找8001/8002<br>
短信服务找8008
设置统一公共前缀<br>
YML
http://myzuul.com:9527/atguigu/weixin/paymentInfo<br>
http://myzuul.com:9527/atguigu/mysms/sms<br>
http://myzuul.com:9527/atguigu/cloud-provider-payment/paymentInfo<br>
最后YML<br>
查看路由信息<br>
POM<br>
YML<br>
查看路由详细信息<br>
http://localhost:9527/actuator/routes
过滤器
功能<br>
过滤功能负责对请求过程进行额外的处理,是请求校验过滤及服务聚合的基础。<br>
过滤器的生命周期<br>
ZuulFilter<br>
过滤类型<br>
pre:在请求被路由到目标服务前执行,比如权限校验、打印日志等功能;<br>
routing:在请求被路由到目标服务时执行<br>
post:在请求被路由到目标服务后执行,比如给目标服务的响应添加头信息,收集统计数据等功能;<br>
error:请求在其他阶段发生错误时执行。<br>
过滤顺序<br>
数字小的先执行<br>
过滤是否开启<br>
shouldFilter方法为true走<br>
执行逻辑<br>
自己的业务逻辑
案例Case<br>
前置过滤器,用于在请求路由到目标服务前打印请求日志<br>
业务代码<br>
测试<br>
http://myzuul.com:9527/atguigu/mysms/sms<br>
在调用8008之前会打印日志<br>
开关,YML配置<br>
12、Gateway新一代网关<br>
概述简介<br>
官网<br>
上一代zuul 1.X<br>
https://github.com/Netflix/zuul/wiki<br>
当前gateway<br>
https://cloud.spring.io/spring-cloud-static/spring-cloud-gateway/2.2.1.RELEASE/reference/html/<br>
是什么<br>
概述<br>
一句话:<br>
SpringCloud Gateway 使用的Webflux中的reactor-netty响应式编程组件,底层使用了Netty通讯框架。<br>
源码架构<br>
能干嘛<br>
反向代理<br>
鉴权<br>
流量控制<br>
熔断<br>
日志监控<br>
。。。。。。<br>
微服务架构中网关在哪里<br>
有Zuul了怎么又出来了gateway<br>
我们为什么选择Gateway?<br>
1、neflix不太靠谱,zuul2.0一直跳票,迟迟不发布
2、SpringCloud Gateway具有如下特性<br>
如图所示
3、SpringCloud Gateway 与 Zuul的区别<br>
如图所示
Zuul1.x模型<br>
如图所示
GateWay模型<br>
WebFlux是什么<br>
https://docs.spring.io/spring/docs/current/spring-framework-reference/web-reactive.html#webflux-new-framework<br>
说明<br>
三大核心概念<br>
Route(路由)<br>
路由是构建网关的基本模块,它由ID,目标URI,一系列的断言和过滤器组成,如果断言为true则匹配该路由<br>
Predicate(断言)<br>
参考的是Java8的java.util.function.Predicate<br>开发人员可以匹配HTTP请求中的所有内容(例如请求头或请求参数),如果请求与断言相匹配则进行路由<br>
Filter(过滤)<br>
指的是Spring框架中GatewayFilter的实例,使用过滤器,可以在请求被路由前或者之后对请求进行修改。<br>
总体<br>
如图所示
Gateway工作流程<br>
官网总结<br>
如图所示
核心逻辑<br>
路由转发+执行过滤器链<br>
入门配置<br>
新建Module<br>
cloud-gateway-gateway9527<br>
POM<br>
YML<br>
业务类<br>
无<br>
主启动类<br>
9527网关如何做路由映射那???<br>
cloud-provider-payment8001看看controller的访问地址<br>
get<br>
lb<br>
我们目前不想暴露8001端口,希望在8001外面套一层9527<br>
YML新增网关配置<br>
测试<br>
启动7001<br>
启动8001<br>
cloud-provider-payment8001<br>
启动9527网关<br>
访问说明<br>
添加网关前<br>
http://localhost:8001/payment/get/1<br>
http://localhost:8001/payment/lb
添加网关后<br>
http://localhost:9527/payment/get/1
http://localhost:9527/payment/lb
YML配置说明<br>
Gateway网关路由有两种配置方式:<br>
在配置文件yml中配置<br>
见前面的步骤<br>
代码中注入RouteLocator的Bean<br>
官网案例<br>
如图实例
百度国内新闻网址,需要外网<br>
http://news.baidu.com/guonei<br>
自己写一个
百度新闻<br>
业务需求<br>
通过9527网关访问到外网的百度新闻网址<br>
编码<br>
cloud-gateway-gateway9527<br>
业务实现<br>
config<br>
测试
http://localhost:9527/
通过微服务名实现动态路由<br>
默认情况下Gateway会根据注册中心注册的服务列表,<br>以注册中心上微服务名为路径创建动态路由进行转发,从而实现动态路由的功能<br>
启动:<br>
一个eureka7001 + 两个服务提供者8001/8002<br>
POM<br>
YML<br>
需要注意的是uri的协议为lb,表示启用Gateway的负载均衡功能。
lb://serviceName是spring cloud gateway在微服务中自动为我们创建的负载均衡uri<br>
测试<br>
http://localhost:9527/payment/lb<br>
8001/8002两个端口切换
Predicate的使用<br>
是什么<br>
启动我们的gateway9527<br>
Route Predicate Factories这个是什么东东?<br>
如图所示
常用的Route Predicate<br>
①、After Route Predicate
YML<br>
http://localhost:9527/payment/lb
②、Before Route Predicate<br>
YML<br>
http://localhost:9527/payment/lb
③、Between Route Predicate<br>
YML
http://localhost:9527/payment/lb
④、Cookie Route Predicate<br>
不带cookies访问
curl http://localhost:9527/payment/lb<br>
带上cookies访问<br>
curl http://localhost:9527/payment/lb --cookie "username=wtl"
加入curl返回中文乱码 :Windows下安装使用Curl及解决中文乱码问题<br>
YML<br>
⑤、Header Route Predicate<br>
YML
curl http://localhost:9527/payment/lb -H "X-Request-Id:123"<br>
⑥、Host Route Predicate
YML
curl http://localhost:9527/payment/lb -H "Host:www.wtl.com"<br>
⑦、Method Route Predicate<br>
YML
curl http://localhost:9527/payment/lb -GET
⑧、Path Route Predicate<br>
YML
http://localhost:9527/payment/lb
⑨、Query Route Predicate<br>
YML
http://localhost:9527/payment/lb?username=123<br>
⑩、小总结
All<br>
说白了,Predicate就是为了实现一组匹配规则,<br>让请求过来找到对应的Route进行处理。<br>
Filter的使用<br>
是什么<br>
Spring Cloud Gateway的Filter<br>
生命周期,Only Two :业务逻辑之前和业务逻辑之后<br>
业务逻辑之前 pre<br>
业务逻辑之后 post<br>
种类,Only Two<br>
单一的 GatewayFilter,31种之多<br>
https://cloud.spring.io/spring-cloud-static/spring-cloud-gateway/2.2.1.RELEASE/reference/html/#gatewayfilter-factories
全局的 GlobalFilter,10种之多<br>
https://cloud.spring.io/spring-cloud-static/spring-cloud-gateway/2.2.1.RELEASE/reference/html/#global-filters<br>
常用的GatewayFilter<br>
AddRequestParameter<br>
如图所示
省略<br>
自定义过滤器<br>
自定义全局GlobalFilter<br>
两个主要接口介绍<br>
<font color="#0d47a1"><b>implements</b></font> <b><font color="#d32f2f">GlobalFilter</font>,Ordered</b><br>
能干嘛<br>
全局日志记录<br>
统一网关鉴权<br>
。。。。。。<br>
案例代码<br>
测试<br>
启动<br>
正确<br>
http://localhost:9527/payment/lb?uname=张三<br>
错误<br>
没有参数uname<br>
http://localhost:9527/payment/lb<br>
无法正常使用转发
13、SpringCloud Config <br> 分布式配置中心
概述<br>
分布式系统面临的---配置问题<br>
是什么<br>
能干嘛<br>
集中管理配置文件<br>
不同环境不同配置,动态化的配置更新,分环境部署比如dev/test/prod/beta/release<br>
运行期间动态调整配置,不再需要在每个服务部署的机器上编写配置文件,服务会向配置中心统一拉取配置自己的信息<br>
当配置发生变动时,服务不需要重启即可感知到配置的变化并应用新的配置<br>
将配置信息以REST接口的形式暴露
post、curl访问刷新均可......
与GitHub整合配置<br>
由于SpringCloud Config默认使用Git来存储配置文件(也有其它方式,比如支持SVN和本地文件),<br>但最推荐的还是Git,而且使用的是http/https访问的形式
官网<br>
https://cloud.spring.io/spring-cloud-static/spring-cloud-config/2.2.1.RELEASE/reference/html/
Config服务端配置 3344 与测试<br>
用你自己的账号在GitHub上新建一个名为springcloud-config的新Repository(<font color="#f44336">温馨提示:这里我用的gitee)</font><br>
如图所示 https://gitee.com/wtl0616/springcloud-config
由上一步获得刚新建的git地址<br>
git clone https://gitee.com/wtl0616/springcloud-config.git<br>
本地硬盘目录上新建git仓库并clone<br>
本地地址:E:\cloud2021\springcloud-config<br>
git命令<br>
git clone https://gitee.com/wtl0616/springcloud-config.git<br>
此时在本地E盘符下E:\cloud2021\springCloud-config<br>
表示多个环境的配置文件<br>
保存格式必须为UTF-8<br>
如果需要修改,此处模拟运维人员操作git和github
git add .
git commit -m "init yml"<br>
git push origin master<br>
E:\cloud2021\springcloud-config
新建Module模块 : cloud-config-center-3344<br>它即为Cloud的配置中心模块cloudConfig Center<br>
POM<br>
YML<br>
主启动类<br>
ConfigCenterMain3344<br>
@EnableConfigServer<br>
windows下修改hosts文件,增加映射<br>
C:\Windows\System32\drivers\etc
127.0.0.1 config-3344.com<br>
测试 : 通过Config微服务是否可以从GitHub上获取配置内容<br>
启动注册中心:cloud-eureka-server7001<br>
启动微服务:cloud-config-center-3344
http://config-3344.com:3344/master/config-dev.yml<br>
配置读取规则<br>
/{label}/{application}-{profile}.yml<br>
master分支<br>
http://config-3344.com:3344/master/config-dev.yml<br>
http://config-3344.com:3344/master/config-test.yml<br>
http://config-3344.com:3344/master/config-prod.yml<br>
dev分支<br>
http://config-3344.com:3344/dev/config-dev.yml<br>
http://config-3344.com:3344/dev/config-test.yml<br>
http://config-3344.com:3344/dev/config-prod.yml<br>
/{application}-{profile}.yml<br>
http://config-3344.com:3344/config-dev.yml<br>
http://config-3344.com:3344/config-test.yml<br>
http://config-3344.com:3344/config-prod.yml<br>
http://config-3344.com:3344/config-xxxx.yml(不存在的配置)<br>
/{application}/{profile}[/{label}]<br>
http://config-3344.com:3344/config/dev/master<br>
http://config-3344.com:3344/config/test/master<br>
http://config-3344.com:3344/config/test/dev<br>
重要配置细节总结<br>
成功实现了用SpringCloud Config通过GitHub获取配置信息<br>
Config客户端配置 3355 与测试<br>
新建cloud-config-client-3355<br>
POM<br>
bootstrap.yml<br>
是什么<br>
内容<br>
说明<br>
修改config-dev.yml配置并提交到GitHub中,比如加个变量age或者版本号version<br>
主启动<br>
类ConfigClientMain3355<br>
业务类<br>
测试<br>
启动Config配置中心3344微服务并自测<br>
http://config-3344.com:3344/master/config-prod.yml<br>
http://config-3344.com:3344/master/config-dev.yml<br>
启动3355作为Client准备访问<br>
http://localhost:3355/configInfo<br>
成功实现了客户端3355访问SpringCloud Config3344通过GitHub获取配置信息<br>
问题随时而来,分布式配置的动态刷新问题<br>
Linux运维修改GitHub上的配置文件内容做调整<br>
刷新3344,发现ConfigServer配置中心立刻响应<br>
刷新3355,发现ConfigClient客户端没有任何响应<br>
3355没有变化除非自己重启或者重新加载<br>
难到每次运维修改配置文件,客户端都需要重启??噩梦<br>
Config客户端之动态刷新<br>
避免每次更新配置都要重启客户端微服务3355<br>
动态刷新<br>
步骤<br>
修改3355模块<br>
POM引入actuator监控<br>
修改YML,暴露监控端口<br>
@RefreshScope业务类Controller修改<br>
此时修改github---> 3344 ---->3355<br>
http://localhost:3355/configInfo<br>
3355改变没有???<br>
没有,/(ㄒoㄒ)/~~
How<br>
需要运维人员发送Post请求刷新3355<br>
必须是POST请求<br>
curl -X POST "http://localhost:3355/actuator/refresh"<br>
再次<br>
http://localhost:3355/configInfo<br>
OK,O(∩_∩)O<br>
成功实现了客户端3355刷新到最新配置内容<br>
避免了服务重启<br>
想想还有什么问题?<br>
假如有多个微服务客户端3355/3366/3377。。。。。。<br>
每个微服务都要执行一次post请求,手动刷新?<br>
可否广播,一次通知,处处生效?<br>
我们想大范围的自动刷新,求方法
Config本地模拟真实项目配置
Config服务端配置 3344 本地项目
application.yml
项目结构
sm-config-dev.yml
http://localhost:3344/master/sm-config-dev.yml
Config客户端配置 3355 本地项目
bootstrap.yml<br>
http://localhost:3355/configInfo
此时修改3344 ---->3355
重启3344<br>
http://localhost:3355/configInfo<br>
3355改变没有???<br>
需要运维人员发送Post请求刷新3355
必须是POST请求
curl -X POST "http://localhost:3355/actuator/refresh"<br>
14、SpringCloud Bus<br> 消息总线
概述<br>
上一讲解的加深和扩充,一言以蔽之<br>
分布式自动刷新配置功能<br>
Spring Cloud Bus 配合 Spring Cloud Config 使用可以实现配置的动态刷新。
是什么<br>
Bus支持两种消息代理:RabbitMQ 和 Kafka
能干嘛<br>
为何被称为总线<br>
RabbitMQ环境配置<br>
安装Erlang,下载地址:<br>
http://erlang.org/download/otp_win64_21.3.exe<br>
小编博客免费下载地址:
https://download.csdn.net/download/weixin_44954939/19869656
步骤<br>
直接下一步就可以
安装RabbitMQ,下载地址:<br>
https://github.com/rabbitmq/rabbitmq-server/releases/download/v3.7.9-rc.3/rabbitmq-server-3.7.9-rc.3.exe
官网地址 http://www.rabbitmq.com/install-windows.html
小编博客免费下载地址:
https://download.csdn.net/download/weixin_44954939/19869640
步骤<br>
直接下一步就可以
环境配置也可参考
https://developers.blog.csdn.net/article/details/100892294
Erlang 环境变量配置
安装目录
如图所示
新建 ERLANG_HOME
ERLANG_HOME
配置 path
%ERLANG_HOME%\bin
RabbitMQ 环境变量配置<br>
安装目录
如图所示
新建 RABBITMQ_SERVER
RABBITMQ_SERVER
配置 path
%RABBITMQ_SERVER%\sbin
验证环境配置完成
快捷键 Win + R 输入 cmd 打开命令行窗口输入 rabbitmq-service 验证环境配置完成
启动 RabbitMQ 输入以下命令启动管理功能<br>
D:\rabbitmq-server-3.7.9-rc\rabbitmq_server-3.7.9-rc.3\sbin
cmd
rabbitmq-plugins enable rabbitmq_management<br>
测试 RabbitMQ 可视化插件 访问地址查看<br>
http://localhost:15672/<br>
输入账号密码并登录:guest guest<br>
SpringCloud Bus动态刷新全局广播<br>
必须先具备良好的RabbitMQ环境先<br>
演示广播效果,增加复杂度,再以3355为模板再制作一个3366<br>
新建 cloud-config-client-3366<br>
POM<br>
YML<br>
主启动<br>
controller<br>
设计思想<br>
1)利用消息总线触发一个客户端/bus/refresh,而刷新所有客户端的配置<br>
2)利用消息总线触发一个服务端ConfigServer的/bus/refresh端点,而刷新所有客户端的配置<br>
图二的架构显然更加适合,图一不适合的原因如下<br>
打破了微服务的职责单一性,因为微服务本身是业务模块,它本不应该承担配置刷新的职责。
破坏了微服务各节点的对等性。<br>
有一定的局限性。例如,微服务在迁移时,它的网络地址常常会发生变化,此时如果想要做到自动刷新,那就会增加更多的修改
给cloud-config-center-3344配置中心服务端添加消息总线支持<br>
POM<br>
YML<br>
给cloud-config-client-3355客户端添加消息总线支持<br>
POM<br>
YML<br>
给cloud-config-client-3366客户端添加消息总线支持<br>
POM<br>
YML<br>
测试<br>
运维工程师<br>
修改Github上配置文件增加版本号<br>
发送POST请求<br>
curl -X POST "http://localhost:3344/actuator/bus-refresh"<br>
一次发送,处处生效<br>
配置中心<br>
http://config-3344.com:3344/config-dev.yml
客户端<br>
http://localhost:3355/configInfo<br>
http://localhost:3366/configInfo<br>
获取配置信息,发现都已经刷新了<br>
一次修改,广播通知,处处生效<br>
O(∩_∩)O
SpringCloud Bus动态刷新定点通知
不想全部通知,只想定点通知<br>
只通知3355<br>
不通知3366<br>
简单一句话<br>
指定具体某一个实例生效而不是全部 <br>
公式:http://localhost:配置中心的端口号/actuator/bus-refresh/{destination}<br>
destination:服务名称+端口号<br>
/bus/refresh请求不再发送到具体的服务实例上,而是发给config server并<br>通过destination参数类指定需要更新配置的服务或实例<br>
案例<br>
我们这里以刷新运行在3355端口上的config-client为例<br>
只通知3355<br>
不通知3366<br>
curl -X POST "http://localhost:3344/actuator/bus-refresh/config-client:3355"<br>
通知总结All<br>
15、SpringCloud Stream<br> 消息驱动
消息驱动概述<br>
是什么<br>
一句话
屏蔽底层消息中间件的差异,降低切换成本,统一消息的编程模型<br>
官网<br>
https://spring.io/projects/spring-cloud-stream#overview<br>
https://cloud.spring.io/spring-cloud-static/spring-cloud-stream/3.0.1.RELEASE/reference/html/<br>
Spring Cloud Stream中文指导手册
https://m.wang1314.com/doc/webapp/topic/20971999.html
设计思想<br>
标准MQ<br>
生产者/消费者之间靠消息媒介传递信息内容<br>
Message<br>
消息必须走特定的通道<br>
消息通道MessageChannel<br>
消息通道里的消息如何被消费呢,谁负责收发处理<br>
消息通道MessageChannel的子接口SubscribableChannel,由MessageHandler消息处理器所订阅<br>
为什么用Cloud Stream<br>
stream凭什么可以统一底层差异?<br>
Binder<br>
INPUT对应于消费者<br>
OUTPUT对应于生产者
Stream中的消息通信方式遵循了发布-订阅模式<br>
Topic主题进行广播<br>
在RabbitMQ就是Exchange<br>
在Kakfa中就是Topic<br>
Spring Cloud Stream标准流程套路<br>
Binder<br>
很方便的连接中间件,屏蔽差异<br>
Channel<br>
通道,是队列Queue的一种抽象,在消息通讯系统中就是实现存储和转发的媒介,通过Channel对队列进行配置<br>
Source和Sink<br>
简单的可理解为参照对象是Spring Cloud Stream自身,<br>从Stream发布消息就是输出,接受消息就是输入。<br>
编码API和常用注解<br>
案例说明<br>
RabbitMQ环境已经OK<br>
工程中新建三个子模块<br>
cloud-stream-rabbitmq-provider8801, 作为生产者进行发消息模块<br>
cloud-stream-rabbitmq-consumer8802,作为消息接收模块<br>
cloud-stream-rabbitmq-consumer8803 作为消息接收模块<br>
消息驱动之生产者<br>
新建Module : cloud-stream-rabbitmq-provider8801<br>
POM<br>
YML<br>
主启动类StreamMQMain8801<br>
业务类<br>
发送消息接口<br>
发送消息接口实现类<br>
Controller<br>
测试<br>
启动7001eureka<br>
启动rabbitmq<br>
rabbitmq-plugins enable rabbitmq_management<br>
http://localhost:15672/<br>
启动8801<br>
访问<br>
http://localhost:8801/sendMessage<br>
消息驱动之消费者<br>
新建Module : cloud-stream-rabbitmq-consumer8802<br>
POM<br>
YML<br>
主启动类StreamMQMain8802<br>
业务类<br>
测试8801发送8802接收消息<br>
http://localhost:8801/sendMessage<br>
分组消费与持久化<br>
依照8802,clone出来一份运行8803<br>
cloud-stream-rabbitmq-consumer8803<br>
POM<br>
YML<br>
主启动类<br>
业务类<br>
启动<br>
RabbitMQ<br>
7001<br>
服务注册<br>
8801<br>
消息生产<br>
8802<br>
消息消费<br>
8803<br>
消息消费<br>
运行后有两个问题<br>
有重复消费问题<br>
消息持久化问题<br>
消费<br>
目前是8802/8803同时都收到了,存在重复消费问题<br>
http://localhost:8801/sendMessage
如何解决<br>
分组和持久化属性group<br>
重要
生产实际案例<br>
分组<br>
原理<br>
微服务应用放置于同一个group中,就能够保证消息只会被其中一个应用消费一次。<br>不同的组是可以消费的,同一个组内会发生竞争关系,只有其中一个可以消费。<br>
8802/8803都变成不同组,group两个不同<br>
group: atguiguA、atguiguB<br>
8802修改YML<br>
8803修改YML<br>
我们自己配置<br>
结论
还是重复消费<br>
8802/8803实现了轮询分组,每次只有一个消费者<br>8801模块的发的消息只能被8802或8803其中一个接收到,这样避免了重复消费。<br>
8802/8803都变成相同组,group两个相同<br>
group: atguiguA<br>
8802修改YML<br>
8803修改YML<br>
结论<br>
同一个组的多个微服务实例,每次只会有一个拿到
持久化<br>
通过上述,解决了重复消费问题,再看看持久化<br>
停止8802/8803并去除掉8802的分组group: atguiguA<br>
8803的分组group: atguiguA没有去掉<br>
8801先发送4条消息到rabbitmq<br>
先启动8802,无分组属性配置,后台没有打出来消息<br>
再启动8803,有分组属性配置,后台打出来了MQ上的消息<br>
16、SpringCloud Sleuth<br> 分布式请求链路跟踪
概述<br>
为什么会出现这个技术?<br>需要解决哪些问题?<br>
问题<br>
是什么<br>
https://github.com/spring-cloud/spring-cloud-sleuth<br>
Spring Cloud Sleuth提供了一套完整的服务跟踪的解决方案<br>
在分布式系统中提供追踪解决方案并且兼容支持了zipkin<br>
解决<br>
搭建链路监控步骤<br>
1、zipkin<br>
下载<br>
SpringCloud从F版起已不需要自己构建Zipkin Server了,只需调用jar包即可<br>
https://dl.bintray.com/openzipkin/maven/io/zipkin/java/zipkin-server/<br>
zipkin-server-2.12.9-exec.jar<br>
运行jar<br>
运行控制台<br>
http://localhost:9411/zipkin/<br>
术语<br>
完整的调用链路 <br>
上图what<br>
名词解释<br>
Trace:类似于树结构的Span集合,表示一条调用链路,存在唯一标识<br>
span:表示调用链路来源,通俗的理解span就是一次请求信息
2、服务提供者<br>
cloud-provider-payment8001<br>
POM<br>
YML<br>
业务类PaymentController<br>
3、服务消费者(调用方)<br>
cloud-consumer-order80<br>
POM<br>
YML<br>
业务类OrderController<br>
4、依次启动eureka7001/8001/80<br>
80调用8001几次测试下
5、打开浏览器访问:http://localhost:9411
会出现以下界面<br>
查看<br>
查看依赖关系<br>
原理<br>
17、SpringCloud Alibaba<br> 入门简介
why会出现SpringCloud alibaba<br>
Spring Cloud Netflix项目进入维护模式<br>
https://spring.io/blog/2018/12/12/spring-cloud-greenwich-rc1-available-now
说明<br>
Spring Cloud Netflix Projects Entering Maintenance Mode<br>
什么是维护模式<br>
进入维护模式意味着什么呢?<br>
SpringCloud alibaba带来了什么<br>
是什么<br>
能干嘛<br>
去哪下<br>
https://github.com/alibaba/spring-cloud-alibaba/blob/master/README-zh.md<br>
怎么玩<br>
SpringCloud alibaba学习资料获取<br>
官网<br>
https://spring.io/projects/spring-cloud-alibaba#overview<br>
英文<br>
https://github.com/alibaba/spring-cloud-alibaba<br>
https://spring-cloud-alibaba-group.github.io/github-pages/greenwich/spring-cloud-alibaba.html<br>
中文<br>
https://github.com/alibaba/spring-cloud-alibaba/blob/master/README-zh.md<br>
18、SpringCloud Alibaba<br> Nacos服务注册和配置中心
Nacos简介
为什么叫Nacos<br>
前四个字母分别为Naming和Configuration的前两个字母,最后的s为Service。<br>
是什么<br>
一个更易于构建云原生应用的动态服务发现、配置管理和服务管理平台。<br>
Nacos: Dynamic Naming and Configuration Service<br>
Nacos就是注册中心 + 配置中心的组合<br>
等价于<br>
Nacos = Eureka+Config +Bus
能干嘛<br>
替代Eureka做服务注册中心<br>
替代Config做服务配置中心<br>
去哪下<br>
https://github.com/alibaba/Nacos<br>
官网文档<br>
https://nacos.io/zh-cn/index.html<br>
https://spring-cloud-alibaba-group.github.io/github-pages/greenwich/spring-cloud-alibaba.html#_spring_cloud_alibaba_nacos_discovery<br>
各种注册中心比较<br>
安装并运行Nacos<br>
本地Java8+Maven环境已经OK<br>
先从官网下载Nacos<br>
https://github.com/alibaba/nacos/releases<br>
如图所示
解压安装包,直接运行bin目录下的startup.cmd<br>
如图所示
命令运行成功后直接访问http://localhost:8848/nacos<br>
默认账号密码都是nacos
结果页面
Nacos作为服务注册中心演示<br>
官网文档<br>
https://spring-cloud-alibaba-group.github.io/github-pages/greenwich/spring-cloud-alibaba.html#_spring_cloud_alibaba_nacos_config
基于Nacos的服务提供者<br>
新建Module : cloudalibaba-provider-payment9001<br>
POM<br>
父POM
本模块POM<br>
YML<br>
主启动<br>
业务类<br>
测试<br>
http://localhost:9001/payment/nacos/1<br>
nacos控制台<br>
nacos服务注册中心+服务提供者9001都OK了<br>
为了下一章节演示nacos的负载均衡,参照9001新建9002<br>
新建cloudalibaba-provider-payment9002<br>
9002其它步骤你懂的<br>
或者取巧不想新建重复体力劳动,直接拷贝虚拟端口映射<br>
基于Nacos的服务消费者<br>
新建Module : cloudalibaba-consumer-nacos-order83<br>
POM<br>
为什么nacos支持负载均衡<br>
YML<br>
主启动<br>
业务类<br>
ApplicationContextBean
OrderNacosController<br>
测试<br>
nacos控制台<br>
http://localhost:83/consumer/payment/nacos/13<br>
83访问9001/9002,轮询负载OK
服务注册中心对比<br>
各种注册中心对比<br>
Nacos全景图所示<br>
Nacos和CAP<br>
切换<br>
Nacos 支持AP和CP模式的切换<br>
Nacos作为服务配置中心演示<br>
Nacos作为配置中心-基础配置<br>
cloudalibaba-config-nacos-client3377<br>
POM<br>
YML<br>
why配置两个<br>
YML<br>
bootstrap<br>
application<br>
主启动<br>
业务类<br>
ConfigClientController<br>
@RefreshScope<br>
在Nacos中添加配置信息<br>
Nacos中的匹配规则<br>
理论<br>
Nacos中的dataid的组成格式及与SpringBoot配置文件中的匹配规则<br>
官网<br>
实操<br>
官网<br>
配置新增<br>
Nacos界面配置对应<br>
设置DataId
公式:
${spring.application.name}-${spring.profiles.active}.${spring.cloud.nacos.config.file-extension}<br>
prefix 默认为 spring.application.name 的值<br>
spring.profile.active 即为当前环境对应的 profile,可以通过配置项 spring.profile.active 来配置。<br>
file-exetension 为配置内容的数据格式,可以通过配置项 spring.cloud.nacos.config.file-extension 来配置<br>
小总结说明<br>
历史配置<br>
Nacos会记录配置文件的历史版本默认保留30天,此外还有一键回滚功能,回滚操作将会触发配置更新<br>
回滚<br>
测试<br>
启动前需要在nacos客户端-配置管理-配置管理栏目下有对应的yaml配置文件
运行cloud-config-nacos-client3377的主启动类<br>
调用接口查看配置信息<br>
http://localhost:3377/config/info<br>
自带动态刷新<br>
修改下Nacos中的yaml配置文件,再次调用查看配置的接口,就会发现配置已经刷新
Nacos作为配置中心-分类配置<br>
问题<br>
多环境多项目管理<br>
Nacos的图形化管理界面<br>
配置管理<br>
命名空间<br>
Namespace+Group+Data ID三者关系?为什么这么设计?<br>
Case<br>
三种方案加载配置<br>
DataID方案<br>
指定spring.profile.active和配置文件的DataID来使不同环境下读取不同的配置<br>
默认空间+默认分组+新建dev和test两个DataID<br>
新建dev配置DataID<br>
新建test配置DataID<br>
通过spring.profile.active属性就能进行多环境下配置文件的读取<br>
测试<br>
http://localhost:3377/config/info<br>
配置是什么就加载什么<br>
test<br>
Group方案<br>
通过Group实现环境区分<br>
新建Group<br>
在nacos图形界面控制台上面新建配置文件DataID<br>
bootstrap+application<br>
在config下增加一条group的配置即可。<br>可配置为DEV_GROUP或TEST_GROUP<br>
Namespace方案<br>
新建dev/test的Namespace<br>
回到服务管理-服务列表查看<br>
按照域名配置填写<br>
YML<br>
bootstrap<br>
application<br>
Nacos集群和持久化配置(重要)<br>
官网说明<br>
https://nacos.io/zh-cn/docs/cluster-mode-quick-start.html<br>
官网架构图(写的o(╥﹏╥)o)<br>
上图官网翻译,真实情况<br>
说明<br>
按照上述,我们需要mysql数据库<br>
官网说明<br>
https://nacos.io/zh-cn/docs/deployment.html<br>
重点说明<br>
Nacos持久化配置解释<br>
Nacos默认自带的是嵌入式数据库derby<br>
https://github.com/alibaba/nacos/blob/develop/config/pom.xml<br>
derby到mysql切换配置步骤<br>
nacos-server-1.1.4\nacos\conf目录下找到sql脚本<br>
nacos-mysql.sql<br>
执行脚本<br>
nacos-server-1.1.4\nacos\conf目录下找到application.properties<br>
启动Nacos,可以看到是个全新的空记录界面,以前是记录进derby<br>
Linux版Nacos+MySQL生产环境配置<br>
预计需要,1个Nginx+3个nacos注册中心+1个mysql<br>
Nacos下载Linux版<br>
https://github.com/alibaba/nacos/releases/tag/1.1.4<br>
nacos-server-1.1.4.tar.gz<br>
解压后安装<br>
集群配置步骤(重点)<br>
1、Linux服务器上mysql数据库配置<br>
SQL脚本在哪里<br>
sql语句源文件<br>
nacos-mysql.sql<br>
自己Linux机器上的Mysql数据库粘贴<br>
执行后结果
2、application.properties 配置<br>
位置<br>
内容<br>
3、Linux服务器上nacos的集群配置cluster.conf<br>
梳理出3台nacos集器的不同服务端口号<br>
复制出cluster.conf<br>
内容<br>
这个IP不能写127.0.0.1,必须是<br>Linux命令hostname -i能够识别的IP
4、编辑Nacos的启动脚本startup.sh,使它能够接受不同的启动端口
/mynacos/nacos/bin 目录下有startup.sh<br>
在什么地方,修改什么,怎么修改<br>
思考<br>
修改内容<br>
执行方式<br>
5、Nginx的配置,由它作为负载均衡器<br>
修改nginx的配置文件<br>
nginx.conf<br>
按照指定启动<br>
6、截止到此处,1个Nginx+3个nacos注册中心+1个mysql<br>
测试通过nginx访问nacos<br>
http://192.168.111.144:1111/nacos/#/login<br>
新建一个配置测试<br>
linux服务器的mysql插入一条记录<br>
测试<br>
微服务cloudalibaba-provider-payment9002启动注册进nacos集群<br>
yml<br>
结果<br>
高可用小总结<br>
19、SpringCloud Alibaba<br> Sentinel实现熔断与限流
Sentinel<br>
官网<br>
https://github.com/alibaba/Sentinel<br>
中文<br>
https://github.com/alibaba/Sentinel/wiki/%E4%BB%8B%E7%BB%8D
是什么<br>
一句话解释,之前我们讲解过的Hystrix<br>
去哪下<br>
https://github.com/alibaba/Sentinel/releases<br>
能干嘛<br>
怎么玩<br>
https://spring-cloud-alibaba-group.github.io/github-pages/greenwich/spring-cloud-alibaba.html#_spring_cloud_alibaba_sentinel<br>
服务使用中的各种问题<br>
服务雪崩<br>
服务降级<br>
服务熔断<br>
服务限流<br>
安装Sentinel控制台<br>
sentinel组件由2部分构成<br>
后台<br>
前台8080<br>
安装步骤<br>
下载<br>
https://github.com/alibaba/Sentinel/releases<br>
下载到本地sentinel-dashboard-1.7.0.jar<br>
运行命令<br>
前提<br>
java8环境OK<br>
8080端口不能被占用<br>
命令<br>
java -jar sentinel-dashboard-1.7.0.jar<br>
访问sentinel管理界面<br>
http://localhost:8080<br>
登录账号密码均为sentinel<br>
初始化演示工程<br>
启动Nacos8848成功<br>
http://localhost:8848/nacos/#/login<br>
Module<br>
cloudalibaba-sentinel-service8401<br>
POM<br>
YML<br>
主启动<br>
业务类FlowLimitController<br>
启动Sentinel8080<br>
java -jar sentinel-dashboard-1.7.0.jar<br>
启动微服务8401<br>
启动8401微服务后查看sentienl控制台<br>
空空如也,啥都没有<br>
Sentinel采用的懒加载说明<br>
执行一次访问即可
http://localhost:8401/testA<br>
http://localhost:8401/testB
效果
结论<br>
sentinel8080正在监控微服务8401<br>
流控规则<br>
基本介绍<br>
进一步解释说明<br>
流控模式<br>
直接(默认)<br>
直接->快速失败<br>
系统默认<br>
配置及说明<br>
测试<br>
快速点击访问http://localhost:8401/testA<br>
结果<br>
Blocked by Sentinel (flow limiting)<br>
思考???<br>
直接调用默认报错信息,技术方面OK<br>but,是否应该有我们自己的后续处理?<br>
类似有个fallback的兜底方法?<br>
关联<br>
是什么<br>
当关联的资源达到阈值时,就限流自己<br>
当与A关联的资源B达到阀值后,就限流A自己<br>
B惹事,A挂了<br>
配置A<br>
postman模拟并发密集访问testB<br>
访问testB成功<br>
postman里新建多线程集合组<br>
将访问地址添加进新新线程组<br>
Run<br>
大批量线程高并发访问B,导致A失效了<br>
运行后发现testA挂了<br>
点击访问http://localhost:8401/testA<br>
结果<br>
Blocked by Sentinel (flow limiting)<br>
链路<br>
多个请求调用了同一个微服务<br>
家庭作业试试<br>
流控效果<br>
直接->快速失败(默认的流控处理)<br>
直接失败,抛出异常<br>
Blocked by Sentinel (flow limiting)<br>
源码<br>
com.alibaba.csp.sentinel.slots.block.flow.controller.DefaultController<br>
预热<br>
说明<br>
公式:阈值除以coldFactor(默认值为3),经过预热时长后才会达到阈值<br>
官网<br>
默认coldFactor为3,即请求 QPS 从 threshold / 3 开始,经预热时长逐渐升至设定的 QPS 阈值。<br>
限流 冷启动<br>
https://github.com/alibaba/Sentinel/wiki/%E9%99%90%E6%B5%81---%E5%86%B7%E5%90%AF%E5%8A%A8
源码<br>
com.alibaba.csp.sentinel.slots.block.flow.controller.WarmUpController
如图所示
WarmUp配置<br>
多次点击http://localhost:8401/testB<br>
刚开始不行,后续慢慢OK
应用场景<br>
排队等待<br>
匀速排队,阈值必须设置为QPS<br>
官网<br>
https://github.com/alibaba/Sentinel/wiki/%E6%B5%81%E9%87%8F%E6%8E%A7%E5%88%B6
源码<br>
com.alibaba.csp.sentinel.slots.block.flow.controller.RateLimiterController
测试<br>
降级规则<br>
官网<br>
https://github.com/alibaba/Sentinel/wiki/%E7%86%94%E6%96%AD%E9%99%8D%E7%BA%A7
基本介绍<br>
进一步说明
Sentinel的断路器是没有半开状态的<br>
半开的状态系统自动去检测是否请求有异常,<br>没有异常就关闭断路器恢复使用,<br>有异常则继续打开断路器不可用。具体可以参考Hystrix<br>
复习Hystrix<br>
降级策略实战<br>
RT<br>
是什么<br>
测试<br>
代码<br>
配置<br>
jmeter压测<br>
结论<br>
异常比例<br>
是什么<br>
测试<br>
代码<br>
配置<br>
jmeter<br>
结论<br>
异常数<br>
是什么<br>
异常数是按照分钟统计的<br>
测试<br>
代码<br>
配置<br>
jmeter<br>
热点key限流<br>
基本介绍
是什么<br>
官网<br>
https://github.com/alibaba/Sentinel/wiki/%E7%83%AD%E7%82%B9%E5%8F%82%E6%95%B0%E9%99%90%E6%B5%81
承上启下复习start<br>
@SentinelResource
代码<br>
com.alibaba.csp.sentinel.slots.block.BlockException
配置<br>
配置<br>
1<br>
@SentinelResource(value = "testHotKey")<br>
异常打到了前台用户界面看到,不友好<br>
2<br>
@SentinelResource(value = "testHotKey",blockHandler = "dealHandler_testHotKey")<br>
方法testHotKey里面第一个参数只要QPS超过每秒1次,马上降级处理<br>
用了我们自己定义的<br>
测试<br>
error<br>
http://localhost:8401/testHotKey?p1=abc<br>
error<br>
http://localhost:8401/testHotKey?p1=abc&p2=33<br>
right<br>
http://localhost:8401/testHotKey?p2=abc
参数例外项<br>
上述案例演示了第一个参数p1,当QPS超过1秒1次点击后马上被限流
特例情况<br>
普通<br>
超过1秒钟一个后,达到阈值1后马上被限流<br>
我们期望p1参数当它是某个特殊值时,它的限流值和平时不一样<br>
特例<br>
假如当p1的值等于5时,它的阈值可以达到200
配置<br>
如图所示
添加按钮不能忘
测试<br>
http://localhost:8401/testHotKey?p1=5
http://localhost:8401/testHotKey?p1=3<br>
当p1等于5的时候,阈值变为200<br>
当p1不等于5的时候,阈值就是平常的1<br>
前提条件<br>
热点参数的注意点,参数必须是基本类型或者String
其它<br>
手贱添加异常看看....../(ㄒoㄒ)/~~
后面讲<br>
系统规则<br>
是什么
https://github.com/alibaba/Sentinel/wiki/%E7%B3%BB%E7%BB%9F%E8%87%AA%E9%80%82%E5%BA%94%E9%99%90%E6%B5%81<br>
各项配置参数说明<br>
配置全局QPS<br>
@SentinelResource<br>
按资源名称限流+后续处理<br>
启动Nacos成功<br>
http://localhost:8848/nacos/#/login<br>
启动Sentinel成功<br>
java -jar sentinel-dashboard-1.7.0.jar<br>
Module<br>
cloudalibaba-sentinel-service8401<br>
POM<br>
YML<br>
业务类RateLimitController<br>
主启动<br>
配置流控规则<br>
配置步骤<br>
图形配置和代码关系<br>
表示1秒钟内查询次数大于1,就跑到我们自定义的处流,限流<br>
测试<br>
1秒钟点击1下,OK<br>
超过上述,疯狂点击,返回了自己定义的限流处理信息,限流发生<br>
额外问题<br>
此时关闭问服务8401看看<br>
Sentinel控制台,流控规则消失了?????<br>
临时/持久?<br>
按照Url地址限流+后续处理<br>
通过访问的URL来限流,会返回Sentinel自带默认的限流处理信息<br>
业务类RateLimitController<br>
访问一次<br>
http://localhost:8401/rateLimit/byUrl<br>
Sentinel控制台配置<br>
测试<br>
疯狂点击http://localhost:8401/rateLimit/byUrl<br>
结果<br>
上面兜底方案面临的问题<br>
客户自定义限流处理逻辑<br>
创建CustomerBlockHandler类用于自定义限流处理逻辑<br>
自定义限流处理类<br>
CustomerBlockHandler<br>
RateLimitController<br>
启动微服务后先调用一次<br>
http://localhost:8401/rateLimit/customerBlockHandler<br>
Sentinel控制台配置<br>
测试后我们自定义的出来了<br>
进一步说明<br>
更多注解属性说明<br>
多说一句<br>
Sentinel主要有三个核心Api<br>
SphU定义资源<br>
Tracer定义统计<br>
ContextUtil定义了上下文<br>
服务熔断功能<br>
sentinel整合ribbon+openFeign+fallback<br>
Ribbon系列<br>
启动nacos和sentinel<br>
提供者9003/9004<br>
POM<br>
YML<br>
记得修改不同的端口号<br>
主启动<br>
业务类<br>
测试地址<br>
http://localhost:9003/paymentSQL/1<br>
消费者84<br>
新建cloudalibaba-consumer-nacos-order84<br>
POM<br>
YML<br>
主启动<br>
业务类<br>
ApplicationContextConfig<br>
CircleBreakerController <br>
修改后请重启微服务<br>
热部署对java代码级生效及时
对@SentinelResource注解内属性,有时效果不好<br>
目的<br>
fallback管运行异常<br>
blockHandler管配置违规<br>
测试地址<br>
http://localhost:84/consumer/fallback/1<br>
没有任何配置<br>
给客户error页面,不友好<br>
只配置fallback<br>
编码<br>
图说<br>
本例sentinel无配置<br>
结果<br>
只配置blockHandler<br>
编码<br>
图说<br>
本例sentinel需配置<br>
结果<br>
fallback和blockHandler都配置<br>
编码<br>
图说<br>
本例sentinel需配置<br>
结果<br>
忽略属性.......<br>
编码<br>
图说<br>
本例sentinel无配置<br>
结果<br>
程序异常打到前台了,对用户不友好<br>
Feign系列<br>
修改84模块<br>
84消费者调用提供者9003<br>
Feign组件一般是消费侧<br>
POM<br>
YML<br>
激活Sentinel对Feign的支持<br>
业务类<br>
带@FeignClient注解的业务接口<br>
fallback = PaymentFallbackService.class<br>
Controller<br>
主启动<br>
添加@EnableFeignClients启动Feign的功能
http://localhost:84/consumer/paymentSQL/1<br>
测试84调用9003,此时故意关闭9003微服务提供者,看84消费侧自动降级,不会被耗死<br>
熔断框架比较<br>
规则持久化
是什么<br>
一旦我们重启应用,sentinel规则将消失,生产环境需要将配置规则进行持久化<br>
怎么玩<br>
将限流配置规则持久化进Nacos保存,只要刷新8401某个rest地址,sentinel控制台<br>的流控规则就能看到,只要Nacos里面的配置不删除,针对8401上sentinel上的流控规则持续有效<br>
步骤<br>
POM<br>
YML<br>
添加Nacos数据源配置<br>
添加Nacos业务规则配置<br>
内容解析<br>
启动8401后刷新sentinel发现业务规则有了<br>
快速访问测试接口<br>
http://localhost:8401/rateLimit/byUrl<br>
默认<br>
停止8401再看sentinel<br>
重新启动8401再看sentinel<br>
乍一看还是没有,稍等一会儿<br>
多次调用<br>
http://localhost:8401/rateLimit/byUrl
重新配置出现了,持久化验证通过<br>
20、SpringCloud Alibaba<br> Seata处理分布式事务
21、知识点
22、Github代码地址:
0 条评论
下一页