原先公司项目的架构,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”
三、启动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正常路由到门面服务中,调用真正的接口。如下:
这里需要注意需要配置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中是无法访问到的。
解决办法:升级swagger,2.7.0+即可,高版本中解决了这个bug。
发表评论