概述
一、Sentinel
分布式系统的流量防卫兵
1.Sentinel是什么?
随着微服务的流行,服务和服务之间的稳定性变得越来越重要。Sentinel 以流量为切入点,从流量控制、熔断降级、系统负载保护等多个维度保护服务的稳定性。
2.Sentinel具有以下特征:
丰富的应用场景:Sentinel 承接了阿里巴巴近 10 年的双十一大促流量的核心场景,例如秒杀(即突发流量控制在系统容量可以承受的范围)、消息削峰填谷、集群流量控制、实时熔断下游不可用应用等。
完备的实时监控:Sentinel 同时提供实时的监控功能。您可以在控制台中看到接入应用的单台机器秒级数据,甚至 500 台以下规模的集群的汇总运行情况。
广泛的开源生态:Sentinel 提供开箱即用的与其它开源框架/库的整合模块,例如与 Spring Cloud、Dubbo、gRPC 的整合。您只需要引入相应的依赖并进行简单的配置即可快速地接入 Sentinel。
完善的 SPI 扩展点:Sentinel 提供简单易用、完善的 SPI 扩展接口。您可以通过实现扩展接口来快速地定制逻辑。例如定制规则管理、适配动态数据源等。
3.Sentinel作用?
①容错:服务消费者去调用服务提供者,当服务提供者发生异常时,服务消费者也会挂掉,容错机制就是保证,当服务提供者挂掉后,服务消费者仍然会返回兜底数据,让客户察觉不到服务挂掉了,提升用户的体验
②流量监控:可以监控到每一个窗口的实时的流量qps(每秒接口请求数量)
③熔断降级:
现实中的熔断:当电流过大,保险丝熔断,保护电器
微服务中:当流量过大,异常数量超过一定阀值,就会触发熔断,调用降级的策略,响应用户的数据
4.容错
在springcloud-alibaba父工程和springcloud-alibaba-provider子工程,以及springcloud-feign-consumer子工程的基础上做以下操作:(工程在Spring Cloud Alibaba第一篇就已经建好,这里就不再创建了)
1.在feign-consumer的配置文件中引入哨兵依赖
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
</dependency>
2.在配置文件开启哨兵容错(前提是先关闭feign的容错,因为这里要测试Sentinel的容错机制,又因为Feign的容错机制的优先级高于Sentinel的容错的优先级,所以要关闭Feign的容错,我先不关闭Feign的容错进行测试)
#开启哨兵容错
feign.sentinel.enabled=true
3.在FeignTestcontroller中使用哨兵配置容错策略
package com.qf.controller;
import com.alibaba.csp.sentinel.annotation.SentinelResource;
import com.qf.entity.Student;
import com.qf.service.FeignService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class FeignTestController {
@Autowired
private FeignService feignService;
@RequestMapping("/test1")
public String test1(){
// 调用远程 provider 中的 @RequestMapping("/getMessage/{msg}")
return feignService.getMessage("hello BeiJing");
}
@RequestMapping("/test2")
public String test2(){
// 远程调用 @RequestMapping("/say")
// public String say(@RequestParam("msg") String msg)
return feignService.say("hello - java2109");
}
// 配置哨兵的容错 策略
@SentinelResource(value = "test3",fallback = "fallBackTest3")
@RequestMapping("/test3")
public Student test3(){
Student student = new Student(100,"xiaohua",13,"man",173.5f);
return feignService.updateStudent(student);
}
/**
* 容错的方法的返回值 一定要和处理器返回的方法值一样,否则前端会报错
* 兜底数据
* @return
* */
public Student fallBackTest3(){
Student student = new Student();
student.setName("----哨兵容错返回");
return student;
}
}
4.只启动 feign -consumer,不启动provider 进行测试(前提要先启动nacos)
关闭feign的容错,在application.properties文件中修改
在FeignService中将Feign的容错的配置关闭
重新启动服务器,再次访问:http://localhost:8086/test3
5.使用哨兵Sentinel控制台
Sentinel 控制台提供一个轻量级的控制台,它提供机器发现,单机资源实时监控,集群资源汇总,以及规则管理的功能。您只需要对应用进行简单的配置,就可以使用这些功能。
- 流量监控
- 熔断降级
5.1 安装配置
1.下载:sentinel-dashboard-1.8.0 (1).jar
2.在当前jar包所在的文件夹下启动cmd窗口输入以下命令,进行端口号为8089的启动
java -Dserver.port=8089 -Dcsp.sentinel.dashboard.server=localhost:8089 -Dproject.name=sentinel-dashboard -jar sentinel-dashboard-1.8.0.jar
3.访问:
http://localhost:8089/#/login 用户名:sentinel 密码:sentinel
5.2 流量监控
4.将应用接入到控制台 ,在feign-consuer中的application.properties文件中进行配置
#配置哨兵地址 将每一次请的信息 提交到 哨兵控制台
spring.cloud.sentinel.transport.dashboard=localhost:8089
5.重新启动feign-consuer,多访问几次接口,在哨兵控制台就可以看到监控的流量
6 熔断降级
6.1 基于流量的熔断降级
1.配置熔断降级规则 ,在FeignTestController中进行配置,然后重启应用,然后访问:http://localhost:8086/test3 (由于我配置了nacos,所以在每次启动应用以前,我的nacos都是开启的状态,就没关闭过,方便测试)
package com.qf.controller;
import com.alibaba.csp.sentinel.annotation.SentinelResource;
import com.alibaba.csp.sentinel.slots.block.BlockException;
import com.qf.entity.Student;
import com.qf.service.FeignService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class FeignTestController {
@Autowired
private FeignService feignService;
@RequestMapping("/test1")
public String test1(){
// 调用远程 provider 中的 @RequestMapping("/getMessage/{msg}")
return feignService.getMessage("hello BeiJing");
}
@RequestMapping("/test2")
public String test2(){
// 远程调用 @RequestMapping("/say")
// public String say(@RequestParam("msg") String msg)
return feignService.say("hello - java2109");
}
/**
*
* blockHandler="blockHandlerTest3" 配置熔断降级
*
* */
// fallback = "fallBackTest3" 即配置哨兵的容错 策略
@SentinelResource(value = "test3",fallback = "fallBackTest3",blockHandler = "blockHandlerTest3")
@RequestMapping("/test3")
public Student test3(){
Student student = new Student(100,"xiaohua",13,"man",173.5f);
return feignService.updateStudent(student);
}
/**
* 熔断降级 规则
*
* 该规则中必须有 BlockException e 形式参数,否则该降级策略无法生效
* 兜底数据
* @return
* */
public Student blockHandlerTest3(BlockException e){
e.printStackTrace();
Student student = new Student();
student.setName("哨兵熔断 降级 返回数据");
return student;
}
/**
* 容错的方法的返回值 一定要和处理器返回的方法值一样,否则前端会报错
* 兜底数据
* @return
* */
public Student fallBackTest3(){
Student student = new Student();
student.setName("----哨兵容错返回");
return student;
}
}
2.在控制台增加流控规则 (一定要注意,应用重启,流控规则失效)
3.快速的刷新请求 测试
6.2 其它熔断降级
慢调用比例
异常比例
异常数
降级规则
1 平均响应时间 (DEGRADE_GRADE_RT):当资源的平均响应时间超过阈值(DegradeRule 中的 count,以 ms 为单位)之后,资源进入准降级状态。接下来如果持续进入 5 个请求,它们的 RT 都持续超过这个阈值,那么在接下的时间窗口(DegradeRule 中的 timeWindow,以 s 为单位)之内,对这个方法的调用都会自动地返回(抛出 DegradeException)。在下一个时间窗口到来时, 会接着再放入5个请求, 再重复上面的判断.
2 异常比例 (DEGRADE_GRADE_EXCEPTION_RATIO):当资源的每秒异常总数占通过量的比值超过阈值(DegradeRule 中的 count)之后,资源进入降级状态,即在接下的时间窗口(DegradeRule中的 timeWindow,以 s 为单位)之内,对这个方法的调用都会自动地返回。异常比率的阈值范围是 [0.0, 1.0],代表 0% - 100%。
3 异常数 (DEGRADE_GRADE_EXCEPTION_COUNT):当资源近 1 分钟的异常数目超过阈值之后会进行熔断。
参考博文如下:
Sentinel规则之熔断降级规则_ouYang的博客-CSDN博客_sentinel 熔断规则
二、Sleuth
sleuth 是一个链路追踪工具,主要用来检测 收集 所有远程请求的响应时长,及依赖
Spring Cloud Sleuth为Spring Cloud实现了分布式跟踪解决方案.
其实是一个工具,它在整个分布式系统中能跟踪一个用户请求的过程(包括数据采集,数据传输,数据存储,数
据分析,数据可视化),捕获这些跟踪数据,就能构建微服务的整个调用链的视图,这是调试和监控微服务的关键工具。
一个请求过来,调用服务,一条链路通过Trace Id唯一标识,Span标识发起的请求,各Span通过parent id关联起来。
2.1 Sleuth的术语
Span:基本工作单元,发送一个远程调度任务,就会产生一个Span,Span是一个64位ID唯一标识的
Trace:用另一个64位ID唯一标识的,Trace还有其他数据信息,比如摘要、时间戳事件、Trace的ID,以及进度ID。
Trace包含多个span
一个请求过来,调用服务,一条链路通过Trace ID唯一标识,Span标识发起的请求,各Span通过parent id关联起来。
微服务跟踪(Sleuth)其实是一个工具,它在整个分布式系统中能跟踪一个用户请求的过程(包括数据采集,数据传输,数据存储,数据分析,数据可视化),捕获这些跟踪数据,就能构建微服务的整个调用链的视图,这是调试和监控微服务的关键工具。
2.2 SpringCloudSleuth有4个特点
特点 | 说明 |
---|---|
提供链路追踪 | 通过sleuth可以很清楚的看出一个请求经过了哪些服务, 可以方便的理清服务的调用关系 |
性能分析 | 通过sleuth可以很方便的看出每个采集请求的耗时, 分析出哪些服务调用比较耗时,当服务调用的耗时 随着请求量的增大而增大时,也可以对服务的扩容提 供一定的提醒作用 |
数据分析 优化链路 | 对于频繁地调用一个服务,或者并行地调用等, 可以针对业务做一些优化措施 |
可视化 | 对于程序未捕获的异常,可以在zipkpin界面上看到 |
2.3 Zipkin
Zipkin是一个分布式跟踪系统。它有助于收集解决服务体系结构中的延迟问题所需的时序数据。功能包括该数据的收集和查找。
重点在于展示:链路追踪,查找数据
ipkin 是 Twitter 的一个开源项目,它基于 Google Dapper 实现,它致力于收集服务的定时数据,以解决微服
务架构中的延迟问题,包括数据的收集、存储、查找和展现。 我们可以使用它来收集各个服务器上请求链路
的跟踪数据,并通过它提供的 REST API 接口来辅助我们查询跟踪数据以实现对分布式系统的监控程序,从而
及时地发现系统中出现的延迟升高问题并找出系统性能瓶颈的根源。除了面向开发的 API 接口之外,它也提
供了方便的 UI 组件来帮助我们直观的搜索跟踪信息和分析请求链路明细,比如:可以查询某段时间内各用户
请求的处理时间等。 Zipkin 提供了可插拔数据存储方式:In-Memory、MySql、Cassandra 以及 Elasticsearch。
接下来的测试为方便直接采用 In-Memory 方式进行存储,生产推荐 Elasticsearch。
2.4 案例
1.下载
https://search.maven.org/remote_content?g=io.zipkin&a=zipkin-server&v=LATEST&c=exec
2.启动,在命令行输入:
java -jar zipkin-server-2.22.2-exec.jar
3.访问
http://127.0.0.1:9411/zipkin/
4.将Feigin应用的监控数据上传到 zipkin
在springcloud-feign-consumer应用中引入依赖(sleuth,zipkin)
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-sleuth</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-zipkin</artifactId>
</dependency>
在application.properties文件中配置
#配置sleuth
# 采样率
spring.sleuth.sampler.probability=1
#要将数据上传到 127.0.0.1:9411
spring.zipkin.base-url=http://127.0.0.1:9411
#以http 形式上传
spring.zipkin.sender.type=web
spring.zipkin.service.name=springcloud-alibaba-feign-consumer
#显示日志
logging.level.root=info
logging.level.org.springframework.web.servlet.DispatcherServlet=debug
logging.level.org.springframework.cloud.sleuth=debug
启动服务提供者provider,再启动feign-consumer,然后访问:http://localhost:8086/test3
接口调用
最后访问:http://127.0.0.1:9411/zipkin/,访问之后多刷新几次服务页面
三、GateWay(网关)
Gateway 网关,同以前学的过滤器,拦截器的作用基本一样,拦截,过滤 鉴权,记录日志 等功能
过滤器,拦截器?
过滤器:他是servlet 中的内容,接口,作用可以拦截所有的servlet
拦截器:他是springmvc 中的,作用拦截 DispatchServlet中的内容
使用设计模式:责任链模式
3.1 什么是 Spring Cloud Gateway?
Spring Cloud Gateway 是 Spring 官方基于 Spring 5.0,Spring Boot 2.0 和 Project Reactor 等技术开发的网关,Spring Cloud Gateway 旨在为微服务架构提供一种简单而有效的统一的 API 路由管理方式。Spring Cloud Gateway 作为 Spring Cloud 生态系中的网关,目标是替代 Netflix ZUUL,其不仅提供统一的路由方式,并且基于 Filter 链的方式提供了网关基本的功能,例如:安全,监控/埋点,和限流,路由等。
安全:鉴权
监控/埋点:记录日志
限流:限制流量
路由:路径重写,提供统一的接口规范
功能特征
基于 Spring Framework 5,Project Reactor 和 Spring Boot 2.0
动态路由
Predicates 和 Filters 作用于特定路由
集成 Hystrix 断路器 和 sentinel 类似
集成 Spring Cloud DiscoveryClient
易于编写的 Predicates 和 Filters
限流( Hystrix )
路径重写
3.2 案例
1.创建一个Springcloud-alibaba-gateway工程
<dependencies>
<!--
gate way 依赖 和 spring-boot-starter-web 依赖是 互斥关系,两者不可以共存
网关中 不可以有 spring-boot-starter-web依赖
-->
<!--alibaba.cloud 相关-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-gateway</artifactId>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
</dependency>
</dependencies>
2.创建启动类
package com.qf;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
@EnableDiscoveryClient
@SpringBootApplication
public class GatewayApplication {
public static void main(String[] args) {
SpringApplication.run(GatewayApplication.class,args);
}
}
3. 创建application.yaml配置文件
spring:
application:
name: springcloud-alibaba-gateway
cloud:
gateway:
routes:
- id: springcloud-alibaba-consumer #设置id
uri: lb://springcloud-alibaba-consumer #设置服务名
predicates:
- Method=GET,POST #设置请求方法
- Path=/api1/* #设置匹配路径的网关
filters:
- StripPrefix=1 #去掉前缀offer
- id: springcloud-alibaba-feign-consumer
uri: lb://springcloud-alibaba-feign-consumer
predicates:
- Method=GET,POST
- Path=/api2/*
filters:
- StripPrefix=1
server:
port: 9000
logging:
level:
org.springframework.cloud.gateway: debug
3.3 Gateway的负载均衡
修改application.yaml配置文件
spring:
application:
name: springcloud-alibaba-gateway
cloud:
gateway:
routes:
- id: springcloud-alibaba-consumer #设置id
uri: lb://springcloud-alibaba-consumer #设置服务名
predicates:
- Method=GET,POST #设置请求方法
- Path=/api/* #设置匹配路径的网关
- Weight=g1,2
filters:
- StripPrefix=1 #去掉前缀offer
- id: springcloud-alibaba-feign-consumer
uri: lb://springcloud-alibaba-feign-consumer
predicates:
- Method=GET,POST
- Path=/api/*
- Weight=g1,8
filters:
- StripPrefix=1
server:
port: 9000
logging:
level:
org.springframework.cloud.gateway: debug
3.4 基于filter 实现拦截鉴权功能
拦截鉴权的路径,一般都是去检查 token ,路径中必须携带token
http://localhost:9000/api/test1?token=xxxxxx
token:就是令牌,就是通行证,包含了该用户的个人信息,我们可以看到一长串字符串,但是能解析出来 该用户的信息,权限,账户等内容,
在登录的时候生成,返回给前端,前端后续发起的请求都要携带token ,需要验证
1.创建config包下的TokenFilter
package com.qfedu.config;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.springframework.cloud.gateway.filter.GatewayFilterChain;
import org.springframework.cloud.gateway.filter.GlobalFilter;
import org.springframework.core.Ordered;
import org.springframework.core.io.buffer.DataBuffer;
import org.springframework.http.HttpStatus;
import org.springframework.http.server.reactive.ServerHttpRequest;
import org.springframework.http.server.reactive.ServerHttpResponse;
import org.springframework.stereotype.Component;
import org.springframework.util.StringUtils;
import org.springframework.web.server.ServerWebExchange;
import reactor.core.publisher.Mono;
import java.util.HashMap;
import java.util.Map;
@Component
public class TokenFilter implements GlobalFilter , Ordered {
@Override // 过滤拦截
public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
// 获取请求路径中的 token ,如果没有传递token 则拦截该请求
// ServerWebExchange exchange 包含了 所有的请求数据
ServerHttpRequest request = exchange.getRequest();
String token = request.getQueryParams().getFirst("token");
if (StringUtils.isEmpty(token)){ // 拦截
// 返回前端 说 没有传递token
//固定写法 返回json
ServerHttpResponse response = exchange.getResponse();
Map<String,Object> responseData = new HashMap<>();
responseData.put("code",401);
responseData.put("message","非法请求,请传递token");
try {
// 将信息转换为 JSON
ObjectMapper objectMapper = new ObjectMapper();
byte[] data = objectMapper.writeValueAsBytes(responseData);
// 输出错误信息到页面
DataBuffer buffer = response.bufferFactory().wrap(data);
response.setStatusCode(HttpStatus.UNAUTHORIZED);
response.getHeaders().add("Content-Type", "application/json;charset=UTF-8");
return response.writeWith(Mono.just(buffer));
} catch (JsonProcessingException e) {
e.printStackTrace();
}
}
// 放行 不拦截
return chain.filter(exchange);
}
@Override
public int getOrder() {
// s数字越小优先级 越高
return Ordered.HIGHEST_PRECEDENCE;
}
}
启动配置文件中配置的对应的应用,开始访问
最后
以上就是等待月亮为你收集整理的Spring Cloud Alibaba 第二篇(Sentinel、Sleuth、Gateway组件)一、Sentinel二、Sleuth 三、GateWay(网关)的全部内容,希望文章能够帮你解决Spring Cloud Alibaba 第二篇(Sentinel、Sleuth、Gateway组件)一、Sentinel二、Sleuth 三、GateWay(网关)所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复