直接上代码
@FeignClient(value = "CESHI",url = "http://XXX.XXX.XXX.XXX:8022")//url写一个默认的
public interface CeshiService {
@PostMapping("/Ceshi")
JSONObject Ceshi(URI uri,@RequestBody JSONObject json);
}
@Autowired
private CeshiService ceshiService;
@PostMapping("/Ceshi")
public JSONObject Ceshi(@RequestParam String id,@RequestParam String server)throws Exception{
String url = "";
if("1".equals(server)){
url = "http://192.168.3.86:8022";
}else if("2".equals(server)){
url = "http://192.168.3.88:8022";
}
JSONObject json = new JSONObject();
json.put("id",id);
JSONObject result=this.ceshiService.Ceshi(new URI(url),json);
return result;
}
逐个解析下相关细节:
接口方法的定义使用了SpringMVC的注解 @GetMapping、@RequestParam,其实SpringMVC的其他注解在此处都是支持的。(有其他文章提到也支持OpenFeign原有的注解@RequestLine、@Param等,但博主实测是不支持的,相关解析类为 feign.Contract,这个存疑)
在使用方式上,OpenFeign需要手动构建代理对象,Spring Cloud OpenFeign 不同于 OpenFeign, Spring Cloud OpenFeign 帮我们自动生成了接口的代理对象(即实现类),并且注册到Spring中,我们可以很方便的使用 @Autowired 注入代理对象然后使用。其默认的代理对象是 LoadBalancerFeignClient。还有一个代理对象是 feign.Client.Default。两者区别在于:
LoadBalancerFeignClient 通过服务名(下文提到)从Eureka查找相关的节点地址url,发起调用。
feign.Client.Default 仅是简单的直接调用。
@FeignClient(name = “ThirdPartyAPI”, url = “http://XXX.XXX.XXX.XXX:8080”)
name 属性是 @FeignClient 注解必要的!不定义时会报错,其默认指代Eureka上的服务名。
url 属性,这是重点了! url属性指定什么值其实不重要,因为最终都会被方法的URI参数值替换掉,它在这里另一个重要的作用,就是将接口的代理对象变成feign.Client.Default(上文提到默认是LoadBalancerFeignClient),这样就绕过了从Eureka取节点地址这一步,毕竟第三方的地址不可能注册到我们的Eureka上。(相关细节可自行debug FeignClientFactoryBean.getTarget())
总结一下关键点:
@FeignClient 注解需要指定其 url 属性(值不重要)!
接口方法定义增加 URI类型的参数!
接口方法定义SpringMVC的注解
使用@Autowired 注入代理对象可直接调用