Springcloud zuul 路由配置规则

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Springcloud zuul 路由配置规则相关的知识,希望对你有一定的参考价值。

参考技术A zuul路由的几个配置参数

1.静态路由

zuul:

routes:

myroute1:

path: /mypath/**

url: http://localhost:8080 (注意这里url要http://开头)

2.静态路由+ribbon负载均衡/故障切换

zuul:

routes:

myroutes1:

path: /mypath/**

serviceId: myserverId

myserverId:

ribbon:

listOfServers: localhost:8080, localhost:8081

ribbon:

eureka:

enabled: false

3.动态路由+ribbon负载均衡/故障切换

zuul:

routes:

myroutes1:

path: /mypath/**

serviceId: myserviceId

eureka:

client:

serviceUrl:

defaultZne:xxx

4.路由匹配的一些配置

stripPrefix=true,转发会过滤掉前缀。

path: /myusers/**,默认时转发到服务的请求是/**,如果stripPrefix=false,转发的请求是/myusers/**

zuul.prefix=/api 会对所有的path增加一个/api前缀

ignoredPatterns: /**/admin/** 过滤掉匹配的url

route:

users: /myusers/** 会匹配所有/myusers/**的url,但由于ignoredPatterns, /myusers/**/admin/**的请求不会被转发,而是直接由zuul里的接口接收

匹配顺序

path:/myusers/**

path:/** 如果是在application.yml中配置的,那么会优先匹配/myusers/**

但如果是applicaiton.properties配置的,那么可能导致/myusers/**被/**覆盖

ignored-Services: ‘*‘ 对于自动发现的services,除了route中明确指定的,其他都会被忽略

5.请求头过滤

route.sensitiveHeaders: Cookie,Set-Cookie,Authorization

默认就有这三个请求头,意思是不向下游转发请求这几个头

zuul.ignoredHeaders 是一个全局设置,而route.sensitiveHeaders是局部设置

zuul过滤器

标准的zuul过滤器有4中,分别对应一次路由转发的几个关键点;

pre: 在路由转发之前起作用

routing: 在路由时其作用

post: 在把结果返回给浏览器时起作用

error: 在整个路由阶段,出现异常时起作用

如果要分析前端传来的参数,验证前端身份等对前端参数的操作,显然是用pre过滤器

如果是要对返回给前端的结果进行操作或者分析,显然是用post过滤器

编写自定义路由器

public class MyFilter extends ZuulFilter

filterType()重写,返回这个过滤器的类型

filterOrder()重写,返回这个过滤器在过滤器链的顺序

shouldFilter() true启动

run()具体逻辑

SpringCloud 学习 --- Zuul基本概念配置

[TOC]

Spring Cloud

  • eureka:注册中心
    • 服务端:提供注册
    • 客户端:进行注册
  • ribbon:负载均衡(集群)
  • Hystrix:熔断器,执行备选方案
  • Feign:远程调用
  • Zuul:网关,统一入口。

技术图片

1.1、一夫当关,万夫莫开---Zuul网关

  • 网关:程序统一入口。主要功能:服务分发(动态路由),服务鉴权等

    • Zuul是Netflix孵化的一个致力于"网关"的解决方案的开源组件

    • Zuul在动态路由、监控、弹性、服务治理、安全等方面有着重要作用。

    • Zuul底层是Servlet,本质组件是一系列Filter构成的责任链

Zuul具备的功能

  • 认证、鉴权
  • 压力控制
  • 灰度发布
  • 动态路由
  • 负载削减
  • 静态响应处理
  • 主动流量控制

1.2、Zuul入门案例--路由转发

  • 需求
//已有访问路径
http://localhost:8080/user
//通过网关希望访问路径
http://localhost:10010/service/user

面向服务的路由

技术图片

创建zuul_demo

pom

 <dependencies>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-zuul</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
        </dependency>
        <!--添加eureka客户端-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
        </dependency>
    </dependencies>

yml

server:
  port: 10010
spring:
  application:
    name: zuuldemo2
#网关配置:访问路径 和 服务路径 对应关系
zuul:
  preifx: /api  
  routes:
    userservice:
      path: /userservice/**       #访问路径
      #url: http://localhost:8080  #服务路径
      serviceId: userservice      #服务名称时  
#eureka配置
eureka:
  client:
    service-url:
      defaultZone: http://localhost:10086/eureka

开启网关代理注解@EnableZuulProxy

package com.czxy;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
import org.springframework.cloud.netflix.zuul.EnableZuulProxy;

/**
 * @author 庭前云落
 * @Date 2019/12/12 17:01
 * @description
 */
