feign是声明式的web service客户端,它让微服务之间的调用变得更简单了,类似controller调用service。Spring Cloud集成了Ribbon和Eureka,可在使用Feign时提供负载均衡的http客户端。让我们习惯面向接口编程,本质上是使用Ribbon。将其封装了而已。
1.启动时,程序会进行包扫描,扫描所有包下所有@FeignClient注解的类,并将这些类注入到spring的IOC容器中。当定义的Feign中的接口被调用时,通过JDK的动态代理来生成RequestTemplate。
2.RequestTemplate中包含请求的所有信息,如请求参数,请求URL等。 3.RequestTemplate声场Request,然后将Request交给client处理,这个client默认是JDK的HTTPUrlConnection,也可以是OKhttp、Apache的HTTPClient等。 4.最后client封装成LoadBaLanceClient,结合ribbon负载均衡地发起调用
1.导入依赖,因为面向接口编程,在api Module 与消费者上导入依赖
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-feign</artifactId> <version>1.4.6.RELEASE</version> </dependency>2.api Modulee上 编写接口,类似于Dubbo+zookeeper @Reference ,创建一个接口。 @FeignClient 中value 的值即是服务提供者的application 名字
@Component @FeignClient(value = "springcloud-provider-dept") public interface DeptClientService { @PostMapping("/dept/add") boolean add(Dept dept); @GetMapping("/dept/get/{id}") Dept get(@PathVariable("id") Long id); @GetMapping("/dept/list") List<Dept> list(); }3.1定义一个基于Feign的消费者Controller 注入 DeptClientService接口,调用其中的方法,实现Rest风格调用服务提供者的接口
@RestController public class DeptConsumerController { @Autowired private DeptClientService service = null; @RequestMapping("/consumer/dept/add") public boolean add(Dept dept){ return service.add(dept); } @RequestMapping("/consumer/dept/get/{id}") public Dept get(@PathVariable("id") Long id){ return service.get(id); } @RequestMapping("/consumer/dept/list") public List<Dept> list(){ return service.list(); } }3.2创建服务启动类 扫描接口的位置@EnableFeignClients(basePackages = “com.liuqing.springcloud”) 扫描接口中的方法的注解@ComponentScan(“com.liuqing.springcloud”)
@SpringBootApplication @EnableEurekaClient @EnableFeignClients(basePackages = "com.liuqing.springcloud") @ComponentScan("com.liuqing.springcloud") public class FeignDeptConsumer_80 { public static void main(String[] args) { SpringApplication.run(FeignDeptConsumer_80.class,args); } }