一、场景
笔者就Zuul网关下实现其负载均衡与熔断机制(雪崩)进行实践,前提是已经导入zuul相关依赖
springboot版本:1.5.9.RELEASE
springcloud版本:Dalston.SR5
<dependencies> <dependency> <groupId> org.springframework.cloud </groupId> <artifactId> spring-cloud-starter-zuul </artifactId> </dependency> <dependency> <groupId> com.netflix.zuul </groupId> <artifactId> zuul-core </artifactId> <version> 1.3.0 </version> </dependency> </dependencies>二、场景实现
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 . annotation . RequestMapping ; import org . springframework . web . bind . annotation . RestController ; /** * @author: linjie * @description: 用户服务请求处理控制器 * @create: 2018/11/06 09:16 */ @RestController public class UserController { @Value ( "${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 public HttpHeaders getHeaders () { HttpHeaders headers = new HttpHeaders (); headers . setContentType ( MediaType . APPLICATION_JSON ); return headers ; } }; } }这个时候关闭client所有服务,再次访问之前的网关路由
出现了getStatusText()中的提示,即实现了熔断机制
好了,zuul下的负载均衡和熔断已经实现!
zuul网关配置+限流熔断
被调方:延时600ms
ahas:
user限流:
trade熔断: (3秒内请求数>4)&&(3s内慢调用/请求数>50%) -》》开启熔断
慢调用标准: 响应时间大于500ms
20个请求测试:
测试限流:
测试限流和rt熔断
以上为个人经验,希望能给大家一个参考,也希望大家多多支持我们。
原文链接:https://xulinjie.blog.csdn.net/article/details/83796214
查看更多关于SpringCloud Zuul实现负载均衡和熔断机制方式的详细内容...