@SpringBootApplication
@EnableZuulProxy      //开启zuul代替
@EnableEurekaClient   //开启eureka客户端
public class ZuulApplication {
    public static void main(String[] args) {
        SpringApplication.run(ZuulApplication.class,args);
    }
}

1.3、路由前缀

  • 路由前缀:用于维护版本号或项目名

  • 修改yml文件,进行配置

    zuul:
      prefix: /api
    

技术图片

路由通配符

规则解释示例
/** 匹配任意数据量的路径与字符 /client/aa,/client/aa/bb/cc
/* 匹配任意数量的字符 /client/aa,/client/aaaaaaaaaaaaaa
/? 匹配单个字符 /client/a,/client/b,/client/c

1.4、Zuul过滤器

1.4.1概述

  • 编写过滤器,继承父类:ZuulFilter
  • 常见方法:
    • filterType() 过滤器类型,取值:"pre"
    • filterOrder() 过滤器顺序,取值:1
    • shouldFilter() 是否执行,取值:true
    • run() 执行业务逻辑

1.4.2自定义过滤器

  • 将过滤器的实现,添加到spring容器中,zuul将自动启用过滤器

    • 过滤器父类:ZuulFilter

    • 工具类(请求上下文对象):RequestContext

    • 特殊请求头:Authorization

技术图片

package com.czxy.filter;

import com.netflix.zuul.ZuulFilter;
import com.netflix.zuul.context.RequestContext;
import com.netflix.zuul.exception.ZuulException;
import org.springframework.stereotype.Component;

import javax.servlet.http.HttpServletRequest;

/**
 * @author 庭前云落
 * @Date 2019/12/12 18:07
 * @description
 */
@Component
public class LoginFilter extends ZuulFilter {
    @Override
    public String filterType() {
        return "pre";  //路由之前执行
    }

    @Override
    public int filterOrder() {
        return 1;   //排序
    }

    @Override
    public boolean shouldFilter() {
        return true; //是否进行过滤,true将执行run()方法
    }

    @Override
    public Object run() throws ZuulException {
    //获得一个特殊请求头,判断是否有值:有返回null(放行),没有 响应状态码401 
        //1 获得工具类 (获得上下文对象)
        RequestContext requestContext = RequestContext.getCurrentContext();
        //2 通过工具类 获得请求对象
        HttpServletRequest request = requestContext.getRequest();
        //3 通过request对象获得特殊请求头
        String token = request.getHeader("authorization");

        //判断
        if(token == null || "".equals(token)) {
            //没有token返回401,关闭响应
            requestContext.setSendZuulResponse(false);
            requestContext.setResponseStatusCode(401);
        }
        //放行
        return null;
    }
}

 来源:SEO公司

以上是关于Springcloud zuul 路由配置规则的主要内容,如果未能解决你的问题,请参考以下文章

微服务架构整理-(十二SpringCloud实战之Zuul网关)

微服务架构整理-(十二SpringCloud实战之Zuul网关)

SpringCloud Zuul网关的简单理解

跟我学Spring Cloud(Finchley版)-17-Zuul路由配置详解

springCloud(14):使用Zuul构建微服务网关-路由端点与路由配置详解

springcloud06(zuul网关)