常见问题

在zuul过滤器中获取请求参数

  1. ApiParam param = ZuulContext.getApiParam();

在SpringCloudGateway中获取请求参数

  1. ApiParam apiParam = ServerWebExchangeUtil.getApiParam(exchange);

微服务端如何获取appId等参数

  1. OpenContext openContext = ServiceContext.getCurrentContext().getOpenContext();
  2. String appId = openContext.getAppId();

在其它地方获取业务参数

  1. OpenContext openContext = ServiceContext.getCurrentContext().getOpenContext();
  2. Story bizObject = (Story)openContext.getBizObject();
  3. OpenContext openContext = ServiceContext.getCurrentContext().getOpenContext();
  4. Story bizObject = openContext.getBizObject(Story.class);

如何关闭签名验证

  • 针对某一个接口关闭签名验证@ApiMapping(value = "alipay.story.get", ignoreValidate = true)

  • 针对所有接口关闭签名验证

  1. @Configuration
  2. public class ZuulConfig extends AlipayZuulConfiguration {
  3. static {
  4. ...
  5. ApiConfig.getInstance().setIgnoreValidate(true);
  6. ...
  7. }
  8. }

注册到eureka显示hostname,非ip

  1. eureka.instance.prefer-ip-address=true
  2. eureka.instance.instance-id=${spring.cloud.client.ip-address}:${server.port}
  1. <dependency>
  2. <groupId>org.springframework.cloud</groupId>
  3. <artifactId>spring-cloud-commons</artifactId>
  4. </dependency>

参考:https://www.jianshu.com/p/5ad8317961b7

直接访问服务的swagger-ui.html ,提示access forbidden

找到微服务的OpenServiceConfig.java,重写内部类Swagger2中的swaggerAccessProtected()方法,返回false。线上请设置成true

  1. // 开启文档
  2. @Configuration
  3. @EnableSwagger2
  4. public static class Swagger2 extends SwaggerSupport {
  5. @Override
  6. protected String getDocTitle() {
  7. return "故事API";
  8. }
  9. @Override
  10. protected boolean swaggerAccessProtected() {
  11. return false;
  12. }
  13. }

调试网关出现服务不可用

打断点调试,网关出现Read Timeout

参考:https://blog.csdn.net/qq_36872046/article/details/81058045

yml添加:

  1. # https://blog.csdn.net/qq_36872046/article/details/81058045
  2. # 路由转发超时时间,毫秒,默认值1000,详见:RibbonClientConfiguration.DEFAULT_READ_TIMEOUT。
  3. # 如果微服务端 处理时间过长,会导致ribbon read超时,解决办法将这个值调大一点
  4. ribbon.ReadTimeout: 60000

指定了context-path(拉取路由404)

微服务项目定义了server.servlet.context-path=/story-service,同时必须指定:

  1. spring.cloud.nacos.discovery.metadata.context-path=${server.servlet.context-path}

yml配置如下:

  1. spring:
  2. cloud:
  3. nacos:
  4. discovery:
  5. metadata:
  6. context-path: ${server.servlet.context-path}

不然网关无法拉取路由信息

其它微服务没有开放接口,需要排除

在sop-gateway项目中配置

  1. # 排除服务,多个用,隔开
  2. sop.service.exclude=your-serviceId1,your-serviceId2

或者使用正则:

  1. # 排除以"test-"开头的
  2. # 多个正则用英文分号(;)隔开
  3. sop.service.exclude-regex=test\\-.*

ISV公私钥 & 平台公私钥

  1. ISV私钥(必须):ISV保存,用来生成签名 --> ISV公钥(必须):平台保存,用来校验签名是否正确
  2. 平台私钥(非必须):平台保存,对返回结果生成签名 --> 平台公钥(非必须):ISV保存,用来校验签名是否正确

总结:私钥负责加密生成签名,公钥负责校验签名是否正确