阿毛
It's me !
想你所想
通过gateway访问某个子服务swagger

原先公司项目的架构,SpringCloud gateway总网关,门面服务再到子服务。

一、gateway白名单中添加swagger相关url

public class WhiteListConstant {
    public static List<String> whiteList;

    static {
        whiteList = new ArrayList<String>(8);
        whiteList.add("wisdomclass-demo/login");
        whiteList.add("服务名/url");
        whiteList.add("wisdomclass-front-app/swagger-ui.html");
        whiteList.add("wisdomclass-front-app/webjars/springfox-swagger-ui/**");
        whiteList.add("wisdomclass-front-app/swagger-resources/**");
        whiteList.add("wisdomclass-front-app/v2/api-docs");
    }
}

二、在门面服务需要调用的服务中配置“swagger.basePath”

https://file.blog.humh.cn/2020/06/d2b5ca33bd970f64a6301fa75ae2eb22-10.png

三、启动wisdomclass-gateway、wisdomclass-eureka、wisdomclass-usercenter、对应客户端的门面服务(如:wisdomclass-front-app)、对应门面调用的服务(如:wisdomclass-interaction)

整个处理逻辑大致如下:

网关gateway中会对白名单之外的资源进行拦截,白名单中url不会拦截,也就不会进行鉴权。网关白名单中配置了所有swagger相关的url,当我们通过网关去访问swagger的时候,如:“http://localhost:9006/frontAPP/swagger-ui.html”(localhost:9006为网关服务),gateway放行,然后网关中配置路由规则,“frontAPP”会路由到wisdomclass-front-app服务。因为wisdomclass-front-app服务中配置了swagger,所以swagger会加载出来。当点击接口测试时,需要添加token,gateway中会去通过调用wisdomclass-usercenter服务完成token校验,校验通过后,接口再次通过gateway正常路由到门面服务中,调用真正的接口。如下:

https://file.blog.humh.cn/2020/06/d2b5ca33bd970f64a6301fa75ae2eb22-11.png

这里需要注意需要配置swagger的basePath为你的门面服务path,不配置的话,swagger默认为“/”,这样的话,通过网关上层调用的就是“localhost:9006/course/create”,会404。(basePath为v2/api-docs中指定界面swagger-ui.html中接口的url “${basePath}+你的@requestMapping”)

大坑:项目原先使用的是swagger 2.6.1的版本,当通过gateway访问swagger,swagger自身访问“localhost:9006/frontAPP/v2/api-docs”时,正常路由到门面front-app后,应该门面的“locahost:8082/v2/api-docs”,但事实并不是如此,swagger2.6.1中如下图处理,在访问“v2/api-docs”swaggerController时取到的端口号为“X-Forwarded-Port”,即最上层代理的端口,这里就是浏览器地址栏中所看到9006端口,显然这样在front-app中是无法访问到的。

https://file.blog.humh.cn/2020/06/d2b5ca33bd970f64a6301fa75ae2eb22-12.png

解决办法:升级swagger,2.7.0+即可,高版本中解决了这个bug

发表评论

textsms
account_circle
email

  • humh

    经过如上配置后,只支持1、通过网关访问门面服务swagger(wx、App、pc);2、不同微服务提供方(如interaction)访问自身swagger。不支持直接门面服务访问自身swagger。

    6月前 回复

想你所想

通过gateway访问某个子服务swagger
原先公司项目的架构,SpringCloud gateway总网关,门面服务再到子服务。 一、gateway白名单中添加swagger相关url public class WhiteListConstant { public static List<Str…
扫描二维码继续阅读
2020-06-14