java相关

Spring Cloud Zuul 网关超时配置的几种方式

2018-10-09  本文已影响0人  时间道

微服务项目在使用zuul作为网关时,由于zuul的线程模型,对下游接口必须要设置超时时间和熔断机制,本文主要是叙述设置路由超时的方式。


zuul的超时配置有两种方式:

  1. 直接使用url配置的路由,是基于httpclient来发送请求,可以直接设置socket的连接时间
  2. 使用ribbon的轮训机制,可以配置ribbon超时时间,也可以配置hystrix超时时间,两者取配置最小者

直接使用url路由配置事例:

  1. 适用于ApacheHttpClient,如果是okhttp无效。每个服务的http客户端连接池最大连接,默认是200.
    zuul.host.max-total-connections=1000
  2. 适用于ApacheHttpClient,如果是okhttp无效。每个route可用的最大连接数,默认值是20。
zuul.host.max-per-route-connections=500
zuul.host.socket-timeout-millis=3000
zuul.host.connect-timeout-millis=500
  1. 使用这种方式时,最好增加一个error的zuulFilter,以便处理异常,返回响应的文案:
public Object run() {
        try {
            RequestContext ctx = RequestContext.getCurrentContext();
            ctx.setSendZuulResponse(false);
            ctx.remove("throwable");
            ctx.remove("error.status_code");
            ctx.getResponse().setContentType("text/html;charset=UTF-8");
            ctx.getResponse().setCharacterEncoding("UTF-8");
            InputStream inputStream = ctx.getResponseDataStream();
            Map<String, Object> returnMap = RequsetReturnValueUtils.createReturnMap(
                  1, "服务器异常", new JSONObject());
            String returnJson = JSON.toJSONString(returnMap);
            InputStream inputStream ;
            inputStream = new ByteArrayInputStream(returnJson.getBytes("utf-8"));
            ctx.setResponseDataStream(inputStream);
            ctx.setResponseStatusCode(200);
            ctx.setResponseGZipped(false);
        } catch (Exception ex) {
            logger.error("CurrencyErrorFilter run(){}" ,ExceptionUtils.getFullStackTrace(ex));
        }
        return null;
    }

重点说下使用ribbon的配置

基于ribbon的serviceid的配置,可以用到hystrix等的降级、熔断等功能,hystrix按照serviceid 设置,同默认设置的优先级,由低到高:
1. hystrix.command.default.XXX
2. hystrix.command.[HystrixCommandKey].XXX
3. Hystrix代码内置属性参数值

具体配置代码如下:

zuul.routes.api-v1-config.path=/gw-passenger/config/**
api-v1-config.ribbon.listOfServers=http://test-inside-mp.***.com
zuul.routes.api-v1-config.sensitiveHeaders="*"
hystrix.command.api-v1-config.execution.isolation.thread.timeoutInMilliseconds=1000
hystrix.command.api-v1-config.execution.isolation.semaphore.maxConcurrentRequests=100 单独配置

最好增加fallback的实现,以便在超时时增加自定义处理逻辑

/**
 * 熔断fallback
 */
@Component
public class MyZuulFallbackProvider implements ZuulFallbackProvider {
    private static Logger logger = LoggerFactory.getLogger(MyZuulFallbackProvider.class);

    @Override
    public String getRoute() {
        return "*";//所有路由
    }

    @Override
    public ClientHttpResponse fallbackResponse() {
        logger.error("route fallback");
        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 "OK";
            }
            @Override
            public void close() {
            }

            @Override
            public InputStream getBody() throws IOException {
                JSONObject returnObject = new JSONObject();
                returnObject.put("code", 1);
                returnObject.put("msg", "接口降级");
                returnObject.put("time", System.currentTimeMillis());
                return new ByteArrayInputStream(returnObject.toJSONString().getBytes("utf-8"));
            }
            @Override
            public HttpHeaders getHeaders() {
                HttpHeaders headers = new HttpHeaders();
           headers.setContentType(MediaType.APPLICATION_JSON);
                return headers;
            }
        };
    }
}

要使用hystrix的超时fallback,必须设置:

hystrix.command.default.execution.timeout.enabled=true  默认开启

hystrix相关配置

总结:

spring cloud zuul 使用起来还是非常方便的,通过hystirx也能达到一些降级和熔断的功能,其pre、route、post三阶段机制很大程度上方便了我们做扩展,但是在路由配置方面不大方便,可以结合spring cloud config 或者直接通过统一配置来添加路由。

上一篇 下一篇

猜你喜欢

热点阅读