zuul动态路由集成hystrix实现熔断保护并集成feign实现声明式服务调用

上一篇中。将userService提供服务的返回时间延迟4000ms。导致feign在调用时候出发熔断。直接返回fallback回调。

这一篇中加入zuul实现动态路由功能。并加入ZuulFilter的前置过滤功能。zuul集成hystrix默认在早期版本是打开的。但在后期

版本就关闭了自动打开功能,需要手动配置打开。这一点需要注意

测试代码如下:

1:引入相关的依赖:


			    org.springframework.cloud
			spring-cloud-starter-zuul
		

2:配置路由文件:

zuul:
  routes:
    #serviceId可以隨便寫只要唯一就行。一般写调用的服务的spring.application.name对应的值
    microservice-consumer-movie-feign:
      #拦截的url
      path: /feign/**
      #去掉前缀,例如请求的url:/fegin/user/1,那么请求的http://xxxx:xx/feigin/user/1,如果没有下面的**/fegin/fegin/user/1
      stripPrefix: false

 3:zuul集成hystrix默认的超时时间是1s。所以这里要配置相应的超时时长

#zuul集成hystrix默认1s.这里如果不设置超时时间就会报错
ribbon:
  ReadTimeout: 1000
  ConnectTimeout: 500

#熔断机制
hystrix:
  command:
    default:
      execution:
        isolation:
          thread:
            timeoutInMilliseconds: 25000

上面两个配置。同时起作用。一般hystrix的超时时间要大于ribbon的时间。如果超时就回触发zuul的回调机制。下面编写zuul

的回调函数

package com.itmuch.cloud.microserviceconsumermoviezuul.controller;

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;

/**
 * : 描述信息
 *
 * @author liyy
 * @date 2018-12-03 20:03
 */
@Component
public class UserServiceFallbackProvider implements ZuulFallbackProvider {
    @Override
    public String getRoute() {
        return "microservice-consumer-movie-feign";
    }

    @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;
            }
        };
    }
}

springboot2.0版本以后。ZuulFallbackProvider 这个类已经没哟了。但是FallbackProvider这个类还是可以用。

如果出现超时。这回触发回到。返回

Service-user不可用的结果。

你可能感兴趣的:(java)