Zuul

2020-07-10  本文已影响0人  乌鲁木齐001号程序员

网关

Zuul | 介绍

Zuul | serviceId

Zuul | 请求路由表达式

Zuul | Filter

Zuul 架构图
Zuul 架构图.png
Zuul 中 Filter 的生命周期
Zuul Filter 生命周期.png
filter | 自定义
预定义 Filter | PreFilter
Filter 名称 Filter 作用
ServletDetectionFilter 检测当前请求是否使用 ZuulServlet 来处理运行,其实就是设置了一个属性 isDispatcherServletRequest
FromBodyWrapperFilter 解析表单数据,并对下游请求进行重新编码,其实就是你要是表单数据我就处理,要不是就愿意谁干谁干
DebugFilter 该过滤器会根据配置参数 zuul.debug.request 和请求中的 debug 参数来决定是否执行过滤器中的操作,做一些 Debug 参数的打印
PreDecorationFilter 此过滤器根据提供的 RouteLocator 确定在哪里和如何路由,读配置文件中的内容然后做匹配,如果能匹配,就具体找哪一部分去做
预定义 Filter | RoutingFilter
Filter 名称 Filter 作用
RibbonRoutingFilter 该过滤器只对请求上下文中,存在 serviceId 参数的请求进行处理,主要是面向服务路由的核心,它是通过使用 Ribbon 和 Hystrix 来向服务示例发起请求,并将服务实例的结果返回
SimpleHostRoutingFilter 该过滤器只对 URL 配置的路由生效,主要是向 routeHost 参数的物理地址发起请求 ,该 Filter 直接使用 httpClient 完成调用,并没有使用 Hystrix 进行封装
SendForwardFilter 该过滤器只对请求上下文中存在的 forward.do 参数进行处理请求,主要用来处理落规则中 forward 本地跳转装配
预定义 Filter | RoutingFilter
Filter 名称 Filter 作用
SendErrorFilter 该过滤器主要利用上下文中的错误信息,来组成一个 forward 到 api 网关 /error 错误端点的请求,来产生错误响应
SendResponseFilter 该过滤器主要利用上下文的响应信息来组织需要发送回客户端的响应信息

Zuul | 版本差异 | Zuul vs Zuul2

Zuul 与 Hystrix 整合

Hystrix 超时配置
hystrix:
  command:
    default:
      execution:
        timeout:
          enabled: true
        isolation:
          thread:
            timeoutInMilliseconds: 10000
Hystrix 降级处理
package com.lixinlei.meetingfilm.apigwzuul.fallbacks;

import com.alibaba.fastjson.JSONObject;
import com.lixinlei.meetingfilm.utils.common.vo.BaseResponseVO;
import com.lixinlei.meetingfilm.utils.exception.CommonServiceException;
import org.springframework.cloud.netflix.zuul.filters.route.FallbackProvider;
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;

@Component
public class MyFallback implements FallbackProvider{

    /**
     * 针对哪一个路由进行降级, return可以写 *
     * @return
     */
    @Override
    public String getRoute() {
        return "film-service";
    }

    /**
     * 降级时处理方式
     * @param route
     * @param cause
     * @return
     */
    @Override
    public ClientHttpResponse fallbackResponse(String route, Throwable cause) {

        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() {

            }

            /**
             * 业务降级处理方式
             * @return
             * @throws IOException
             */
            @Override
            public InputStream getBody() throws IOException {
                BaseResponseVO responseVO
                        = BaseResponseVO.serviceException(new CommonServiceException(404, "No Films!~"));
                String result = JSONObject.toJSONString(responseVO);
                return new ByteArrayInputStream(result.getBytes());
            }

            @Override
            public HttpHeaders getHeaders() {
                HttpHeaders headers = new HttpHeaders();
                headers.setContentType(MediaType.APPLICATION_JSON);
                return headers;
            }

        };

    }

}

Zuul | Cookie & 特殊头处理

上一篇 下一篇

猜你喜欢

热点阅读