Appearance
Spring Cloud Alibaba
Spring Cloud Alibaba 知识图谱
参考资料
https://spring.io/projects/spring-cloud-alibaba/#learn
https://github.com/alibaba/spring-cloud-alibaba/wiki/Nacos-config
https://github.com/alibaba/Sentinel/wiki
https://nacos.io/zh-cn/docs/quick-start-docker.html
https://nacos.io/zh-cn/docs/concepts.html
https://spring-cloud-alibaba-group.github.io/github-pages/greenwich/spring-cloud-alibaba.html
https://github.com/alibaba/Sentinel/releases
前置
压测工具
JMeter https://jmeter.apache.org
ab
Postman
Loadrunner
启动mysql
yml
version: '3.9'
services:
mysql:
restart: always
image: mysql:5.7.40
container_name: mysql
hostname: mysql
ports:
- 3307:3306
environment:
MYSQL_USER: nacos
MYSQL_PASSWORD: nacos
MYSQL_ROOT_PASSWORD: root
volumes:
- ./mysql_data:/var/lib/mysql
networks:
default:
external: true
name: global
导入数据库
nacos_devtest
https://raw.githubusercontent.com/alibaba/nacos/develop/distribution/conf/mysql-schema.sql
启动nacos
yml
version: "3.9"
services:
nacos:
image: nacos/nacos-server:v2.2.0
container_name: nacos-standalone-mysql
env_file:
- ../env/custom-application-config.env
volumes:
- ./standalone-logs/:/home/nacos/logs
- ./init.d/application.properties:/home/nacos/conf/application.properties
ports:
- "8848:8848"
- "9848:9848"
- "9555:9555"
networks:
default:
external: true
name: global
父工程
- pom.xml
xml
<packaging>pom</packaging>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.6.11</version>
</parent>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>2021.0.4</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-dependencies</artifactId>
<version>2021.0.4.0</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
注册中心客户端
导入依赖
- spring-boot-starter-web
- spring-cloud-starter-alibaba-nacos-discovery
配置
yml
server:
port: 8080
spring:
application:
name: Client
cloud:
nacos:
server-addr: localhost:8848
discovery:
username: nacos
password: nacos
namespace: public
启动器
java
@SpringBootApplication
@EnableDiscoveryClient
服务通信
DiscoveryClient+RestTemplate,与 netflix 一样
RestTemplate+LoadBalanced,需要添加依赖
- spring-cloud-starter-loadbalancer
配置中心
服务端
图形化配置使用即可
客户端
导入依赖
- spring-cloud-starter-bootstrap
- spring-cloud-starter-alibaba-nacos-config
配置
必须使用 bootstrap.properties 配置文件来配置Nacos Server 地址
- bootstrap.properties
nacos配置中的Data ID需要配置为register.properties
properties
spring.application.name=nacos-config
spring.cloud.nacos.config.server-addr=127.0.0.1:8848
spring.cloud.nacos.config.file-extension=yaml
spring.profiles.active=develop
- bootstrap.yml
nacos配置中的Data ID需要配置为register.yaml
yaml
spring:
application:
name: register
cloud:
nacos:
config:
server-addr: localhost:8848
file-extension: yaml
# namespace配置后,整个程序崩溃,原因不明
# namespace: public
读取
java
@Controller
@RefreshScope
public class RegisterController {
@Value("${custom.username}")
private String customUsername;
@RequestMapping("/refresh_config")
@ResponseBody
public String refreshConfig() {
return customUsername;
}
}
多配置文件拼接
yml
spring:
cloud:
nacos:
config:
# 测试发现,extension-configs与shared-configs效果一样
shared-configs:
- data-id: common1.yaml
- data-id: common2.yaml
sentinel
快速入门
下载
https://github.com/alibaba/Sentinel/releases
启动
用户名和密码都是sentinel
bash
java -jar sentinel-dashboard-1.8.6.jar
导入依赖
- spring-cloud-starter-alibaba-sentinel
- sentinel-datasource-nacos
编写配置
- application.yml
yml
spring:
cloud:
sentinel:
transport:
dashboard: localhost:8080
port: 8719
management:
endpoints:
web:
exposure:
include: "*"
访问仪表盘
初次访问什么都没有,原因是sentinel控制台懒加载,需要访问客户端,客户端才会把自己的访问信息推送给sentinel
流控规则入门
概念
- QPS(Queries Per Second)
- TPS(Transactions Per Second)
配置
进入簇点链路配置
+流控
单机阈值1 qps
查看配置
导航: 流控规则
线程流控演示
浏览器狂刷
流控规则深入
流控模式
直接
关联
你生病,我吃药 postman疯狂刷新B,浏览器访问A
链路
流控效果
直接
预热 <github.com/alibaba/Sentinel/wiki/限流--冷启动>
假设 单机阈值10 预热时长5 效果为: 从3开始(10/3),5秒钟后达到10 测试时狂点,错误页面越来越少
排队等待
排队等待
JMeter
安装
- 改编码
开jmeter.properties
搜
sampleresult.default.encoding
改成
UTF-8
- 改语言
开jmeter.properties
搜
language
改成
zh_CN
入门使用(GET)
测试计划右键-添加-线程(用户)-线程组
线程组右键-添加-取样器-HTTP 请求
配置
- 协议: http
- 服务器名称或 ip: local
- 端口号: 8080
- 方法: GET
- 路径: /api/departments
测试计划右键-添加-监听器-查看结果树
绿色按钮 Run
并发访问与顺序访问
测试计划-勾选独立运行每个线程组(例如在一个组运行结束后启动下一下)
两个特殊线程组
setUp 线程组 tearDown 线程组
线程属性
线程数 Ramp-Up 时间 循环次数 调度器
http请求默认值
测试计划右键-添加-配置元件-HTTP 请求默认值
信息头管理器
测试计划右键-添加-配置元件-HTTP 信息头管理器 Content-Type: application/json;charset=utf-8
熔断降级
https://github.com/alibaba/Sentinel/wiki/熔断降级
SentinelResource注解
类似HystrixCommand
配置到方法头
Seata
下载seata-server
https://github.com/seata/seata/releases
改配置
- registry.conf
改两处: 注册中心、配置中心
type="nacos"
- nacos-config.txt
将
my_test_tx_group
改成微服务名称搜
service.vgroup_mapping.my_test_tx_group=default
改
service.vgroup_mapping.product-service=default
加
service.vgroup_mapping.order-service=default
初始化seata在nacos的配置
注意localhost是注册中心地址
nacos-config.sh localhost
启动seata
seata-server.bat -p 9000 -m file
导入依赖
- spring-cloud-starter-alibaba-seata
配置DataSourceProxyConfig
Seata是通过代理数据源实现事务分支的,所以需要配置io.seata.rm.datasource.DataSourceProxy的Bean,且是@Primary默认的数据源,否则事务不会回滚,无法实现分布式事务
java
@Configuration
public class DataSourceProxyConfig {
@Primary
@Bean
public DataSourceProxy dataSource(DruidDataSource ds) {
return new DataSourceProxy(ds);
}
}
配置文件
将 seata 中的 registry.conf 拿过来,放到 maven 项目的 resources 目录
application.yml
yml
spring:
alibaba:
seata:
tx-service-group: ${spring.application.name}
开启全局事务控制
java
@GlobalTransactional
测试
测试