SpringCloud(9)Feign

    科技2025-01-06  17

    Feign的目标

    feign是声明式的web service客户端,它让微服务之间的调用变得更简单了,类似controller调用service。Spring Cloud集成了Ribbon和Eureka,可在使用Feign时提供负载均衡的http客户端。让我们习惯面向接口编程,本质上是使用Ribbon。将其封装了而已。

    Feign的原理

    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负载均衡地发起调用

    如何使用Feign

    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); } }
    Processed: 0.009, SQL: 8