- 声明式服务调用:Spring Cloud Feign
Feign基于Netflix Feign实现,整合了Spring Cloud Ribbon和Spring Cloud Hystrix,除了提供这两者的强大功能之外,它还提供了一种声明式的Web服务客户端定义方式。
在使用Spring Cloud Ribbon时,通常都会利用它对RestTemplate的请求拦截来实现对依赖服务的接口调用,而RestTemplate已经实现了对HTTP请求的封装处理,形成了一套模板化的调用方法。在实际开发中,由于对服务依赖的调用可能不止一处,往往一个接口被多处调用,所以通常都会针对各个微服务自行封装一些客户端类来包装这些依赖服务的调用。Spring Cloud Feign在RestTemplate的基础上做了进一步的封装,由它来帮助我们定义和实现依赖服务接口的定义。在Spring Cloud Feign的实现下,我们只需创建一个接口并用注解的方式来配置它,即可完成对服务提供方的接口绑定,简化了在使用Spring Cloud Ribbon时自行封装服务调用客户端的开发量。
1. 启动注册中心和demo-member实例,创建demo-customer-feign工程,骨架选择quickstart。
2. 加入相关依赖:
3. 编写启动类:
4. 定义MemberService接口,通过@FeignClient注解指定服务名来绑定服务(注:这里的服务名不区分大小写),然后再使用Spring MVC的注解来绑定具体该服务提供的REST接口。
5. 创建MemberController来实现对Feign客户端的调用。使用@Autowired直接注入上面定义的MemberService实例,并在getMember方法中调用这个绑定了member-service服务接口的客户端来向该服务发起/member接口的调用。
6. 在src/main/resources目录下创建application.yml文件:
7. 启动服务进行验证:
- 参数绑定
现实系统中的各种业务接口要复杂很多,HTTP的各个位置会传入各种不同类型的参数,并且在返回请求响应的时候也可能是一个复杂的对象结构。
1. 首先扩展一下服务提供方demo-member。增加下面这些接口定义,其中包含带有Request参数的请求、带有Header信息的请求、带有RequestBody的请求以及请求响应体重是一个对象的请求(注:User对象自定义,只有两个字段,String name和Integer age,此外,User中必须提供默认的构造方法,不然Spring Cloud Feign根据JSON字符串转换User对象时会抛出异常)。
2. 然后在demo-customer-feign应用中实现上述新增的请求的绑定:
- 首先在demo-customer-feign中创建与上述一样的User类。
- 然后,在MemberService接口中增加对上述三个新增接口的绑定声明:
3. 最后,在MemberController中新增一个/getMember2接口,来对新增的声明进行调用:
4. 启动项目,测试结果: