简介
Spring Cloud Alibaba 是阿里巴巴提供的一套微服务开发一站式解决方案
主要提供功能:
- 服务限流降级
- 服务注册与发现
- 分布式配置中心
- 消息驱动
- 分布式事务
- 阿里云对象存储
- 阿里云短信
提供使用的组件
- Sentinel
- Nacos
优势:
1.中文文档
2.集成方便
3.阿里本身经验丰富,值得信赖
Nacos
Nacos 主要提供了服务发现、服务配置以及服务管理
基本特性:
- 服务发现
- 动态配置
- 动态 DNS 服务
- 服务及元数据管理
安装
- Docker安装
- 下载源码,自己编译安装(极不建议)/下载编译好的安装包
首先下载好安装包 :
下载完成后解压
windows,直接在 bin 目录下双击 startup.cmd 启动即可
Linux,bin 目录下执行 sh startup.sh -m standalone (standalone表示单机启动)
注意:提交安装好JDK,测试下java和javac命令要存在
Nacos启动成功后,浏览器输入:http://ip:8848/nacos 就能看到启动页面(注意携带http)
如果需要登录,用户名和密码默认为 nacos
配置中心
类似Spring Cloud Config ,首先在服务端配置,点击配置管理 -> 配置列表 -> +
这里需要配置三个东西,分别是 Data ID、Group、以及要配置的内容
Data ID 的格式是 ${prefix}-${spring.profile.active}.${file.extension}
${prefix} 的值,默认为 spring.application.name 的值
${spring.profile.active} 表示项目当前所处的环境
${file.extension} 表示配置文件的扩展名
例如下图配置
上面配置中 ${spring.profile.active} 省略没写
配置完成后点击发布后就能在配置列表页面看见配置了
新建maven项目,删除src目录,在项目下新建module,springboot项目,添加 Nacos 依赖 (本案例parent采取了springboot2.2.4)
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- 配置依赖 -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
<version>2.2.4.RELEASE</version>
</dependency>
</dependencies>
新建 bootstrap.properties (bootstrap.properties表示要引入外部的配置文件)
spring.application.name=nacos
spring.cloud.nacos.server-addr=192.168.189.101:8848
spring.cloud.nacos.file-extension=properties
注意:这里spring.application.name 和spring.cloud.nacos.file-extension的配置要与之前页面中的配置完全一致
然后我们就可以新建 Controller 进行测试了
@RestController
@RefreshScope // 动态刷新
public class TestController {
@Value("${name}")
String name;
@GetMapping("/hello")
public String hello() {
return "hello:"+name;
}
}
启动项目,访问 http://localhost:8080/hello 接口查看结果,而且这时编辑配置列表中的name值,重新发布后,再次访问接口,也会一样刷新
注册中心
可以替代 Eureka,确保 Nacos 是启动状态
新建 SpringBoot项目
引入依赖
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
<version>2.2.4.RELEASE</version>
</dependency>
</dependencies>
application.properties文件添加配置
spring.application.name=nacos1
spring.cloud.nacos.discovery.server-addr=192.168.189.101:8848
新建Controller
@RestController
public class TestController {
@Value("${server.port}")
Integer port;
@GetMapping("/hello")
public String hello() {
return "hello:" + port;
}
}
这里获取下端口号,验证集群是否有效
利用 maven 完成打包项目,分别以不同的端口运行两个项目
java -jar nacos1-0.0.1-SNAPSHOT.jar --server.port=8081
java -jar nacos1-0.0.1-SNAPSHOT.jar --server.port=8082
再创建一个 springboot 项目 consumer
application配置
spring.application.name=consumer
server.port=8083
spring.cloud.nacos.discovery.server-addr=192.168.189.101:8848
启动类启动 负载均衡
@SpringBootApplication
public class ConsumerApplication {
public static void main(String[] args) {
SpringApplication.run(ConsumerApplication.class, args);
}
@Bean
@LoadBalanced
RestTemplate restTemplate() {
return new RestTemplate();
}
}
新建接口测试
@RestController
public class ConsumerController {
@Autowired
RestTemplate restTemplate;
@GetMapping("/consumer")
public String consumer() {
return restTemplate.getForObject("http://nacos1/hello", String.class);
}
}
数次访问 http://localhost:8083/consumer 查看结果
Sentinel
分布式系统的流量防卫兵
- 使用场景丰富
- 有完备的实时监控
- 广泛的开原生态
两个核心:
- 核心库, 不依赖任何框架/库,能够运行于所有 Java 运行时环境,同时对 Dubbo / Spring Cloud 等框架也有较好的支持
- 控制台, 基于 Spring Boot 开发,打包后可以直接运行,不需要额外的 Tomcat 等应用容器。
安装
下载下来后是一个jar包,直接运行即可
# 如果不指定
java -jar xxxxxxxxx.jar --server.port=8084
启动成功后浏览器访问 localhost:8084 进入登录页面,用户名和密码默认都是 sentinel
使用
- 新建 springboot 项目,添加
sentinel和web依赖
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
<version>2.2.4.RELEASE</version>
</dependency>
</dependencies>
配置文件
spring.application.name=sentinel
# 控制台地址
spring.cloud.sentinel.transport.dashboard=localhost:8080
server.port=8081
新建接口
@RestController
public class HelloController {
@GetMapping("/hello")
public String hello() {
return "hello sentinel";
}
}
启动项目访问后,刷新查看控制台 localhost:8081
可以看到 实时监控 中有请求过来的时间等信息
- 点击控制台
簇点链路,这里可以进行流控、降级等操作
点击流控可以设置流控规则
上图表示,每秒最多处理 5 个请求,超出范围则排队等待最多 1 秒
然后可以写一个单元测试,测试一下
@Test
void contextLoads() {
for (int i = 0; i < 20; i++) {
RestTemplate restTemplate = new RestTemplate();
String str = restTemplate.getForObject("http://localhost:8081/hello", String.class);
System.out.println(str + " : " + new Date());
}
}
查看控制台
Nacos 和 Sentinel 的整合
流控这种操作也可以结合 Nacos 来做
新建项目,引入依赖
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
<version>2.2.4.RELEASE</version>
</dependency>
<dependency>
<groupId>com.alibaba.csp</groupId>
<artifactId>sentinel-datasource-nacos</artifactId>
<version>1.7.2</version>
</dependency>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
<version>2.2.4.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
application配置
# 应用名
spring.application.name=sentinel
# 控制台地址
spring.cloud.sentinel.transport.dashboard=localhost:8080
# 端口
server.port=8081
# 注册中心地址
spring.cloud.sentinel.datasource.ds.nacos.server-addr=192.168.189.101:8848
# nacos 里 Data Id 的值
spring.cloud.sentinel.datasource.ds.nacos.data-id=sentinel-rule
# group
spring.cloud.sentinel.datasource.ds.nacos.group-id=DEFAULT_GROUP
# 限流规则(下面代码的意思是直连)
spring.cloud.sentinel.datasource.ds.nacos.rule-type=flow
bootstrap配置
spring.cloud.nacos.config.server-addr=192.168.189.101:8848
nacos管理页面 http://ip:8848/nacos 添加配置
[
{
"resource":"/hello", // 限流接口
"limitApp":"default", // 流控针对的调用源,default表示不区分类型(小程序,app)
"grade":1, // 阈值类型,1表示根据QPS,0表示并发线程数
"count":5, // 单机流量数
"clusterMode":false, // 是否是集群模式
"strategy":0, // 流控模式,0表示直接
"controlBehavior":0 // 流控效果,0表示等待
}
]
发布
启动项目