SpringCloud Zuul实现负载均衡和熔断机制方式

时间:2022-09-07 20:25:24

一、场景

笔者就Zuul网关下实现其负载均衡与熔断机制(雪崩)进行实践,前提是已经导入zuul相关依赖

springboot版本:1.5.9.RELEASE

springcloud版本:Dalston.SR5

  1. <dependencies>
  2. <dependency>
  3. <groupId>org.springframework.cloud</groupId>
  4. <artifactId>spring-cloud-starter-zuul</artifactId>
  5. </dependency>
  6. <dependency>
  7. <groupId>com.netflix.zuul</groupId>
  8. <artifactId>zuul-core</artifactId>
  9. <version>1.3.0</version>
  10. </dependency>
  11. </dependencies>

二、场景实现

1、在网关的配置文件中配置ribbon(负载均衡)和hystrix(熔断机制)

  1. #熔断机制
  2. hystrix:
  3. command:
  4. default:
  5. execution:
  6. isolation:
  7. thread:
  8. timeoutInMilliseconds: 6000
  9.  
  10. #负载均衡
  11. ribbon:
  12. ConnectionTimeout: 500
  13. ReadTimeout: 2000
  14. #端口
  15. server:
  16. port: 8080
  17. spring:
  18. #该配置文件中的配置,对应的服务名称是wc-gateway
  19. application:
  20. name: wc-gateway
  21. profiles:
  22. active: dev
  23. #服务网关配置
  24. zuul:
  25. host:
  26. connect-timeout-millis: 60000
  27. socket-timeout-millis: 60000
  28. #路由规则
  29. routes:
  30. api:
  31. path: /api/user/**
  32. serviceId: wc-client-user

其实ribbon的真实值=(ConnectionTimeout+ReadTimeout)*2,该值最好小于hystrix的timeoutInMilliseconds的值,因为如果大于其值会失去负载均衡(ribbon)的重试机会,而直接熔断

2、验证负载均衡

因为zuul下自带了hystrix,ribbon相关jar包,所有现在已经实现了负载均衡和熔断机制,接下来进行验证

在client服务下编写controller,测试负载均衡

  1. package top.wingcloud.controller;
  2. import org.springframework.beans.factory.annotation.Value;
  3. import org.springframework.web.bind.annotation.RequestMapping;
  4. import org.springframework.web.bind.annotation.RestController;
  5.  
  6. /**
  7. * @author: linjie
  8. * @description: 用户服务请求处理控制器
  9. * @create: 2018/11/06 09:16
  10. */
  11. @RestController
  12. public class UserController {
  13. @Value("${server.port}")
  14. private int port;
  15. @RequestMapping("index")
  16. public String index(){
  17. return "Hello World!"+port;
  18. }
  19. }

依次启动注册中心、配置中心、client服务、修改端口再次启动client服务、服务网关

根据网关的路由,访问同一个路由,发现启动的两个不同端口的client服务交替执行

SpringCloud Zuul实现负载均衡和熔断机制方式

SpringCloud Zuul实现负载均衡和熔断机制方式

出现该情况即实现了负载均衡

3、验证熔断机制

在网关服务中需要写ZuulFallbackProvider的实现类

  1. package top.wingcloud.filter;
  2. import org.springframework.cloud.netflix.zuul.filters.route.ZuulFallbackProvider;
  3. import org.springframework.http.HttpHeaders;
  4. import org.springframework.http.HttpStatus;
  5. import org.springframework.http.MediaType;
  6. import org.springframework.http.client.ClientHttpResponse;
  7. import org.springframework.stereotype.Component;
  8. import java.io.ByteArrayInputStream;
  9. import java.io.IOException;
  10. import java.io.InputStream;
  11.  
  12. /**
  13. * @author: linjie
  14. * @description:错误拦截回显,熔断
  15. * @create: 2018/10/11 20:01
  16. */
  17. @Component
  18. public class ApiFallbackProvider implements ZuulFallbackProvider{
  19.  
  20. @Override
  21. public String getRoute() {
  22. //设置熔断的服务名
  23. //如果是所有服务则设置为*
  24. return "wc-client-user";
  25. }
  26.  
  27. @Override
  28. public ClientHttpResponse fallbackResponse() {
  29. return new ClientHttpResponse() {
  30. @Override
  31. public HttpStatus getStatusCode() throws IOException {
  32. return HttpStatus.OK;
  33. }
  34.  
  35. @Override
  36. public int getRawStatusCode() throws IOException {
  37. return 200;
  38. }
  39.  
  40. @Override
  41. public String getStatusText() throws IOException {
  42. return "{code:0,message:service error =_=}";
  43. }
  44.  
  45. @Override
  46. public void close() {
  47.  
  48. }
  49.  
  50. @Override
  51. public InputStream getBody() throws IOException {
  52. return new ByteArrayInputStream(getStatusText().getBytes());
  53. }
  54.  
  55. @Override
  56. public HttpHeaders getHeaders() {
  57. HttpHeaders headers = new HttpHeaders();
  58. headers.setContentType(MediaType.APPLICATION_JSON);
  59. return headers;
  60. }
  61. };
  62. }
  63. }

这个时候关闭client所有服务,再次访问之前的网关路由

出现了getStatusText()中的提示,即实现了熔断机制

SpringCloud Zuul实现负载均衡和熔断机制方式好了,zuul下的负载均衡和熔断已经实现!

zuul网关配置+限流熔断

被调方:延时600ms

SpringCloud Zuul实现负载均衡和熔断机制方式

ahas:

SpringCloud Zuul实现负载均衡和熔断机制方式

user限流:

SpringCloud Zuul实现负载均衡和熔断机制方式

trade熔断:(3秒内请求数>4)&&(3s内慢调用/请求数>50%) -》》开启熔断

慢调用标准:响应时间大于500ms

SpringCloud Zuul实现负载均衡和熔断机制方式

20个请求测试:

SpringCloud Zuul实现负载均衡和熔断机制方式

测试限流:

SpringCloud Zuul实现负载均衡和熔断机制方式

测试限流和rt熔断

SpringCloud Zuul实现负载均衡和熔断机制方式

以上为个人经验,希望能给大家一个参考,也希望大家多多支持我们。

原文链接:https://xulinjie.blog.csdn.net/article/details/83796214