Skip to content

统一网关 gateway-service

添可路由目前主要由三个功能模块:

  • Auth Token校验
  • 路由功能管理;
  • 无需校验Token URL管理;
  • IPURL白名单和黑名单管理;

Auth Token校验

会对所有经过路由的Web请求进行授权Token校验管理。

路由功能管理

主要包含对路由功能的增删改查,目前功能都已经在添可后台管理中进行维护管理。

路由增删改后都会同步刷新路由配置,一般会有一定的延时,得1-2分钟后该新增、修改、删除才生效。

路由功能同样包含Spring Cloud Gateway的完整功能,过滤器Filter和断言Predicate都可以在新增、修改的时候进行配置。

Spring Cloud Gateway的说明文档请参考下列链接:

https://spring.io/projects/spring-cloud-gateway

无需校验Token URL管理

主要包含对无需校验Token URL的管理,功能也已经在添可后台管理系统中进行维护管理。

无需校验Token URL管理的是指,有的接口URL不需要校验或者没办法校验Token

  • 注册接口、登录接口等,刚开始没登录肯定是没有Token的,所以有的链接无法校验Token
  • 另外还有一些静态资源,比如jscss文件等,也是不需要校验Token的;
  • 其他有的项目的Swagger接口文档,也需要开放出来。

目前URL校验已经支持通配符配置,使用的是工具类AntPathMatcher进行校验的,具体可参考AntPathMatcher的说明文档。

https://docs.spring.io/spring-framework/docs/current/javadoc-api/org/springframework/util/AntPathMatcher.html

通配符简单说明如下:
  • ? 匹配1个字符;
  • * 匹配0个或多个字符;
  • ** 匹配路径中的0个或多个目录;
  • {spring:[a-z]+} 将正则表达式[a-z]+匹配到的值,赋值给名为 spring 的路径变量。(P.S.:必须是完全匹配才行,在SpringMVC中只有完全匹配才会进入controller层的方法)。
示例
  • 符号?

    • ? 要求必须为一个字符,并且不能是代表路径分隔符的/

      java
      @RequestMapping("/example?")
      @ResponseBody
      public String index(){
          System.out.println("hello world");
          return "hello world";
      }

      结果

      example           false 404错误(必须要有一个字符)
      example/          false 404错误(不能为"/")
      exampleab         false 404错误(不能是多个字符)
      examplea          true  输出 hello world
  • 符号*

    • *,虽然可以匹配多个任意的字符,如果你以为 * 可以替代 ** 那就错了,* 代表的多个任意字符组成的字符串不能是个目录 或者说路径,也就是说,* 并不能拿来替代 **

      java
      @RequestMapping("/example*")
      @ResponseBody
      public String index(){
          System.out.println("hello world");
          return "hello world";
      }

      结果

      example           true  输出 hello world(可以为0字符)
      example/          true  输出 hello world(可以为"/")
      examplea          true  输出 hello world(可以为1个字符)
      exampleabc        true  输出 hello world(可以为多个字符)
      example/a         false 404错误("/a"是一个路径)
  • 符号**

    • 0个或多个目录,** 代表的字符串本身不一定要包含 /

      java
      @RequestMapping("/example/**/a")
      @ResponseBody
      public String index(){
          System.out.println("hello world");
          return "hello world";
      }

      结果

      example/a         true  输出 hello world(可以为0个目录)
      example/x/a       true  输出 hello world(可以为一个目录)
      example/x/z/c/a   true  输出 hello world(可以为多个目录)
  • 符号{spring:[a-z]+}

    • 正则表达式[a-z]+匹配到的值,赋值给名为 spring 的路径变量

      java
      @RequestMapping("/example/{username:[a-b]+}")
      @ResponseBody
      public String index(@PathVariable("username") String username){
          System.out.println(username);
          return username;
      }

      结果

      example/ab        true  输出 ab
      example/abbaaa    true  输出 abbaaa
      example/a         false 404错误
      example/ac        false 404错误

IPURL白名单和黑名单管理

白名单

允许某个或某些IP访问某个或某几个接口URL,跟路由服务ID关联,一个路由服务ID只允许有一个白名单配置;

黑名单

不允许某个或某些IP访问某个或某几个接口URL,同样也跟路由服务ID关联,一个路由服务ID只允许有一个黑名单配置;

目前白名单管理和黑名单管理暂不支持通配符配置,后期迭代会将该功能添加上。