java 单机接口限流处理方案
460
2022-10-14
SpringCloud Zuul实现负载均衡和熔断机制方式
一、场景
笔者就Zuul网关下实现其负载均衡与熔断机制(雪崩)进行实践,前提是已经导入zuul相关依赖
springboot版本:1.5.9.RELEASE
springcloud版本:Dalston.SR5
二、场景实现
1、在网关的配置文件中配置ribbon(负载均衡)和hystrix(熔断机制)
#熔断机制
hystrix:
command:
default:
execution:
isolation:
thread:
timeoutInMilliseconds: 6000
#负载均衡
ribbon:
ConnectionTimeout: 500
ReadTimeout: 2000
#端口
server:
port: 8080
spring:
#该配置文件中的配置,对应的服务名称是wc-gateway
application:
name: wc-gateway
profiles:
active: dev
#服务网关配置
zuul:
host:
connect-timeout-millis: 60000
socket-timeout-millis: 60000
#路由规则
routes:
api:
path: /api/user/**
serviceId: wc-client-user
其实ribbon的真实值=(ConnectionTimeout+ReadTimeout)*2,该值最好小于hystrix的timeoutInMilliseconds的值,因为如果大于其值会失去负载均衡(ribbon)的重试机会,而直接熔断
2、验证负载均衡
因为zuul下自带了hystrix,ribbon相关jar包,所有现在已经实现了负载均衡和熔断机制,接下来进行验证
在client服务下编写controller,测试负载均衡
package top.wingcloud.controller;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotathttp://ion.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
/**
* @author: linjie
* @description: 用户服务请求处理控制器
* @create: 2018/11/06 09:16
*/
@RestController
public class UserController {
@Value("$KrkSKcnGC{server.port}")
private int port;
@RequestMapping("index")
public String index(){
return "Hello World!"+port;
}
}
依次启动注册中心、配置中心、client服务、修改端口再次启动client服务、服务网关
根据网关的路由,访问同一个路由,发现启动的两个不同端口的client服务交替执行
出现该情况即实现了负载均衡
3、验证熔断机制
在网关服务中需要写ZuulFallbackProvider的实现类
package top.wingcloud.filter;
import org.springframework.cloud.netflix.zuul.filters.route.ZuulFallbackProvider;
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpStatus;
import org.springframework.http.MediaType;
import org.springframework.http.client.ClientHttpResponse;
import org.springframework.stereotype.Component;
import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.InputStream;
/**
* @author: linjie
* @description:错误拦截回显,熔断
* @create: 2018/10/11 20:01
*/
@Component
public class ApiFallbackProvider implements ZuulFallbackProvider{
@Override
public String getRoute() {
//设置熔断的服务名
//如果是所有服务则设置为*
return "wc-client-user";
}
@Override
public ClientHttpResponse fallbackResponse() {
return new ClientHttpResponse() {
@Override
public HttpStatus getStatusCode() throws IOException {
return HttpStatus.OK;
}
@Override
public int getRawStatusCode() throws IOException {
return 200;
}
@Override
public String getStatusText() throws IOException {
return "{code:0,message:service error =_=}";
}
@Override
public void close() {
}
@Override
public InputStream getBody() throws IOException {
return new ByteArrayInputStream(getStatusText().getBytes());
}
@Override
KrkSKcnGCpublic HttpHeaders getHeaders() {
HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.APPLICATION_jsON);
return headers;
}
};
}
}
这个时候关闭client所有服务,再次访问之前的网关路由
出现了getStatusText()中的提示,即实现了熔断机制
zuul网关配置+限流熔断
被调方:延时600ms
ahas:
user限流:
trade熔断:(3秒内请求数>4)&&(3s内慢调用/请求数>50%) -》》开启熔断
慢调用标准:响应时间大于500ms
20个请求测试:
测试限流:KrkSKcnGC
测试限流和rt熔断
版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。
发表评论
暂时没有评论,来抢沙发吧~