我是靠谱客的博主 善良蜻蜓,最近开发中收集的这篇文章主要介绍spring-cloudAlibaba使用sentinel实现熔断限流的步骤,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

spring-cloudAlibaba使用sentinel实现熔断限流的步骤

一、sentinel的熔断、降级

a、远程调用

熔断是要结合远程调用来实现的(Feign或者openFeign),OpenFeign是Spring Cloud 在Feign的基础上支持了Spring MVC的注解,如@RequesMapping等等。
①导包:

<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>

② 开启注解 @EnableFeignClients
③远程调用(在下面的sentinel一起讲解)

b、服务熔断降级

1、导包


<!--sentinel-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
</dependency>

2、在yml中配置,开启sentinel的熔断机制
#开启远程调用sentinel熔断

feign:
sentinel:
enabled: true

3、远程调用并熔断降级
调用处:

@FeignClient(value = "service-provider",fallback = BeautyFeignFallBack.class)
public interface BeautyFeignClients {
@PostMapping(value = "/provider/beauty/querybycondition")
R queryBeauty(@RequestBody Beauty beauty);
}

回调处:

@Component
@Slf4j
public class BeautyFeignFallBack implements BeautyFeignClients {
@Override
public R queryBeauty(Beauty beauty) {
log.info("服务熔断……………………");
return R.error(CommonConstant.reCodeMessage.VISIT_FAIL.getCode(),"sentinel调用熔断降级了");
}
}

到这里就可以算完成了熔断降级。

二、流量监控与限流

① 导包
 <!--审计-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
<version>2.3.3.RELEASE</version>
</dependency>
②、下载sentinel控制台
https://github.com/alibaba/Sentinel/releases

例如下载了:sentinel-dashboard-1.7.1.jar

启动sentinel控制台(windows):
java -jar sentinel-dashboard-1.7.1.jar --server.port=8333
③、配置控制台地址信息,在yml中

①:对外暴露

management.endpoints.web.exposure.include=*

②:连接sentinel控制台

spring:
cloud:
sentinel:
transport:
dashboard: localhost:8333
port: 8719
④、访问localhost:8333(这里根据实际sentinel地址来配置)就可以看到效果了。

在控制台调整参数【所有设置默认是在内存中,重启失效】,限流就是在这里进行

三、这里额外讲解一下 被调用方限流与网管限流

1、被调用方限流

在超大浏览时必须牺牲一些远程服务,在服务提供方制定降级策略。(在服务提供方)
在sentinel的控制台–>簇点电路里面限制某接口的流量 。
例如:单机阈值为1 即QPS 为1。
那么QPS超过 1:就会停止提供服务
这里可以手动制定返回数据内容:
写一个配置类

/**
* @author Admin
* sentinel控制限流,超过限流次数,返回自定义文字
*/
@Configuration
public class SentinelLimitFlowConfig {
public SentinelLimitFlowConfig(){
WebCallbackManager.setUrlBlockHandler(new UrlBlockHandler() {
@Override
public void blocked(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, BlockException e) throws IOException {
R error = R.error(CommonConstant.reCodeMessage.LIMIT_TIMES.getCode(),"在服务提供方限制访问流量");
httpServletResponse.setCharacterEncoding("UTF-8");
httpServletResponse.setContentType("application/json");
httpServletResponse.getWriter().write(JSON.toJSONString(error));
}
});
}
}

总结:在服务提供端限流的步骤
第一、其他步骤跟在服务调用方一致,只需在sentinel控制台,对服务提供者的微服务的具体接口进行限流设置。
第二、写一个配置类,用于返回超流量后的返回信息。不写的话返回自带的限流信息,不规范。

2、网关限流(gateway限流)

① 给网关微服务导包

 <dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-sentinel-gateway</artifactId>
<version>2.1.0.RELEASE</version>
</dependency>

② 网关微服务 配置yml
对外暴露

management.endpoints.web.exposure.include=*

连接sentinel控制台地址

spring:
cloud:
sentinel:
transport:
dashboard: localhost:8333
port: 8719

③自定义网关限流返回内容

@Configuration
public class SentinelGatewayConfig {
public SentinelGatewayConfig(){
GatewayCallbackManager.setBlockHandler(new BlockRequestHandler() {
@Override
public Mono<ServerResponse> handleRequest(ServerWebExchange serverWebExchange, Throwable throwable) {
R error = R.error(CommonConstant.reCodeMessage.VISIT_FAIL.getCode(), "我是网关限流,你已超流量了,被我拦截了,哈哈哈");
String s = JSON.toJSONString(error);
Mono<ServerResponse> body = ServerResponse.ok().body(Mono.just(s), String.class);
return body;
}
});
}
}

④启动后在sentinel控制台设置限流
控制台界面---->网关微服务---->
流控规则---->新增网关流控规则,API 名称 填写网关yml里面的路由配置的 - id对应的内容(例如:- id: provider-route)
这里就填provider-route 。即对该- id对应的路由微服务进行限流。QPS阈值和间隔 分别对应访问次数和时间。
再次访问:在设定时间里超过QPS ,则不能进入该微服务。

最后

以上就是善良蜻蜓为你收集整理的spring-cloudAlibaba使用sentinel实现熔断限流的步骤的全部内容,希望文章能够帮你解决spring-cloudAlibaba使用sentinel实现熔断限流的步骤所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(57)

评论列表共有 0 条评论

立即
投稿
返回
顶部