一、OpenFeign调用远程接口模版
@FeignClient(name = "AClient", url = "${system.config.A.url}", configuration = AConfig.class, fallbackFactory = AFallbackFactory.class) @Validated public interface aClient { @PostMapping("services/rest/connect") void syncStatus(@RequestBody @Valid @NotNull RefundStatusDto refundStatusDto); }
一、name = "AClient"
这里的name是随便定义的,主要就是占据这个属性,由于使用了url所以name是不会生效,当然我们还可以配置feign调用的时间,如:在nacos上配置feign的连接超时时间等属性。如果是想通过集群调用远程接口,就不用配置url,而是进行name的配置,值为微服务的名称,如果配置url会优先使用url进行http形式进行调用。
feign: client: config: shopify-product-api: connect-timeout: 10000 read-timeout: 20000
二、 url = "${system.config.a.url}"
这个是配置在了nacos上的一个路径,如果需要实时获取,也就是热更新,可以在@FeignClient加上@RefreshScope,注意这个没有测试过是否可以,使用时需要自测一下。
三、configuration = AConfig.class
这个是对请求进行一个自定义配置,配置自己需要的信息
class AConfig implements RequestInterceptor { private final B b; private final static String TOKEN_KEY = "X"; @Override public void apply(RequestTemplate template) { // 获取数据库配置信息 C c = b.getConfig(xxx); if (c== null) { throw new BizException("error xxx"); } // 覆盖了@FeignClient注解中的url属性 template.target(c.getUrl()); if (ObjectUtil.isNotEmpty(c.getToken())) { template.header(TOKEN_KEY, c.getToken()); } else { template.header(HttpHeaders.AUTHORIZATION, "Basic " + c.getAuthorization()); } } }
四、fallbackFactory = AFallbackFactory.class
这个是进行熔断兜底的。
@Slf4j @Component public class AFallbackFactory implements FallbackFactory<AClient> { @Override public OracleClient create(Throwable cause) { return new OracleClient() { @Override public void syncStatus(RefundStatusDto refundStatusDto) { log.error("fallback error! param:{}", JacksonUtil.parse2Str(refundStatusDto)); // 如果有返回值,直接返回一个null即可 } }; } }