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

 更新时间:2021年07月05日 09:04:19   作者:浅然言而信  
这篇文章主要介绍了SpringCloud Zuul实现负载均衡和熔断机制方式,具有很好的参考价值,希望对大家有所帮助。

一、场景

笔者就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熔断

在这里插入图片描述

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

相关文章

  • Java8 Optional原理及用法解析

    Java8 Optional原理及用法解析

    这篇文章主要介绍了Java8 Optional原理及用法解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-09-09
  • 如何在springBoot下搭建日志框架

    如何在springBoot下搭建日志框架

    这篇文章主要介绍了如何在springBoot下搭建日志框架,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-06-06
  • spring boot+thymeleaf+bootstrap实现后台管理系统界面

    spring boot+thymeleaf+bootstrap实现后台管理系统界面

    这篇文章主要为大家详细介绍了spring boot+thymeleaf+bootstrap简单实现后台管理系统界面,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-12-12
  • spring实现bean对象创建代码详解

    spring实现bean对象创建代码详解

    这篇文章主要介绍了spring实现bean对象创建代码详解,具有一定借鉴价值,需要的朋友可以参考下
    2017-12-12
  • Java容器类的深入理解

    Java容器类的深入理解

    本篇文章是对Java容器类进行了详细的分析介绍,需要的朋友参考下
    2013-06-06
  • 利用java开发简易版扫雷游戏

    利用java开发简易版扫雷游戏

    这篇文章主要介绍了利用java开发一个丐版扫雷游戏,喜欢玩扫雷的小伙伴们一定要试试哦,对正在学习java开发的小伙伴们也有一定帮助,需要的朋友可以参考下
    2021-04-04
  • Java实现聊天室界面

    Java实现聊天室界面

    这篇文章主要为大家详细介绍了Java实现聊天室界面,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-05-05
  • 关于SpringCloud Ribbon替换轮询算法问题

    关于SpringCloud Ribbon替换轮询算法问题

    Spring Cloud Ribbon是基于Netlix Ribbon实现的一套客户端负载均衡的工具。接下来通过本文给大家介绍SpringCloud Ribbon替换轮询算法问题,需要的朋友可以参考下
    2022-01-01
  • java实现文件复制上传操作

    java实现文件复制上传操作

    这篇文章主要为大家详细介绍了java实现文件复制上传操作,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2016-11-11
  • Java中构造函数,set/get方法和toString方法使用及注意说明

    Java中构造函数,set/get方法和toString方法使用及注意说明

    这篇文章主要介绍了Java中构造函数,set/get方法和toString方法的使用及注意说明,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-01-01

最新评论