Feign是一个声明式WebService客户端,使用方法是定义一个接口并在上面添加注解即可。Feign支持可拔插式的编码器和解码器。
Spring Cloud对Feign进行了封装,使其支持SpringMVC和HttpMessageConverters。Feign可以与Eureka和Ribbon组合使用以支持负载均衡。
[Feign源码]: https://github.com/OpenFeign/Feign
使用案例:
1.新建一个Feign模块,类似之前Ribbon中使用的consume-9001模块。在依赖信息中加入Feign的依赖;
spring-cloud-demo
com.wangcw.springcloud
1.0-SNAPSHOT
4.0.0
springclouddemo-consume-feign-9002
org.springframework.cloud
spring-cloud-starter-feign
com.wangcw.springcloud
springclouddemo-api
${project.version}
org.springframework.cloud
spring-cloud-starter-eureka
org.springframework.cloud
spring-cloud-starter-ribbon
org.springframework.cloud
spring-cloud-starter-config
org.springframework.boot
spring-boot-starter-web
2. 因为Feign开发其实是面向接口编程,所以Feign接口可以放在公共模块【springclouddemo-api】模块中供各模块使用,所以要在【springclouddemo-api】模块中添加也添加Feign依赖;
spring-cloud-demo
com.wangcw.springcloud
1.0-SNAPSHOT
4.0.0
springclouddemo-api
org.springframework.cloud
spring-cloud-starter-feign
org.mybatis.spring.boot
mybatis-spring-boot-starter
1.3.0
tk.mybatis
mapper-spring-boot-starter
2.0.0
javax.persistence
persistence-api
1.0.2
org.projectlombok
lombok
3.在公共模块【springclouddemo-api】中编写接口,接口上添加@FeignClient注解,并通过value指定作用的微服务名;
package com.wangcw.service;
/* 新建Feign接口供各个模块调用微服务 【SPRINGCLOUDDEMO-PROVIDER-DEPT】*/
@FeignClient(value = "SPRINGCLOUDDEMO-PROVIDER-DEPT")
public interface FeignClientService{
@RequestMapping(value = "/provider/dept/get/{id}", method = RequestMethod.GET)
Dept get(@PathVariable("id") long id);
@RequestMapping(value = "/provider/dept/list", method = RequestMethod.GET)
List list();
}
4.在步骤1中新建的Feign模块中编写Controller,并注入FeignClient接口,直接调用service接口中的方法即可(因为声明Feign接口时已经指定过微服务,所以访问时会正确地找到微服务)
@RestController
@RequestMapping(value = "/consumer")
public class DeptController_Consumer {
/* 注入公共模块中的FeignService */
@Autowired
private FeignClientService feignClientService;
@RequestMapping(value = "/dept/get/{id}")
public Dept get(@PathVariable("id") Long id) {
return this.feignClientService.get(id);
}
@RequestMapping(value = "/dept/list")
public List list() {
return this.feignClientService.list();
}
}
5.修改Feign模块的主启动类,加入@EnableFeignClients注解(主要是扫描公共模块【springclouddemo-api】中声明的接口)
@SpringBootApplication(exclude = {DataSourceAutoConfiguration.class, HibernateJpaAutoConfiguration.class})
@EnableEurekaClient
@EnableFeignClients(basePackages= {"com.wangcw.service"})
public class DeptConsumer_Feign_9002_App {
public static void main(String[] args) {
SpringApplication.run(DeptConsumer_Feign_9002_App.class, args);
}
}
6.启动访问测试,会发现访问时带有轮询机制的负载均衡。
(原理:其实就是类似于在公共工程api中加入Service接口,在接口中利用@FeignClient注解去调用对应的服务暴露的方法。
所有需要调用注册的服务的类都直接去调用api中的service,即相当于是在调用对应的在线服务了)
总结:
- Feign通过接口方法调用REST服务,在Eureka中查找对应的服务
- Feign集成了Ribbon技术,所以也支持负载均衡(默认轮询,如需要替换可以在将自己需要的规则添加到容器中,如上一节Ribbon的方式)
需要源码请留下邮箱或者关注左侧的微信公众号!