springcloud断路器修改熔断时间_zuul设置熔断、断路器

本文介绍了如何在SpringCloud的Zuul中设置熔断器,以处理微服务挂掉的情况。通过ZuulFallbackProvider,当服务不可用时,可以自定义返回内容,避免请求长时间超时。同时,文章强调了Zuul的熔断器只适用于serviceId路由方式,不支持url配置,并演示了从搭建Eureka服务中心到配置Zuul,最后测试熔断效果的过程。
摘要由CSDN通过智能技术生成

在前面一篇文章中http://blog.csdn.net/tianyaleixiaowu/article/details/77884778,已经讲过了独立使用zuul进行反向代理了。在那篇文章中,没有使用eureka进行服务发现,而是使用简单的url配置,直接将用户请求发送到指定的url。这种做法适合于兼容一些老系统或者无法进行eureka服务注册的项目中,当时有一个东西没有提到,那就是熔断器。

我们将请求分发到多个微服务上,如果其中一个服务挂掉了,那么请求就会进行漫长的超时等待,最终会返回失败,甚至会影响整个服务链。我们需要一个熔断器来及时地处理挂掉的服务,及时响应给用户信息。

学过springcloud的都知道hystrix,可以在feign或者ribbon中使用它来进行熔断服务降级。zuul也有这样的功能ZuulFallbackProvider。

ZuulFallbackProvider提供了如果某微服务挂掉后,进入自定义处理逻辑的功能。但是需要注意的是,这个熔断器不支持以url配置的路由,必须要用serviceId的方式路由的方式才能使用熔断器。这样我们就要引入eureka服务中心了。

直接上代码。

创建eureka服务中心

项目eureka,pom.xml如下<?xml  version="1.0" encoding="UTF-8"?>

xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">

4.0.0

com.tianyalei

eureka

0.0.1-SNAPSHOT

jar

eureka

Demo project for Spring Boot

org.springframework.boot

spring-boot-starter-parent

1.5.7.RELEASE

UTF-8

UTF-8

1.8

Dalston.SR3

org.springframework.cloud

spring-cloud-starter-eureka-server

org.springframework.boot

spring-boot-starter-test

test

org.springframework.cloud

spring-cloud-dependencies

${spring-cloud.version}

pom

import

org.springframework.boot

spring-boot-maven-plugin

@SpringBootApplication

@EnableEurekaServer

public class EurekaApplication {

public static void main(String[] args) {

SpringApplication.run(EurekaApplication.class, args);

}

}

在启动类上加上EurekaServer代表这是eureka的server所在。

yml配置文件里设置一下端口,设置自己不作为eureka的client,免得把自己也作为一个客户端注册到eureka中。server:

port: 20000

spring:

application:

name: eureka

eureka:

instance:

hostname: localhost

client:

register-with-eureka: false

fetch-registry: false

然后就启动项目就OK了

访问localhost:20000,看到界面

配置zuul

可以参考文章开头提到的那篇zuul的文章,搭建基本骨架。在pom.xml添加eureka的依赖

org.springframework.cloud

spring-cloud-starter-eureka

启动类也修改一下注解@EnableZuulProxy

@SpringCloudApplication

public class TestzuulApplication {

public static void main(String[] args) {

SpringApplication.run(TestzuulApplication.class, args);

}

}

yml配置文件里配置一下Application.name,routes,和eureka的注册地址。spring:

application:

name: zuul

server:

port: 9000

zuul:

routes:

api-2:

path: /user/**

#url: http://localhost:9001/

serviceId: user

eureka:

client:

service-url:

defaultZone: http://localhost:20000/eureka/

注意routes里原来是用url指定的,这里用serviceId,serviceId就是微服务在eureka上注册的名字,对应spring.application.name。

我这里添加映射/user/**的请求会被分发到user服务中,等会创建个user服务。

下面是关键部分,设置熔断器。package com.tianyalei.testzuul.fallback;

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;

import java.nio.charset.Charset;

@Component

public class UserServiceFallbackProvider implements ZuulFallbackProvider {

@Override

public String getRoute() {

return "user";

}

@Override

public ClientHttpResponse fallbackResponse() {

return new ClientHttpResponse() {

@Override

public HttpStatus getStatusCode() throws IOException {

return HttpStatus.OK;

}

@Override

public int getRawStatusCode() throws IOException {

return this.getStatusCode().value();

}

@Override

public String getStatusText() throws IOException {

return this.getStatusCode().getReasonPhrase();

}

@Override

public void close() {

}

@Override

public InputStream getBody() throws IOException {

return new ByteArrayInputStream("Service-user不可用".getBytes());

}

@Override

public HttpHeaders getHeaders() {

HttpHeaders headers = new HttpHeaders();

MediaType mt = new MediaType("application", "json", Charset.forName("UTF-8"));

headers.setContentType(mt);

return headers;

}

};

}

}

getRoute方法的返回值就是要监听的挂掉的微服务名字,这里只能是serviceId,不能是url,指定为“user”,那么在user服务不存在时,就会去执行后面代码的逻辑,设置Code,body什么的自定义内容返回给调用者。

其实到这里就可以测试熔断效果了,因为我们并没有serviceId为“user”的服务。所以就会进入到熔断逻辑里了。

启动zuul项目。

可以看到zuul已经注册到eureka上了,然后我们访问zuul/user,让它转发到user服务试试。

可以看到已经进入到熔断后的自定义处理了,目的已经达成。

下面我们试试user服务正常时的情况。

同样是创建一个Springboot项目,加入eureka依赖,配置ymlspring:

application:

name: user

server:

port: 9001

eureka:

client:

service-url:

defaultZone: http://localhost:20000/eureka/

@SpringBootApplication

@EnableEurekaClient

public class ZuuluserApplication {

public static void main(String[] args) {

SpringApplication.run(ZuuluserApplication.class, args);

}

}

定义个Controller@RestController

public class UserController {

@RequestMapping("")

public Object user() {

return "from user";

}

}

启动user项目,等待eureka发现user服务,有一定的延时才能发现。再次访问localhost:9000/user。

可以看到正常进入到user服务了,当然可以多次尝试启停user服务,看看熔断器的工作情况。

总结:

可以看到zuul的熔断器主要目的和意义在于针对某个微服务的异常状态进行控制,并不能具体的针对某个具体的请求方法进行控制,譬如我的请求需要关联商品、用户、订单三个微服务,需要三个服务的返回值组合成一个结果返回给用户,那么这个熔断器就不能做出合适的处理了。当然了,需要关联多个微服务的请求,我们是采用feign来完成。feign里也自带的有hystrix,可以更精细地控制某个微服务挂掉后通过熔断的回调赋予默认值,然后用默认值来组合结果,来保证即便挂掉一个服务,其他的服务还能正常工作时的用户请求不会无响应。

参考:https://blog.csdn.net/tianyaleixiaowu/article/details/78064127

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值