@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是随便定义的,主要就是占据这个属性,由于使用了url所以name是不会生效,当然我们还可以配置feign调用的时间,如:在nacos上配置feign的连接超时时间等属性。如果是想通过集群调用远程接口,就不用配置url,而是进行name的配置,值为微服务的名称,如果配置url会优先使用url进行http形式进行调用。
feign:
client:
config:
aClient:
connect-timeout: 10000
read-timeout: 20000
这个是配置在了nacos上的一个路径,如果需要实时获取,也就是热更新,可以在@FeignClient加上@RefreshScope,注意这个没有测试过是否可以,使用时需要自测一下。
这个是对请求进行一个自定义配置,配置自己需要的信息
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());
}
}
}
这个是进行熔断兜底的。
@Slf4j @Component public class AFallbackFactory implements FallbackFactory{ @Override public aClient create(Throwable cause) { return new aClient () { @Override public void syncStatus(RefundStatusDto refundStatusDto) { log.error("fallback error! param:{}", JacksonUtil.parse2Str(refundStatusDto)); // 如果有返回值,直接返回一个null即可 } }; } }