教学视频地址:
B站图灵springcloud教学视频(主要的)
b站山硅谷springcloud教学视频
学习代码:springcloud学习代码资源
文章目录- 一、为服务架构理论知识
- 二、springcloud简介
- 三、springcloud技术栈
- 1、项目搭建
- 2、注册中心:Nacos
- 1、项目部署
- 2、nacosClient搭建
- 3、nacos基本概念
- 4、集群
- 3、服务调用:openfeign
- 1、添加依赖
- 2、声明接口
- 3、启用注解
- 4、使用
- 配置项
- 4、配置中心:nacos
- 5、流控:sentinel
- 1、整合springcloudalibaba的控制台
- 2、流控规则
- 3、熔断降级
- 4、热点流控
- 5、系统规则
- 6、持久化
- 7、sentinel的集群
- 6、分布式事务组件:seata
- 1、服务端搭建
- 2、客户端搭建
- 7、网关:gateway
- 1、快速开始
- 2、整合nacos
- 3、断言详解
- 4、过滤器详解
- 5、请求日志、跨域处理
- 6、整合sentinel
- 7、集群
- 8、链路追踪:skyWalking
- 1、服务端搭建
- 2、使用
- 3、自定义链路追踪
- 4、性能剖析
- 5、集成日志
- 6、告警
- 7、集群
- 四、总结
略
二、springcloud简介- boot与cloud版本对应关系
spring官网cloud与boot的版本对应关系
- 组件
三、springcloud技术栈 1、项目搭建
- 创建springboot工程
pom文件加上
pom
- 根据版本对应关系加入springcloud-alibaba、springcloud等依赖
版本对应
com.alibaba.cloud spring-cloud-alibaba-dependencies2.2.7.RELEASE pom import
- 子工程项目搭建
创建maven工程(会自动继承父项目)
- 下载项目(github中)
根据版本对应关系下载对应的版本即可(文件保存位置不可有中文符号)
- 启动项目
因为默认是集群模式,所以需要先修改为单机模式
对启动文件右键编辑,更改模式即可
也可以进行一些其他配置
用户名密码默认都是nacos
- 在需要用到nacos的子项目中加入依赖
com.alibaba.cloud spring-cloud-starter-alibaba-nacos-discovery
- 配置
- 使用resttemplet调用即可
- 保护阈值:健康实例占比小于保护阈值的时候将会调用非健康实例,以免雪崩
- 环境搭建(推荐使用nginx进行负载均衡)
修改properties,配置mysql,运行官方给的sql文件
修改(新建)cluster.config,加入集群的ip和端口
- 理论知识
两种集群方式
负载均衡策略(loadblance实现负载均衡的方式略过)
- 使用
消费方的resttemplet加上注解
修改负载均衡策略
1、方法一:使用配置类
2、使用配置文件
用于代替之前resttemplet的调用方式
1、添加依赖2、声明接口 3、启用注解 4、使用 配置项org.springframework.cloud spring-cloud-starter-openfeign
- 日志配置-配置类
springboot默认的日志级别是info,feign的debug级别的日志就不会输出,所以将feign接口的日志级别改为debug带能看得到feign的日志输出
logging:
level:
com.example.demo.feign: debug
- 日志配置-配置文件
- 契约配置
将feign的原生注解和mvc的注解对应,通常用于版本升级而而做出的代码规范
- 超时时间
- feign自定义拦截器
配置方法一:
方法二:
实现类:
- 新建配置文件
- 导入依赖,写配置文件
com.alibaba.cloud spring-cloud-starter-alibaba-nacos-config
推荐使用bootstrap.yml全局配置文件
-
在controller上添加,动态刷新注解:@RefreshScope
-
其他配置
通过dataid指定特定的配置文件(一般用于共享配置文件,shared-configs是自己取的名字可以有多个)
-
权限管理
可新建角色,设置权限(会影响配置中心,待解决)
需要修改nacos中conf/application.properties配置文件:
改为true,默认false
斜体样式流控是部署在服务提供者上面的
帮助文档
有两种使用方式:使用API,使用控制台
略过p43,p44,p45
1、从帮助文档下载jar包
2、通过java -Dserver.port=8891 -Dsentinel.dashboard.auth.username=admin -Dsentinel.dashboard.auth.password=123 -jar sentinel-dashboard-1.8.1.jar命令运行jar包,账号密码默认都是sentinel,也可以指定端口账户密码
3、添加依赖、配置sentinel控制台地址
com.alibaba.cloud spring-cloud-starter-alibaba-sentinel
访问接口之后就可以在sentinel上面显示出来了
- 流控处理:
使用@SentinelResource(需要依赖,整合在cloud中了,对普通方法也可以流控,不单单是controller):
1、注入bean:
2、在需要流控的接口加上注释(不成功可以尝试重启sentinel或项目本体)
- 流控方式:QPS,线程数
- 全局流控处理
@Component
public class MyBlockExceptionHandler implements BlockExceptionHandler {
@Override
public void handle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, BlockException e) throws Exception {
//判断错误类型
if (e instanceof FlowException) {
} else if (e instanceof DegradeException) {
} else if (e instanceof ParamFlowException) {
} else if (e instanceof SystemBlockException) {
} else if (e instanceof AuthorityException) {
}
//返回数据
httpServletResponse.setStatus(500);
httpServletResponse.setCharacterEncoding("utf-8");
httpServletResponse.setContentType(MediaType.APPLICATION_JSON_VALUE);
new ObjectMapper().writeValue(httpServletResponse.getWriter(),"全局处理---出现错误");
}
}
- 流控模式
1、直接模式:访问自己限流自己
2、关联模式:访问关联资源限流自己
3、链路模式:和直接模式一样,但是根据不同的入口资源进行流控(链路的入口资源好像只能限制在同一个项目内,并不可以跨项目)
- 流控效果
1、快速失败:直接丢弃多余请求,直接报错
2、warm up:针对激增流量,会慢慢将求请求放进来,让系统的缓冲层进行预热,直至达到流控阈值,通过预热时长设置请求放进来的速度
3、排队等待:针对脉冲流量,通过设置等待时间让超过阈值的的请求在空闲时间执行,充分利用空闲时间
- 慢调用比例:
- 异常比例
- 异常数量
- 整合opoenfeign的熔断(错误处理,提供者出错)
以下配置都是在消费端的
1、添加配置
2、实现服务端接口,加上@Component
3、在服务接口注解中添加fallback类,即实现类
服务端出错后调用的就是消费端实现的方法了
针对当前系统的指标进行处理,用于造成压力的原因来自哪里的时候,可以作为一个兜底的方案
1、原始模式:啥也没有
2、拉模式:结合远吗进行扩展
3、推模式:将配置推送到远程配置中心
- 导入依赖
- 在nacos中编写对应配置文件(默认是json格式,各个不同属性可以在文档找到,流控,熔断,热点)
官网配置属性参考
- 编写配置文件
更多属性可以参考(还有他的父类中的属性):
待定
整合gateway,学完gateway再回来看p60
seata官网
1、服务端搭建- 搭建数据库
1、修改conf中的file.conf
坑:mysql8.0以上还要修改
1、驱动名:com.mysql.cj.jdbc.Driver
2、在数据库连接后面加上:?characterEncoding=utf-8&serverTimezone=UTC
2、创建数据库,运行sql语句 - 整合nacos
1、修改conf中的registry.conf:对应注册中心和配置中心
2、去gihub官网下载项目,在script中找到scriptconfig-centerconfig.txt
修改
坑:mysql8.0以上还要修改
1、驱动名:com.mysql.cj.jdbc.Driver
2、在数据库连接后面加上:?characterEncoding=utf-8&serverTimezone=UTC
项目地址
默认分组名也可以
3、运行scriptconfig-centernacosnacos-config.sh
也可以指定参数:
- 1、在有关事务的项目中添加依赖
- 2、在有关事务的项目数据库中新建undolog表
CREATE TABLE undo_log( id bigint(20) NOT NULL AUTO_INCREMENT, branch_id bigint(20) NOT NULL, xid varchar(100) NOT NULL, context varchar(128) NOT NULL, rollback_info longblob NOT NULL, log_status int(11) NOT NULL, log_created datetime NOT NULL, log_modified datetime NOT NULL, PRIMARY KEY (id), UNIQUE KEY ux_undo_log (xid,branch_id) )ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8
- 3、配置事务分组、注册中心和配置中心
- 4、在需要分布式事务的方法上面加上@GlobalTransactional就可以了
作为网关,一般是放在一个单独的项目当中
- 添加依赖
- 配置
- 添加依赖
- 配置
也可以让gateway根据nacos上的服务名自动匹配
-
内置的断言工厂
直接看文档就可以:gateway文档 -
自定义断言工厂
可以根据AbstractRoutePredicateFactory的实现类来写,内部断言工厂都实现了这个类
@Component
public class MyRoutePredicateFactory
extends AbstractRoutePredicateFactory {
public MyRoutePredicateFactory() {
super(MyRoutePredicateFactory.Config.class);
}
//从配置文件接受参数
@Override
public List shortcutFieldOrder() {
return Arrays.asList("myParam");
}
//将需要接收的参数声明在Config类中
@Validated
@Data
@ToString
public static class Config {
private String myParam;
}
@Override
public Predicate apply(MyRoutePredicateFactory.Config config) {
return new GatewayPredicate() {
//实现具体逻辑
@Override
public boolean test(ServerWebExchange exchange) {
//这个参数只有等于520时才通过
if (config.getMyParam().equals("520") ) {
return true;
} else {
return false;
}
}
};
}
}
4、过滤器详解
-
内置过滤器:gateway过滤器官方文档
-
自定义过滤器
与断言工厂类似,可以从AbstractGatewayFilterFactory进行模仿
@Component
public class MyFilterGatewayFilterFactory
extends AbstractGatewayFilterFactory {
public MyFilterGatewayFilterFactory() {
super(MyFilterGatewayFilterFactory.Config.class);
}
@Override
public List shortcutFieldOrder() {
return Arrays.asList("myPath");
}
@Override
public GatewayFilter apply(MyFilterGatewayFilterFactory.Config config) {
return new GatewayFilter() {
@Override
public Mono filter(ServerWebExchange exchange, GatewayFilterChain chain) {
//具体实现逻辑
//修改路径
ServerHttpRequest req = exchange.getRequest();
String newPath = req.getURI().getRawPath()+config.myPath;
ServerHttpRequest request = req.mutate().path(newPath).build();
//执行
return chain.filter(exchange.mutate().request(request).build());
}
};
}
@Data
@ToString
public static class Config {
//添加一层路径
private String myPath;
}
}
- 全局过滤器
不用配置,对所有路由生效
1、内置全局过滤器
2、自定义全局过滤器
@Component
public class LogFlobalFilter implements GlobalFilter {
Logger logger = LoggerFactory.getLogger(this.getClass());
@Override
public Mono filter(ServerWebExchange exchange, GatewayFilterChain chain) {
//具体逻辑:日志记录请求路径
logger.info(exchange.getRequest().getURI().toString());
//执行
return chain.filter(exchange);
}
}
5、请求日志、跨域处理
开启请求日志(要作为jvm参数):
跨域配置:
可以根据网关、网关中的具体属性进行限流
- 添加依赖
- 配置
- 使用
根据路由id
根据路径分组
- 流控处理
利用nginx对多个网关进行分发即可
8、链路追踪:skyWalking 1、服务端搭建- 修改UI前端端口号
- 持久化
1、修改配置文件(这里使用mysql的方式,但官方建议用elasticsearch)
(这里的数据库连接错了,我的情况应该是远程数据库:jdbc:mysql://139.224.46.237:3307/seata?characterEncoding=utf-8&serverTimezone=UTC),然后在mysql中创建swtest就好,表会自动创建
2、加入jar包
找到本地项目中的mysql jar包,放入aop-libs中
在每个服务的jvm参数中加上如下配置:
gateway网关默认不会加入链路追踪,需要将agent中的optional-plugins中gatwayjar包复制到plugins中(版本随便选一个,不行就换,本次选的是apm-spring-cloud-gateway-2.1.x-plugin-8.7.0)
以下是skyWalking的参数含义:
1、添加依赖
2、使用
方法加上@trace点击分析之后就可以查看路径上是哪个部分占用的时间较多了
暂时略过,等学了日志框架之后再回来看p92
6、告警- 默认告警规则
- 自定义钩子告警方法(也有一些内置的钩子方法)
1、修改配置文件:
2、在github的skyWalking项目中搜索alarmMessage这个类,查看对应版本中这个类的属性
@ToString
@Data
public class AlarmMessage {
private int scopeId;
private String scope;
private String name;
private String id0;
private String id1;
private String ruleName;
private String alarmMessage;
// private List tags;
private long startTime;
private transient int period;
private transient boolean onlyAsCondition;
}
3、实现具体接收告警的方法
@PostMapping("/receive")
public void receive(@RequestBody List alarmMessageList) {
//接收到消息之后就可以实现具体逻辑了,如将消息通过微信通知开发人员等
HashMap map = new HashMap<>();
for (AlarmMessage alarmMessage : alarmMessageList) {
map.put("Name",alarmMessage.getName());
map.put("AlarmMessage",alarmMessage.getAlarmMessage());
}
System.out.println(map.toString());
}
7、集群
- 修改aop配置文件
将standalone改为下面对应的注册中心如nacos,然后把nacos的地址用户名密码填好就可以
- 修改UI配置文件



