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

网友投稿 460 2022-10-14


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

一、场景

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

springboot版本:1.5.9.RELEASE

springcloud版本:Dalston.SR5

org.springframework.cloud

spring-cloud-starter-zuul

com.netflix.zuul

zuul-core

1.3.0

二、场景实现

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小时内删除侵权内容。

上一篇:如何将工业现场模拟信号无线传输到PLC/主机?
下一篇:全光纤网络三大创新
相关文章

 发表评论

暂时没有评论,来抢沙发吧~