springcloud个人笔记
2022-11-10 10:42:52 1 举报
AI智能生成
尚硅谷笔记,高效回顾主干复习
作者其他创作
大纲/内容
cloud升级各分布式组件总览
服务注册中心
❌Eurela(停更不停用)
✅Zookeeper
✅Consul
✅Nacos
服务调用
✅Ribbon
✅LoadBalancer(未来替换Ribbon)
服务调用2
❌Feigin(完全停止)
✅OpenFeign
服务降级
❌Hystrix
✅resilience4j
✅sentienl
服务网关
❌Zuul(需要升级)
⚠️Zuul2(没发布)
✅gateway
服务配置
❌Config
✅Nacos
服务总线
❌Bus
✅Nacos
0.基本准备
版本选型
https://start.spring.io/actuator/info
查看json串返回结果
工程构建
父工程,做版本约束
common工程,可以提出共同entities和工具包的依赖
1.服务注册中心
Eureka
https://github.com/Netflix/eureka/wiki
导入pom依赖
YML配置
主启动类
@EnableEurekaServer
@EnalbeEurekaClient
集群使用
yml配置,相互守望
服务消费方,用服务名请求
使用@LoadBalanced注解赋予RestTemplate负载均衡的能力
自我保护
EurekaServer网络不通情况下,EurekaServer不会立刻将EurekaClient服务剔除
使用eureka.server.enable-self-preservation = false 可以禁用自我保护模式
Zookeeper
pom
yml
主启动@EnableDiscoveryClient //该注解用于向使用consul或者zookeeper作为注册中心时注册服务
Consul
https://www.consul.io/intro/index.html
安装
https://learn.hashicorp.com/consul/getting-started/install.html
双击运行,consul agent -dev启动开发者模式
http://localhost:8500
pom
yml
主启动@EnableDiscoveryClient
三者对比
CAP
C:Consistency(强一致性)
A:Availability(可用性)
P:Partition tolerance(分区容错性)
AP(Eureka)
CP(Zookeeper/Consul)
2.服务调用
Ribbon
https://github.com/Netflix/ribbon/wiki/Getting-Started
pom
可以看到spring-cloud-starter-netflix-eureka-client 确实引入了Ribbon
RestTemplate的使用
getForObject方法/getForEntity方法
postForObject/postForEntity
IRule:根据特定算法中从服务列表中选取一个要访问的服务
轮询RoundRobinRule
随机RandomRule
轮询+重试RetryRule
轮询+响应快的优先WeightedResponseTimeRule
选择并发量最小的BestAvailableRule
过滤掉故障的,再选择并发最小的AvailabilityFilteringRule
修改访问规则
注意,不能被@ComponentScan扫描到
新包内建配置类
主启动
@SpringBootApplication
@EnableEurekaClient
@RibbonClient(name = "CLOUD-PAYMENT-SERVICE",configuration=MySelfRule.class)
Ribbon负载均衡算法
原理
获得注册中心中服务名所有的实例对象num,根据方法的次数sum,取index = sum % num的实例作为访问对象
手写(主要包括三个部分)
controller获取所有服务实例列表,调用MyLb的service
MyLb的service中含有两个主要方法
1.通过JUC维护,准确的获得本次请求是这个服务的第几次请求
2.把controller传入的实例列表中的,第index个返回。其中index是1中求出来的值%实例总数
⏳LoadBalancer
OpenFeign
https://github.com/spring-cloud/spring-cloud-openfeign
一句话:服务调用方,实现服务接口,在接口上配置上OpenFeign注解,
在其他类中直接调用接口方法就可以调用远程的服务提供者的具体服务内容
在其他类中直接调用接口方法就可以调用远程的服务提供者的具体服务内容
pom
主启动@EnableFeignClients
业务类,service实现接口
业务类,controller直接注入接口,调用接口的方法即可
使用
OpenFeign默认等待1秒钟,超过后报错
YML文件里需要开启OpenFeign客户端超时控制
日志打印功能
日志级别
NONE:默认的,不显示任何日志;
BASIC:仅记录请求方法、URL、响应状态码及执行时间;
HEADERS:除了 BASIC 中定义的信息之外,还有请求和响应的头信息;
FULL:除了 HEADERS 中定义的信息之外,还有请求和响应的正文及元数据。
配置日志bean
YML文件里需要开启日志的Feign客户端
3.服务降级
Hystrix
https://github.com/Netflix/Hystrix/wiki/How-To-Use
Hystrix重要概念
服务降级:远程超时或者报错时,调用fallback方法
服务熔断:熔断时,直接调用fallback方法
服务限流:后面高级篇讲解alibaba的Sentinel说明
使用
服务降级
服务提供方
添加新注解@EnableCircuitBreaker
业务类
服务消费方
也可以自己降级,自己出问题时,不会去调用服务提供方
主启动@EnableHystrix
yml
业务类
配置默认兜底方法,减少代码冗余
controller配置
将兜底方法抽离,减少耦合
这里结合Feign一起使用
根据已有的PaymentHystrixService接口
建立PaymentFallbackService实现类
建立PaymentFallbackService实现类
接口配置
@Service
@FeignClient(value = "CLOUD-PROVIDER-HYSTRIX-PAYMENT"
, fallback = PaymentFallbackService.class)
@Service
@FeignClient(value = "CLOUD-PROVIDER-HYSTRIX-PAYMENT"
, fallback = PaymentFallbackService.class)
实现类配置
@Component
@Component
服务熔断
使用比较简单
在需要熔断的方法上配置
Hystrix工作流程(图片)
服务监控hystrixDashboard
pom
yml
主启动
@EnableHystrixDashboard
@EnableHystrixDashboard
被监控的都需要监控依赖配置
如何看?
7色
1圈
1线
4.网关
Zuul
Gateway
https://cloud.spring.io/spring-cloud-static/spring-cloud-gateway/2.2.1.RELEASE/reference/html/
三大核心概念
Route(路由)
Predicate(断言)
Filter(过滤)
核心逻辑
路由转发+执行过滤器链
使用
网关9527,主要是yml
pom
主启动@EnableEurekaClient
yml
Gateway网关路由有两种配置方式:
yml同上
Bean类
Predicate的使用
说白了,Predicate就是为了实现一组匹配规则,
让请求过来找到对应的Route进行处理。
让请求过来找到对应的Route进行处理。
Filter的使用
生命周期pre和post
种类Gateway和Global
自定义过滤器
自定义全局GlobalFilter
作用:全局日志记录
统一网关鉴权
统一网关鉴权
使用
5.服务配置
config
https://cloud.spring.io/spring-cloud-static/spring-cloud-config/2.2.1.RELEASE/reference/html/
使用
中心配置mok
pom
yml(git连接有坑)
主启动@EnableConfigServer
成功实现了用SpringCloud Config通过GitHub获取配置信息
客户端模块
bootstrap.yml
即可获得中心配置的配置信息
动态刷新问题
客户端yml暴露监控端口
业务类@RefreshScope
运维人员运行curl -X POST "http://localhost:3355/actuator/refresh"
6.消息总线
Bus
接config,当我向给很多个客户方推送config该如何实现
使用
接入rabbitmq
子主题
配置中心3344的配置
pom
yml
配置客户端
pom同上
yml新增rabbitmq
运维修改后发送curl -X POST "http://localhost:3344/actuator/bus-refresh"处处生效
发送公式:http://localhost:配置中心的端口号/actuator/bus-refresh/{destination} 定点生效
如:curl -X POST "http://localhost:3344/actuator/bus-refresh/config-client:3355"
如:curl -X POST "http://localhost:3344/actuator/bus-refresh/config-client:3355"
7.Stream消息驱动
Sleuth链路跟踪
Sleuth链路跟踪
Stream
https://spring.io/projects/spring-cloud-stream#overview
https://m.wang1314.com/doc/webapp/topic/20971999.html
屏蔽消息中间件的差异,统一暴露接口
配置看官网,快速入门即可
Sleuth
https://github.com/spring-cloud/spring-cloud-sleuth
展示每次请求访问的所有微服务,和请求时间
使用
下载zipkin jar包启动
被监控的服务pom
被监控的服务yml
打开浏览器访问:http://localhost:9411查看
springAlibaba
官网https://spring.io/projects/spring-cloud-alibaba#overview
中文文档https://github.com/alibaba/spring-cloud-alibaba/blob/master/README-zh.md
nacos
简介
naming(命名中心)configuration(配置中心)service(服务调用)->na + co + s
下载https://github.com/alibaba/Nacos
安装,运行,startup.cmd -m standalone,在8848端口
注册中心使用
客户端pom配置
客户端yml配置
控制台可以看见服务列表,同eureka
Nacos 支持AP和CP模式的切换
配置中心使用
pom,yml配置同上
boostrap.yml
命名空间分组和 DataID 三者关系
namespace→group→profile.active
等效于:学校→学院→班级
等效于:学校→学院→班级
集群使用(重要)
官网 https://nacos.io/zh-cn/docs/cluster-mode-quick-start.html
切换数据库
执行nacos-server-1.1.4\nacos\conf目录下sql脚本
配置application.properties
注意:时区和ssl视情况增加,不加有可能报错
Linux版Nacos+MySQL生产环境配置
预计需要,1个Nginx+3个nacos注册中心+1个mysql
预计需要,1个Nginx+3个nacos注册中心+1个mysql
nacos集群最低3个
1.Linux服务器上mysql数据库配置,同window,可以直接用source语句执行sql文件
2.application.properties 配置,同win
3.Linux服务器上nacos的集群配置cluster.conf,配置ip+端口号即可
4.编辑Nacos的启动脚本startup.sh,使它能够接受不同的启动端口(高版本现在自带)
虚拟机内存不够使,设置nacos默认占用内存为512m(不设置默认是1g)
5.Nginx的配置,由它作为负载均衡器
成功运行
sentinel
官网https://github.com/alibaba/Sentinel
中文文档https://github.com/alibaba/Sentinel/wiki/%E4%BB%8B%E7%BB%8D
下载启动,访问8080
使用
客户端pom
客户端yml
流控规则
图片
可以针对每个接口或者 controller 配置的 value 值设置拦截规则
资源名就是 id,阈值类型,QPS 是单机的访问数,只允许一个访问,单机阈值的单位是 s
线程数,是 controller 只允许设置的 x 个线程进入系统
快速失败:直接返回 fallback 的结果
warmup:冷启动,阈值从设置阈的 1/3 开始慢慢上升
排队等待:在设置的时间内,会排队等待处理结果
关联:设置资源名 A 关联 B,当 B 出现问题是 A 被限流。使用场景,支付场景高压时,下单场景限流
链路:符合条件时,从链路开始和结尾都限流
降级规则
图片
RT(平均响应时间,秒级)
平均响应时间 超出阈值 且 在时间窗口内通过的请求 >=5,两个条件同时满足后触发降级。
窗口期过后关闭断路器。
RT 最大 4900(更大的需要通过 - Dcsp.sentinel.statistic.max.rt=XXXX 才能生效)。
异常比列(秒级)
QPS >= 5 且异常比例(秒级统计)超过阈值时,触发降级;时间窗口结束后,关闭降级 。
异常数 (分钟级)
异常数 (分钟统计)超过阈值时,触发降级;时间窗口结束后,关闭降级
对比限流和降级
限流:只要超过设定阈值,直接不让进入 controller 的方法
降级:能进入 controller 的情况下,发生错误,并达到设定阈值,服务降级
@SentinelResource 配置
代码
value 就算 id
blockHander 是出现服务限流的调用返回方法
blockHanderClass 是 blockHander 方法所在类,默认在本类
fallback 是出现服务降级去找的方法,java 异常去找他
出现 java 异常去找 fallback,流控异常找 blockhander,同时异常 找 blockhander
sentinel持久化
手动配置到 nacos,nacos 实现持久化,启服务后自己去 nacos 找
seata分布式事务
分布式事务处理过程的一ID+三组件模型
全局唯一的事务ID
Transaction Coordinator (TC):事务协调器,维护全局事务的运行状态,负责协调并驱动全局事务的提交或回滚;
Transaction Manager (TM):控制全局事务的边界,负责开启一个全局事务,并最终发起全局提交或全局回滚的决议;
Resource Manager (RM): 控制分支事务,负责分支注册、状态汇报,并接收事务协调器的指令,驱动分支(本地)事务的提交和回滚
图片
官网http://seata.io/zh-cn/
下载安装
配置file.conf
建立sql数据库
启动
使用@GlobalTransactional
加了这个注解,微服务调用发送错误会集体回滚
简单总结
@GlobalTransactional就是分布式事务的开始
TC为这个分布式事务分配一个全局事务id
TM可以理解为是每一个小的分布式系统(某个业务模块)保证原子性
RM是和去操作数据库
如果没出现问题,一步一步正常进行
如果出现问题,TM会通知TC自己负责的业务是否成功完成
TC负责通知已经完成的TM去进行回滚,TM对自己业务内的多次数据库操作(RM)回滚
TC负责通知已经完成的TM去进行回滚,TM对自己业务内的多次数据库操作(RM)回滚
已完结
个人博客www.yangxiaobai.top
收藏
0 条评论
下一页
为你推荐
查看更多