SpringCloud
2023-05-11 12:45:46 0 举报
AI智能生成
1
作者其他创作
大纲/内容
第一章
第二章
本章概况:微服务拆分与编写
一个归档包(例如war包)包含所有功能的应用程序,我们通常称为单体应用。而架构单体应用的方法论,就是单体应用架构。
架构简单,开发部署方便
优点
复杂性高、部署慢,频率低、扩展能力受限(内存大小等问题)、阻碍技术创新(更换技术框架麻烦)
缺点
单体架构
定义
1)每个微服务可独立运行在自己的进程里——单独的Tomcat
2)一系列独立运行的微服务共同构建起整个系统——每个微服务可以独立运行
3)每个服务为独立的业务开发,一个微服务只关注某个特定的功能,例如订单管理、用户管理等;
4)可使用不同的语言与数据存储技术(契合项目情况和团队实力)——java PHP等混用, 不同数据库储存
5)微服务之间通过轻量的通信机制进行通信,例如通过REST API进行调用﹔
6)全自动的部署机制
特性
架构图
1)单个服务更易于开发、维护——每个微服务关注有限业务
2)单个微服务启动较快——单个微服务业务较少
3)局部修改容易部署——每个微服务都单独部署
4)技术栈不受限——重构单个服务风险少,效率高
5)按需伸缩——那个微服务业务可以单独扩展,迁移到更好的服务器上
1)运维要求高——需要运维多个微服务应用
2)分布式固有的复杂性——网络延迟,分布式事务
3)重复劳动
1、大型、复杂的项目
2、有快速迭代的需求
3、访问压力大——微服务是去中心化的,数据库,业务都是拆分的
应用场景
1)业务稳定——维护中的项目,需求不变、只改BUG
2)迭代周期长——更新版本慢
不适用的场景
微服务
1、对需要解决的问题进行建模
2、重视设计建模
学习曲线高
领域驱动设计(Domain Driven Design)
通过状态和行为拆分
面向对象(by name. / by verb.)
1)业界流行的拆分方法论
职责划分——规划好职责边界
通用性划分——个人中心、消息中心等
2)个人心得
拆分的微服务满足业务
团队不会认为微服务拆分的太大
增量迭代——能快速迭代
持续进化——能切换语言
3)合理粒度
4)小程序的拆分
微服务拆分
项目架构
目录
项目流程
创建项目
第三章(微服务)
主要功能
快速构建分布式系统的工具集
是SpringCloud的子项目
·包含微服务开发的必备组件
·基于Spring Cloud,符合Spring Cloud标准
·阿里的微服务解决方案
致力于提供微服务开发的一站式解决方案
SpringCloudAlibaba
SpringCloud
SpringBoot的命名
SpringCloud版本命名
SpringCloud生命周期
查看兼容
Spring Boot、Spring Cloud、Spring Cloud Alibaba的兼容性关系
版本与兼容性
<dependencyManagement> <dependencies><!-- 整合Spring—cloud--> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-dependencies</artifactId> <version>Greenwich.SR1</version> <type>pom</type> <scope>import</scope> </dependency> <!-- 整合Spring—cloud-alibaba--> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-alibaba-dependencies</artifactId> <version>0.9.0.RELEASE</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement>
注意版本兼容
整合SpringCloud
第四章(版本兼容整合)
服务提供者和服务消费者
风险:服务发现组件压力大, 服务发现组件崩溃
1)定时发送服务信息
2)缓存到本地,直接调用
防止
类比非实际
last_heartbeat定时发送信息,某个实例在时间点未发送,服务发现组件回讲status状态改变未down,随后改变本地缓存
可能:微服务崩溃
服务发现原理(消费者能找到提供者)
一个更易于构建云原生应用的动态服务发现、配置管理和服务管理平台。
每个微服务集成nacosclient
ctrl进入、搜索nacos,下载兼容版本
sh startup.sh -m standalone
到bin目录
Linux等系统
1、启动startup.cmd
2、成功输入192.168.31.210:8848/nacos/index.html
3、输入账号密码 nacos nacos进入
windows
版本兼容
1、添加依赖
2、写注解——早期版本需要在启动类添加
3、写配置
成功后,到页面查看详细信息
注意:SpinrgBoot、SpringCloud、Spring
讲应用注册到nacos
为内容中心引入服务发现
3、Service: 微服务,比如说用户中心微服务,内容中心微服务。
4、Cluster:指定默认微服务的虚拟划分,比如:北京机房的用户中心微服务集 群Cluster=BJ-User-Center;成都机房的用户中心微服务集群Cluster=CD-User-Center.并且还可以实现,北京的应用优先调用BJ-User-Center
namespace模型
1)nacos中命名空间、新建命名空间
2)创建成功
3)yml配置
流程
服务发现的领域模型
服务级别
集群级别
实例级别
Nacos数据(如配置和服务)描述信息,如服务版本、权重、容灾策略、负载均衡策略、鉴权配置、各种自定义标签 (label),从作用范围来看,分为服务级别的元信息、集群的元信息及实例的元信息。
1、描述微服务信息
2、让微服务调度更加灵活——版本控制
作用
1、nacos控制台编辑以key——value形式
2、java-yml中配置
配置(如何设置)
元数据
Nacos
第五章nacos服务发现控制台
请求都通过nginx(nginx部署在服务器端),通过负载均衡算法,进行转发
服务器端负载均衡
在内容中心中进行负载均衡计算
1、所有用户中心实例的请求地址
随机滁一个下标
2、随机算法
3、放入RestTemplate
多次发送请求,随机调用实例
测试:启动多个用户中心
实现流程
客户端负载均衡
负载均衡
简化这部分算法的组件
Netflix开源的客户端侧负载均衡器
架构演进图
1、依赖包含在SpringCloud中
启动类Application中 在RestTemplate加注解LoadBalanced
2、注解
会将user-center自动转换成用户中在在nacos上的地址,并进行负载算法
3、
引入
列表
组成
内置的负载均衡规则
对不同微服务调用实例有不同的负载均衡规则
创建RibbonConfigUartion类
Spring是主树状上下文,Ribbon有子上下文,不能重叠
后果:配置被所有实例共享,变成全局配置
1、创建ribbonconfiguration包——必须在启动类包外
2、创建用户中心的RIbbonConfiguartion
代码配置(configuration)
配置属性方式(yml)
对比
代码和配置属性方式同时存在,优先级在属性配置
尽量使用属性配置,属性方式实现不了的情况下再考虑用弋码配置
在同一个微服务内尽量保持单一性,比如统一使用属性配置,不要两种方式混用,增加定位代码的复杂性
总结
配置自定义
细粒度
全局配置
举例
配置类配置config
配置属性yml
支持的配置项
Ribbon默认是懒加载——第一次请求反应慢
开启
饥饿加载
使用nacos内置的权重负载均衡规则
1、在config包中创建NacosWeightedRule类
2、修改RibbonConfiguration
Ribbon内置的规则不支持权重——自定义规则
使用不具备权重的负载均衡原因,springCloud标准
权重支持
NacosSameClusterWeightedRule类
1、config
2.ribbonConfiguratio
扩展已被作者提交到SpringCloud alibaba新版本可尝试直接使用
同集群优先
yml中spring-cloud-nacos-discovery-metadata:(key-value形式)
nacos页面控制台设置
1、设置元数据
在nacosSameClusterWeightedRule类中设置
2、负载均衡规则中获取实例元数据
实际需求
https://www.imooc.com/article/288674
场景使用
基于元数据的版本控制
扩展Ribbon
调用不能跨namespace,只能调用i相同的namespace实例
pulic下的内容中心不能调用dev下的用户中心
指定namespace
深入理解namespace
1、代码不可读,对新员工难读懂
2、复杂的url难以维护
3、难以适应快速迭代的需求,参数改变,修改复杂
4、编程体验不统一——restTemplate里面内容无提示
现有架构问题
Ribbon负载均衡
第六章负载均衡、ribbon
Feign是Netflix开源的声明式HTTP客户端——帮助实现远程http请求
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-openfeign</artifactId> </dependency>
1、加依赖
2、注解——启动类上加注解
3、创建包feignclient 、创建类userCenterFeignClient
替换restTemplate内容
4、service中
Feign中整合ribbon,负载均衡配置依然适用
不继承:
缺点:1、紧耦合 2、userDto类和user属性有不同,由于json文本转换会报错
优点:控制器和Feign代码相似,抽象出共同的接口,代码重用
继承特性
Feign日志级别
1、yml配置
1、@FeignClient注解中添加
如果加了Configuration,要放在启动类包外,防止上下文重叠
2、配置包中创建配置类
3、yml中
2、config代码配置
方式
细粒度配置自定义
启动类上添加,value为feign的配置
config配置
修改微服务名称为defult
yml配置
config配置项
yml配置项
Ribbon配置 vs Feign配置
全局代码<全局属性<细粒度代码<细粒度属性
Feign config配置 vs yml配置
1、尽量使用属性配置,属性方式实现不了的情况下再考虑用代码配置
2、在同一个微服务内尽量保持单一性,比如统一使用属性配置,不要两种方式混用,增加定位代码的复杂性
建议使用
日志级别配置
有相同feignClient name同名是添加
1、添加配置
2、feignClient类
http://www.imooc.com/article/289000
post请求
多参数请求构造
必须有name值
1、创建FeignClient类
2、测试
脱离Ribbon使用——未注册nacos使用
原则:尽量用Feign,杜绝使用RestTemplate,使用统一
实际应用
RestTemplate 对比 Feign
<dependency> <groupId>io.github.openfeign</groupId> <artifactId>feign-httpclient</artifactId> </dependency>
2、yml
<dependency> <groupId>io.jsonwebtoken</groupId> <artifactId>jjwt-api</artifactId> <version>0.10.7</version> </dependency>
OkHttpClient
配置连接池
生产环境Basic级别
日志级别
Feign性能优化
http://www.imooc.com/article/289005
常见问题
第七章——Feign:帮助实现远程http请求(替换restTemplate)
对前者的调用失败->请求强制等待->线程强制阻塞(知道请求超时)->计算机资源消耗->高并发积累下,B服务失效 ,形成雪崩效应 =级联效应=级联失效
雪崩效应
2、限流(限制实例高并发请求,减少调用),超过就拒绝
每个控制器拥有独立的线程池,设置大小,超过拒绝
3、仓壁模式
https://martinfowler.com/bliki/CircuitBreaker.html
设置一段时间内的错误次数,超过就跳闸,经过一段时间后,半打开,再尝试调用
4、断路器模式
常见容错方式
https://github.com/alibaba/Sentinel
轻量级的流量控制,熔断降级java库——解决雪崩等问题
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId> </dependency>
无注解、无配置,加依赖即使用
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-actuator</artifactId> </dependency>
添加依赖
localhost:8080/actuator/sentinel
访问
2、查看效果
实现
1、下载https://github.com/alibaba/Sentinel/releases
2、window启动 在文件目录下 cmd——java -jar sentinel-dashboard-1.6.2.jar
3、localhost:8080/#/login账号密码:Sentinel
搭建
懒加载,访问后,控制台才有内容
QPS:每秒查询率
成功
整合
Sentinel控制台->簇点链路->新增流控—达到预设值,会限流
访问达到阈值,限流
直接
适用于选择优先于读还是写
当关联的资源达到阈值,就限流自己
关联
API级别,test-a test-b都单独计算限流
只记录指定链路上的流量
链路
流控模式
直接访问失败,抛异常
快速失败
根据codeFactor(默认3)的值,从阈值/codeFactor,经过预热时长才到达设置的QPS阈值
阈值/3作为最初的预设值,经过预热时间后才达到QPS阈值
应用场景:秒杀服务,让允许的通过的流量缓慢的增加
Warm Up预热
匀速排队,让请求以均匀的速度通过,阈值类型必须设成QPS,否则无效
不会丢弃请求,应对突发流量,平时空闲的场景一秒一次请求,达到预设时间未完成的请求丢弃
排队等待
流控效果
流控规则
RT大于一秒,并且在5秒内,通过请求大于等于5次,降级
需求大于4900毫秒,需要通过yml修改,控制台修改无效
注意点:默认为4900毫秒
RT
异常比例
一分钟内统计异常数大于10,降级,10秒后,关闭降级,注意点:时间窗口<60秒可能会出问题,可能连续降级——10关闭降级瞬间,可能异常数仍大于10,继续降级
异常数
降级规则
测试代码
窗口时间内,参数索引为0的,QPS达到阈值就会限流
对应索引的参数参数值不是5的话,阈值为1,不是5的话阈值为1000
配置
存在热点参数,SQP高
注意点,参数必须是基本类型或者是String,否则不会生效
源码——com.alibaba.csp.sentinel.slots.block.flow.param.ParamFlowChecker#passCheck
热点规则
◆当系统load1 (1分钟的load )超过阈值,且并发线程数超过系统容量时触发,建议设置为CPU核心数*2.5。(仅对Linux/Unix-like机器生效)
分别是1分钟 5分钟 15分钟内的系统负载
查看uptime
源码——com.alibaba.csp.sentinel.slots.system.SystemRuleManager#checkBbr
LOAD
所有入口流量的平均RT达到阈值触发
所有入口流量的并发线程数达到阈值触发
线程数
所有入口流量的QPS达到阈值触发
入口QPS
com.alibaba.csp.sentinel.slots.system.SystemRuleManager#checkSystem
类型
系统规则
/shares/1值允许test微服务访问——黑名单反之
授权规则
控制台
private void initFlowQpsRule() { List<FlowRule> rules = new ArrayList<>(); FlowRule rule = new FlowRule(\"resourceName\"); // set limit qps to 20 rule.setCount(20); rule.setGrade(RuleConstant.FLOW_GRADE_QPS); rule.setLimitApp(\"default\"); rules.add(rule); FlowRuleManager.loadRules(rules); } resourceName 例子/shares/1
控制器内加方法
代码配置
控制台和微服务的通信端口
服务发现原理,
获取Api
调用APi
控制台发送到微服务
注册/心跳发送——com.alibaba.csp.sentinel.transport.heartbeat.SimpleHttpHeartbeatSender
通信API——com.alibaba.csp.sentinel.command.CommandHandler的实现类
Sentinel与控制台通信原理分析
应用端连接控制台配置
控制台配置
启动时
修改账号密码
应用连接控制台的配置项
关闭保护防止干扰
SphU
Tracer
ContextUtil
3个API
Sentinel API详解
重构实现
参数中添加blockHandlerClass
创建Sentinel包,ControllerBlockHandlerClass类
1.6之后——fallbackClass同上
优化
SentinelResource注解详解
启动类中添加注解SentinelRestTemplate
@Autowired private RestTemplate restTemplate; @GetMapping(\"/test-rest-template-sentinel/{userId}\") public UserDTO test(@PathVariable Integer userId) { return this.restTemplate .getForObject( \"http://user-center/users/{userId}\
Sentinl控制台中设置QPS阈值
关闭后,控制台没有资源显示
提供开关
修改异常显示
org.springframework.cloud.alibaba.sentinel.custom.SentinelBeanPostProcessor
查看源代码
RestTemplate整合Sentinel
添加配置即可
1、fallback包中创建UserCenterFeignClientFallback类
2、FeignClient
触发流控规则,进入userCenterFeignClient方法
3、控制台设置流控规则
限流降级时,自定义处理逻辑
feignClient包内创建fallbackfactory包,创建类
FeingClient注解中添加fallbackFactory属性
控制台设置流控阈值
fallbackFactory比fallback更加强大能获取异常
获取异常——自定义
org.springframework.cloud.alibaba.sentinel.feign.SentinelFeign
Feign整合Sentinel
Sentinel使用总结
服务器重启,规则不重设
<dependency> <groupId>com.alibaba.csp</groupId> <artifactId>sentinel-datasource-extension</artifactId></dependency>
Sentinel包下创建类
2、实现代码
创建目录resources.META-INF.services
创文件com.alibaba.csp.sentinel.init.InitFunc
3、配置
重启控制台和内容中心
·简单易懂
·没有多余依赖(比如配置中心、缓存等)
·由于规则是用FileRefreshableDataSource定时更新的,所以规则更新会有延迟。如果FileReireshableDataSource定时时间过大,可能长时间延迟;如果FileRefreshableDataSource过小,又会影响性能;
规则存储在本地文件,如果有一天需要迁移微服务,那么需要把规则文件一起迁移,否则规则会丢失。
优缺点
拉模式http://www.imooc.com/article/289402
根据笔记改造流控规则,繁杂
https://github.com/eacdy/Sentinel-Dashboard-Nacos
修改后
1、启动
2、添加配置
使用实例
更改后的架包
推模式http://www.imooc.com/article/289464
规则持久化
https://ahas.console.aliyun.com/使用阿里云托管
排除掉与Sentinel通信的依赖
2、添加埋点——可以省略,springCloud-alibaba已集成
3、配置参数
生产环境使用Sentinel
文档——https://github.com/alibaba/Sentinel/wiki/%E9%9B%86%E7%BE%A4%E6%B5%81%E6%8E%A7
集群流控
流控和降级显示错误相同
创建类UrlBlockHandler
错误页优化
创建类MyRequestOriginParser
可将origin放在handler中
实现区分来源RequestOriginParser
创建MyUrlcleaner接口
支持ResfulURL
源代码commonFilter.java
有默认的配置,可重写修改
通过现象看本质
扩展
http://www.imooc.com/article/289562
配置项总结
未完成,但使用控制台配置每个控制器的线程数
仓壁模式
本章总结:容错方式
Sentinel
第八章Sentinel、容错(轻量级的流量控制,熔断降级java库)
1、控制器
@Datapublic class ShareAuditDTO { /** * 审核状态 */ private AuditStatusEnum auditStatusEnum; /** * 原因 */ private String reason;}
2、实体类中的dto
创建类
注入private final RocketMQTemplate rocketMQTemplate
使用MQ
异步实现方法
3、service
不写group启动失败
2、yml配置
其他MQ使用文档:https://docs.spring.io/spring-boot/docs/2.1.5.RELEASE/reference/html/boot-features-messaging.html#boot-features-jms
编写生产者
1、依赖
dto
创建类AddBonusListener
service
实现代码
编写消费者user-center中
MQ实现
架构演进
异步处理——将耗时到不阻塞主流程的业务。
秒杀场景,流量涌入,
使用MQ控制参加人数,超过就丢弃请求或跳转错误页
流量削峰填谷
A服务调用B服务,B失效,A接口无法正常返回,
使用MQ,A生产消息到MQ,B消费MQ中的消息,不会相互影响
解耦微服务
适用场景
http://www.imooc.com/article/290040ActiveMQ Kafka RabbitMQ RocketMQ
选择
下载教程:http://www.imooc.com/article/290089
下载网址——https://rocketmq.apache.org/download
快速入门——https://rocketmq.apache.org/docs/quickStart/01quickstart/
安装
http://www.imooc.com/article/290092
启动懒人jar包,输入localhost:17890/#/
搭建控制台
术语和概念
https://git.imooc.com/coding-358/rocketmq-dev-guide/src/master/book.pdf
进阶
术语
消息状态
数据库加一张表
AddBonusTransactionListener
代码实现流程
实现分布式事务
RocketMQ
MQ
第九章-管理员审核分享业务实现(根据文档实现)
0 条评论
回复 删除
下一页