简介
Alibaba出版,分布式系统的流量防卫兵,以流量为切入点,从流量控制、熔断降级、系统负载保护等多个维度保护服务的稳定性。
特征:
- 丰富的应用场景:Sentinel 承接了阿里巴巴近 10 年的双十一大促流量的核心场景,例如秒杀(即突发流量控制在系统容量可以承受的范围)、消息削峰填谷、集群流量控制、实时熔断下游不可用应用等。
- 完备的实时监控:Sentinel 同时提供实时的监控功能。您可以在控制台中看到接入应用的单台机器秒级数据,甚至 500 台以下规模的集群的汇总运行情况。
- 广泛的开源生态:Sentinel 提供开箱即用的与其它开源框架/库的整合模块,例如与 Spring Cloud、Apache Dubbo、gRPC、Quarkus 的整合。您只需要引入相应的依赖并进行简单的配置即可快速地接入 Sentinel。同时 Sentinel 提供 Java/Go/C++ 等多语言的原生实现。
- 完善的 SPI 扩展机制:Sentinel 提供简单易用、完善的 SPI 扩展接口。您可以通过实现扩展接口来快速地定制逻辑。例如定制规则管理、适配动态数据源等。
Sentinel 的使用可以分为两个部分:
- 核心库(Java 客户端):不依赖任何框架/库,能够运行于 Java 8 及以上的版本的运行时环境,同时对 Dubbo / Spring Cloud 等框架也有较好的支持(见 主流框架适配)。
- 控制台(Dashboard):Dashboard 主要负责管理推送规则、监控、管理机器信息等。
官网地址:https://github.com/alibaba/Sentinel/wiki/介绍
代码(Sentinel是针对消费端,故服务提供端代码不需要任何修改)
- 消费端POM引入依赖
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
</dependency>
- 消费端YML添加
sentinel:
transport:
# 配置Sentinel dashboard地址
dashboard: localhost:8080
# 默认8719端口,键入被占用会自动从8719+1,直到找到未被占用的端口
port: 8719
- 添加接口
@GetMapping("/getSentinel")
public String getSentinel(){
return "Sentinel demo!";
}
客户端启动
客户端下载地址:
链接:https://pan.baidu.com/s/10N9wOaeNj7PasaZKpExBaw
提取码:lxoi
启动命令: java -jar sentinel-dashboard-1.8.3.jar
添加限流设置
-
http://127.0.0.1:9010/getSentinel: 访问消费端接口;
-
Sentinel客户端添加限流规则
-
http://127.0.0.1:9010/getSentinel:再次访问接口;发现在1秒内访问多次发生了限流。
OpenFeign
简介
OpenFeign是一种声明式、模板化的HTTP客户端。在Spring Cloud中使用OpenFeign,可以做到使用HTTP请求访问远程服务,就像调用本地方法一样的,开发者完全感知不到这是在调用远程方法,更感知不到在访问HTTP请求,用法其实就是编写一个接口,在接口上添加注解即可。
可以简单理解它是借鉴Ribbon的基础之上,封装的一套服务接口+注解的方式的远程调用器。
官网地址:https://spring.io/projects/spring-cloud-openfeign
代码
- pom依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
<version>2.2.5.RELEASE</version>
</dependency>
- yml配置
#设置feign客户端超时时间(OpenFeign默认支持ribbon)
ribbon:
#指的是建立连接所用的时间,适用于网络状况正常的情况下,两端连接所用的时间
ReadTimeout: 5000
#指的是建立连接后从服务器读取到可用资源所用的时间
ConnectTimeout: 5000
# 激活Sentinel对OpenFeign的支持
feign:
sentinel:
enabled: true
- 添加注解
//添加此注解
@EnableFeignClients
- 添加消费端接口
@GetMapping("/getFeign/{id}")
public String getFeign(@PathVariable Integer id){
return service.getFeign(id+"");
}
- 添加Feign接口
@Service
//表示远程调用服务名称
@FeignClient(value = "nacos-config",fallback = OpenFeignServiceImpl.class)
public interface OpenFeignService {
/**
* 此方法表示远程调用info/{id}接口
*/
@GetMapping("/getFeign/{id}")
public String getFeign(@PathVariable String id);
}
- 添加服务降级接口
@Component
public class OpenFeignServiceImpl implements OpenFeignService {
@Override
public String getFeign(String id) {
return "服务降级,请稍后访问!";
}
}
- 添加服务提供端请求接口
@GetMapping("/getFeign/{id}")
public String getFeign(@PathVariable String id){
return "Feign进行访问,传入ID:"+id;
}
测试
测试成功