springcloud之Zuul网关学习简单笔记

Zuul网关

网关在整个微服务的系统中角色是非常重要的。很多公司网关都是自己写的。网关的作用非常多,比如路由、限流、降级、安全控制、服务的聚合。

使用网络做接口路由

步骤一: 引入依赖

<dependency>
    <groupId>org.springframework.cloudgroupId>
    <artifactId>spring-cloud-starter-netflix-zuulartifactId>
dependency>

 

 

步骤二:编写配置文件

 

springcloud之Zuul网关学习简单笔记_第1张图片

步骤三:打上注解

@EnableDiscoveryClient
@EnableZuulProxy
@SpringBootApplication
public class QfSpringCloudNetflixZuulApplication {

    public static void main(String[] args) {
        SpringApplication.run(QfSpringCloudNetflixZuulApplication.class, args);
    }

}

 

 

统一前缀的设置

strip-prefix: true 时,在接口中使用的路径,是接口真实存在的路径。

1)全局路径的设置

springcloud之Zuul网关学习简单笔记_第2张图片

 

2)局部路径的设置

springcloud之Zuul网关学习简单笔记_第3张图片

 

保护敏感路径

在zuul的配置文件中加入这一段:

ignored-patterns: /**/admin/**

那么接口中只要带有/admin/的,就都不能访问

 

过滤掉敏感头

zuul:
  routes:
    api-a:
      path: /api/a/**
      serviceId: hello-spring-cloud-web-admin-ribbon
#      stripPrefix: false  # 是可以携带cookie,如果不加的话,那cookie携带不过来
      sensitiveHeaders:

 

 

 

设置服务的回调方法实现服务降级

通过创建一个FallbackProvider的实现类,在类中指明错误回调内容

@Component
public class MyGatewayFallback implements FallbackProvider {

    /*
    设置要对哪些服务进行错误回调,return 具体的服务名称,
    也可以return "*" 获得return null  ==>对所有服务进行错误回调
     */
    @Override
    public String getRoute() {
        return "hello-spring-cloud-web-admin-ribbon";
    }

    /*
    具体的回调内容
     */
    @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 HttpStatus.OK.value();
            }

            @Override
            public String getStatusText() throws IOException {
                return HttpStatus.OK.getReasonPhrase();
            }

            @Override
            public void close() {

            }

            @Override
            public InputStream getBody() throws IOException {
                ObjectMapper objectMapper = new ObjectMapper();
                Map map = new HashMap();
                map.put("status",200);
                map.put("message","无法连接,请检查您的网络");
                return new ByteArrayInputStream(objectMapper.writeValueAsBytes(map));

            }

            @Override
            public HttpHeaders getHeaders() {
                HttpHeaders headers = new HttpHeaders();
                // 和 getBody 中的内容编码一致
                headers.setContentType(MediaType.APPLICATION_JSON_UTF8);
                return headers;
            }
        };
    }
}

 

 

网关过滤器的用法

  1. 过滤器的类型
  2. 过滤器该怎么样实现过滤和放行

@Component
public class MyZuulFilter extends ZuulFilter {


    /*
    配置过滤器类型,根据生命周期的不同,有四种类型
    1.pre: 路由之前
    2.routing: 路由之时
    3.post:   路由之后
    4.error:  在上面三者执行过程中出现了异常就会调用该error过滤器
     */
    @Override
    public String filterType() {
        return "pre";
    }

    //相同过滤器类型之间确定执行的顺序,0就表示第一个执行。
    @Override
    public int filterOrder() {
        return 0;
    }

    /*
    配置是否需要过滤:true 需要   false  不需要
     */
    @Override
    public boolean shouldFilter() {
        return true;
    }

    /**
     * 过滤器要执行过滤的具体的内容
     * 如果这一次请求,没有携带cookie,那么就不进行路由。
     * @return
     * @throws ZuulException
     */
    @Override
    public Object run() throws ZuulException {
        //得到request的当前的上下文对象
        RequestContext ctx = RequestContext.getCurrentContext();
        //得到request对象
        HttpServletRequest request = ctx.getRequest();
        Cookie[] cookies = request.getCookies();
        if(cookies==null||cookies.length==0){
            //不进行路由
            ctx.setSendZuulResponse(false);
            //设置返回状态码
            ctx.setResponseStatusCode(401);
            //设置返回体
            ctx.setResponseBody("no permission");
            //设置自定义键值对
            ctx.set("isSuccess",false);

        }else{
            //进行路由
            ctx.setSendZuulResponse(true);
            ctx.setResponseStatusCode(200);
            ctx.set("isSuccess",true);
        }

        return null;
    }
}

 

 

过滤器的执行流程

 

springcloud之Zuul网关学习简单笔记_第4张图片

你可能感兴趣的:(简单就完事了,网关,spring,java,后端)