# 常见问题 ## 在zuul过滤器中获取请求参数 ```java ApiParam param = ZuulContext.getApiParam(); ``` ## 在SpringCloudGateway中获取请求参数 ```java ApiParam apiParam = ServerWebExchangeUtil.getApiParam(exchange); ``` ## 微服务端如何获取appId等参数 ```java OpenContext openContext = ServiceContext.getCurrentContext().getOpenContext(); String appId = openContext.getAppId(); ``` ## 在其它地方获取业务参数 ```java OpenContext openContext = ServiceContext.getCurrentContext().getOpenContext(); Story bizObject = (Story)openContext.getBizObject(); 或 OpenContext openContext = ServiceContext.getCurrentContext().getOpenContext(); Story bizObject = openContext.getBizObject(Story.class); ``` ## 如何关闭签名验证 - 针对某一个接口关闭签名验证 `@Open(value = "alipay.story.get", ignoreValidate = true)` - 针对所有接口关闭签名验证 ```java @Configuration public class ZuulConfig extends AlipayZuulConfiguration { static { ... ApiConfig.getInstance().setIgnoreValidate(true); ... } } ``` ## 注册到eureka显示hostname,非ip ```properties eureka.instance.prefer-ip-address=true eureka.instance.instance-id=${spring.cloud.client.ip-address}:${server.port} ``` ```xml org.springframework.cloud spring-cloud-commons ``` 参考:https://www.jianshu.com/p/5ad8317961b7 ## 直接访问服务的swagger-ui.html ,提示access forbidden 找到微服务的`OpenServiceConfig.java`,重写内部类Swagger2中的swaggerAccessProtected()方法,返回false。线上请设置成true ```java // 开启文档 @Configuration @EnableSwagger2 public static class Swagger2 extends SwaggerSupport { @Override protected String getDocTitle() { return "故事API"; } @Override protected boolean swaggerAccessProtected() { return false; } } ``` ## 调试网关出现服务不可用 打断点调试,网关出现Read Timeout 参考:https://blog.csdn.net/qq_36872046/article/details/81058045 yml添加: ```properties # https://blog.csdn.net/qq_36872046/article/details/81058045 # 路由转发超时时间,毫秒,默认值1000,详见:RibbonClientConfiguration.DEFAULT_READ_TIMEOUT。 # 如果微服务端 处理时间过长,会导致ribbon read超时,解决办法将这个值调大一点 ribbon.ReadTimeout= 60000 ``` ## 指定了context-path(拉取路由404) 微服务项目定义了`server.servlet.context-path=/story-service`,同时必须指定: ```properties spring.cloud.nacos.discovery.metadata.context-path=${server.servlet.context-path} ``` yml配置如下: ```yaml spring: cloud: nacos: discovery: metadata: context-path: ${server.servlet.context-path} ``` 不然网关无法拉取路由信息 ## 其它微服务没有开放接口,需要排除 在sop-gateway项目中配置 ```properties # 排除服务,多个用,隔开 sop.service.exclude=your-serviceId1,your-serviceId2 ``` 或者使用正则: ```properties # 排除以"test-"开头的 # 多个正则用英文分号(;)隔开 sop.service.exclude-regex=test\\-.* ``` ## ISV公私钥 & 平台公私钥 ```java ISV私钥(必须):ISV保存,用来生成签名 --> ISV公钥(必须):平台保存,用来校验签名是否正确 平台私钥(非必须):平台保存,对返回结果生成签名 --> 平台公钥(非必须):ISV保存,用来校验签名是否正确 ``` 总结:私钥负责加密生成签名,公钥负责校验签名是否正确