微服务保护和分布式事务
一.雪崩问题
微服务调用链路中的某个服务故障,引起整个链路中所有的微服务都不可用,这就是雪崩。
1.服务保护方案 - 请求限流
请求限流:限制访问微服务的请求的并发量,避免服务因为流量激增出现故障。
2.服务保护方案 - 线程隔离
线程隔离:也叫做舱壁模式,模拟船舱隔板的防水原理。通过限定每个业务能使用的线程数量而将故障办业务隔离,避免故障扩散。
3.服务保护方案 - 服务熔断
服务熔断:由断路器统计请求的异常比例或慢调用比例,如果超出阈值则会熔断该业务,则拦截该接口的请求。熔断期间,所有请求快速失败,全部走fallback逻辑
(出现类似下面“grpc.GrpcClient”错误,发现浏览器也无法访问nacos,先停止nacos服务,在启动就好了,直接试了restart好像不太行)
ERROR 64524 --- [ main] c.a.n.c.remote.client.grpc.GrpcClient : Server check fail, please check server 192.168.228.136 ,port 9848 is available , error ={}
4.服务保护技术Sentinel
阿里巴巴开源的一款服务保护框架
(1)按照文档安装sentinel
(2)引入依赖;配置控制台修改yaml文件;
(3)访问cart-service的任意端点,就可以看到簇点链路的监控信息
打开Sentinel的请求方式前缀,把请求方式 + 请求路径作为簇点资源名
5.请求限流
在簇点链路后面点击流控按钮,即可对其做限流配置,可以利用Jemeter做限流测试,观察结果
6.线程隔离
也是对簇点资源后面的流控按钮操作,不过和限流控制的QPS数不同,此时配置的是并发线程数
7.服务熔断
- 编写服务降级逻辑:就是服务调用失败后的处理逻辑,根据业务场景,可以抛出异常,也可以返回友好提示或默认数据
- 异常统计和熔断:统计服务提供方的异常比例,当比例过高表明该接口会影响到其它服务,应该拒绝调用该接口,而是直接走降级逻辑。
(这里注意文档定义的是ItemClientFallback)
二、分布式事务
分布式事务可能会导致无法遵循ACID的事务特性
解决思路:解决分布式事务,各个子事物之间必须能够感知到彼此的事物状态,才能保证状态一致
1.部署TC服务
1.1 准备数据库表
1.2 准备配置文件:课前资料准备了一个seata目录,其中包含了seata运行时所需要的配置文件
1.3 docker部署
2.微服务集成Seata
2.1 引入依赖
2.2 改造配置
改造配置后重启服务报错如下所示:
Error starting ApplicationContext. To display the conditions report re-run your application with 'debug' enabled.
17:48:42:864 ERROR 81148 --- [ main] o.s.boot.SpringApplication : Application run failed
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'globalTransactionScanner' defined in class path resource [io/seata/spring/boot/autoconfigure/SeataAutoConfiguration.class]: Bean instantiation via factory method failed; nested exception is org.springframework.beans.BeanInstantiationException: Failed to instantiate [io.seata.spring.annotation.GlobalTransactionScanner]: Factory method 'globalTransactionScanner' threw exception; nested exception is java.lang.ExceptionInInitializerError
at org.springframework.beans.factory.support.ConstructorResolver.instantiate(ConstructorResolver.java:658) ~[spring-beans-5.3.27.jar:5.3.27]
搞了很久没搞出来,感谢评论区大佬和文档注释大佬,下面是解决方法:
以cart-service为例:
右键CartApplication,然后Edit Configuration,然后点击Modify options,然后点击Add VM options,然后输入:
--add-opens=java.base/java.lang=ALL-UNNAMED
其他服务同理(我一开始直接在Springboot添加的好像没起作用,不行的试试一个一个服务搞)
2.3 添加数据库表
seata的客户端在解决分布式事务的时候需要记录一些中间数据,保存在数据库中。因此我们要先准备一个这样的表
3. XA模
对于配置文件seata的配置可以直接去nacos里面修改
测试的时候如果在cart-service没有看到回滚的输出记录,可以去seata日志看,输入docker logs -f seata
查看回滚日志记录
4.AT模式
测试AT:
把seata的nacos的配置更改为AT模式(默认是AT),重启服务
和上面一样的测试步骤也能看到下单失败和回滚的信息。