一、@EnableFeignClients
https://andyboke.blog.csdn.net/article/details/86680622
在Spring cloud应用中,当我们要使用feign客户端时,一般要做以下三件事情:
1. 使用注解@EnableFeignClients启用feign客户端;扫描和注册feign客户端bean定义
@SpringBootApplication
@EnableFeignClients
public class TestApplication {
public static void main(String[] args) {
SpringApplication.run(TestApplication.class, args);
}
}
2. 使用注解@FeignClient 定义feign客户端 ;
示例 : 该例子定义了一个feign客户端,将远程服务http://test-service/test/echo映射为一个本地Java方法调用。
@FeignClient(name = "test-service", path = "/test")
public interface TestService {
@RequestMapping(value = "/echo", method = RequestMethod.GET)
TestModel echo(@RequestParam("parameter") String parameter);
}
3. 使用注解@Autowired使用上面所定义feign的客户端
@Autowired
TestService testService;
public void run()
{
// 这里的使用本地Java API的方式调用远程的Restful接口
TestModel dto = testService.echo("Hello,你好!");
log.info("echo : {}", dto);
}
上面的三个步骤,前两个步骤可以理解为定义feign客户端,第三步是使用所定义的feign客户端。通过调试发现,上面第三步所注入的testService是一个代理对象,如下所示 :
testService = {$Proxy66@5502}
"HardCodedTarget(type=TestService, name=test-service, url=http://test-service/test)"
h = {ReflectiveFeign$FeignInvocationHandler@6924}
target = {Target$HardCodedTarget@6930}
dispatch = {LinkedHashMap@6931} size = 1
0 = {LinkedHashMap$Entry@6948}
"public abstract xxx.model.TestModel xxx.service.TestService.echo(java.lang.String)"
该对象会代理客户端完成远程服务方法的调用,那么,该代理对象是如何生成的 ?这篇文章,我们通过源代码分析来回答这些问题。