赞
踩
1.引入sentinel依赖
- <!--sentinel-->
- <dependency>
- <groupId>com.alibaba.cloud</groupId>
- <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
- </dependency>
2)配置控制台
- server:
- port: 8088
- spring:
- cloud:
- sentinel:
- transport:
- dashboard: localhost:8080
3)访问order-service的任意端点
打开浏览器,访问http://localhost:8080/order/101,这样才能触发sentinel的监控。然后再访问sentinel的控制台,查看簇点链路,查看当前访问的服务
a.流控:流量控制![image-20210715191757319](assets/image-20210715191757319.png)
正在上传…
其含义是限制 /order/{orderId}这个资源的单机QPS为1,即每秒只允许1次请求,超出的请求会被拦截并报错。
例如有两条请求链路:/test1 --> /common , /test2 --> /common,如果只希望统计从/test2进入到/common的请求,则可以这样配置:
需要给service方法添加@SentinelResource("goods") ,簇点默认是只添加controller,要使链路模式生效需要修改配置文件,关闭context整合
- spring:
- cloud:
- sentinel:
- web-context-unify: false # 关闭context整合
4.流控效果
4.1 warm up 预热模式 ,应对服务冷启动的一种方案。请求阈值初始值是 maxThreshold / coldFactor,持续指定时长后,逐渐提高到maxThreshold值。而coldFactor的默认值是3.
例如,我设置QPS的maxThreshold为10,预热时间为5秒,那么初始阈值就是 10 / 3 ,也就是3,然后在5秒后逐渐增长到10.
4.2 排队等待
当请求超过QPS阈值时,快速失败和warm up 会拒绝新的请求并抛出异常。
而排队等待则是让所有请求进入一个队列中,然后按照阈值允许的时间间隔依次执行。后来的请求必须等待前面执行完成,如果请求预期的等待时间超出最大时长,则会被拒绝。
工作原理
例如:QPS = 5,意味着每200ms处理一个队列中的请求;timeout = 2000,意味着预期等待时长超过2000ms的请求会被拒绝并抛出异常。
热点参数限流,在controller方法上添加@sentinelresource("hot")
隔离和降级
1. 修改配置,开启sentinel功能
- feign:
- sentinel:
- enabled: true # 开启feign对sentinel的支持
2.编写失败降级逻辑
业务失败后,不能直接报错,而应该返回用户一个友好提示或者默认结果,这个就是失败降级逻辑。给FeignClient编写失败后的降级逻辑
- package cn.itcast.feign.clients.fallback;
-
- import cn.itcast.feign.clients.UserClient;
- import cn.itcast.feign.pojo.User;
- import feign.hystrix.FallbackFactory;
- import lombok.extern.slf4j.Slf4j;
-
- @Slf4j
- public class UserClientFallbackFactory implements FallbackFactory<UserClient> {
- @Override
- public UserClient create(Throwable throwable) {
- return new UserClient() {
- @Override
- public User findById(Long id) {
- log.error("查询用户异常", throwable);
- return new User();
- }
- };
- }
- }
3.在feing-api项目中的DefaultFeignConfiguration类中将UserClientFallbackFactory注册为一个Bean:
- @Bean
- public UserClientFallbackFactory userClientFallbackFactory(){
- return new UserClientFallbackFactory();
- }
4.在feign-api项目中的UserClient接口中使用UserClientFallbackFactory:
- import cn.itcast.feign.clients.fallback.UserClientFallbackFactory;
- import cn.itcast.feign.pojo.User;
- import org.springframework.cloud.openfeign.FeignClient;
- import org.springframework.web.bind.annotation.GetMapping;
- import org.springframework.web.bind.annotation.PathVariable;
-
- @FeignClient(value = "userservice", fallbackFactory = UserClientFallbackFactory.class)
- public interface UserClient {
-
- @GetMapping("/user/{id}")
- User findById(@PathVariable("id") Long id);
- }
状态机包括三个状态: 关闭状态,打开状态,half-open
断路器熔断策略有三种:慢调用、异常比例、异常数
慢调用:业务的响应时长(RT)大于指定时长的请求认定为慢调用请求。在指定时间内,如果请求数量超过设定的最小数量,慢调用比例大于设定的阈值,则触发熔断。
解读:RT超过500ms的调用是慢调用,统计最近10000ms内的请求,如果请求量超过10次,并且慢调用比例不低于0.5,则触发熔断,熔断时长为5秒。然后进入half-open状态,放行一次请求做测试。
异常比例或异常数:统计指定时间内的调用,如果调用次数超过指定请求数,并且出现异常的比例达到设定的比例阈值(或超过指定异常数),则触发熔断。
1.order-service服务中,我们定义一个RequestOriginParser的实现类:
- package cn.itcast.order.sentinel;
-
- import com.alibaba.csp.sentinel.adapter.spring.webmvc.callback.RequestOriginParser;
- import org.springframework.stereotype.Component;
- import org.springframework.util.StringUtils;
-
- import javax.servlet.http.HttpServletRequest;
-
- @Component
- public class HeaderOriginParser implements RequestOriginParser {
- @Override
- public String parseOrigin(HttpServletRequest request) {
- // 1.获取请求头
- String origin = request.getHeader("origin");
- // 2.非空判断
- if (StringUtils.isEmpty(origin)) {
- origin = "blank";
- }
- return origin;
- }
- }
2.给网关添加请求头
- spring:
- cloud:
- gateway:
- default-filters:
- - AddRequestHeader=origin,gateway
- routes:
- # ...略
3.配置请求规则
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。