OpenFeignClient根据环境变量设置动态host

场景

一个环境的微服务需要调用多个host地址的同一类型接口,需要根据参数反问不同host地址的接口

解决办法

以springcloud openFeign为例,

  1. 将第一个参数设置为:java.net.URI,如:
  /**
   * /loki/api/v1/push is the endpoint used to send log entries to Loki. The default behavior is for
   * the POST body to be a snappy-compressed protobuf message:
   *
   * @param map { "streams": [ { "stream": { "label": "value" }, "values": [ [ "<unix epoch in
   *     nanoseconds>", "<log line>" ], [ "<unix epoch in nanoseconds>", "<log line>" ] ] } ] }
   */
  @PostMapping("/loki/api/v1/push")
  Object push(URI uri, Map<String, Object> map);

openFeign将会自动根据参数请求对应的host,@FeignClient注解中配置的url将不会生效
2. java.net.URI的构建过程,这里只是举例,仅作参考

  /**
   * get springcloud feign host
   *
   * @param env current environment
   * @return java.net.URI
   */
  private URI getFeignHost(String env) {
    try {
      String stdEnvName = EnvUtils.getStdEnvName(env);
      // production
      if (StringUtils.isBlank(stdEnvName)) {
        return new URI(String.format(lokiProperties.getHost(), stdEnvName).replace("-", ""));
      }
      return new URI(String.format(lokiProperties.getHost(), stdEnvName));
    } catch (URISyntaxException e) {
      LOGGER.error("feign URI get error", e);
    }
    return null;
  }

通用型的host放在application.yml 中,根据参数env动态拼接最终的host地址,拼接方式请根据自身业务场景而定


版权声明:本文为qq_36289377原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。