欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

springcloud学习-Feign

程序员文章站 2024-03-22 18:56:10
...

Feign介绍

Feign是一个http请求调用的轻量级框架,可以以Java接口注解的方式调用Http请求。Spring Cloud引入 Feign并且集成了Ribbon实现客户端负载均衡调用。

Feign的作用(摘自up主:遇见狂神说)

Feign旨在使编写Java Http客户端变得更容易
前面在使用Ribbon + RestTemplate时,利用RestTemplate对Http请求的封装处理,形成了一套模板化的调用方法。但是在实际开发中,由于对服务依赖的调用可能不止一处,往往一个接口会被多处调用,所以通常都会针对每个微服务自行封装一个客户端类来包装这些依赖服务的调用。所以,Feign在此基础上做了进一步的封装,由他来帮助我们定义和实现依赖服务接口的定义,在Feign的实现下,我们只需要创建一个接口并使用注解的方式来配置它 (类似以前Dao接口上标注Mapper注解,现在是一个微服务接口上面标注一个Feign注解即可),即可完成对服务提供方的接口绑定,简化了使用Spring Cloud Ribbon 时,自动封装服务调用客户端的开发量
Feign默认集成了Ribbon
利用Ribbon维护了MicroServiceCloud-Dept的服务列表信息,并且通过轮询实现了客户端的负载均衡,而与Ribbon不同的是,通过Feign只需要定义服务绑定接口且以声明式的方法,优雅而简单的实现了服务调用

  1. 首先引入Feign依赖
<!--    feign-->
 <dependency>
     <groupId>org.springframework.cloud</groupId>
     <artifactId>spring-cloud-starter-feign</artifactId>
     <version>1.4.7.RELEASE</version>
 </dependency>
  1. 在公共的项目下新增Service接口,如下:
@Service
@FeignClient(value = "SPRINGCLOUD-PROVIDER-DEPT") //指定微服务
public interface FeignClientService {

    @GetMapping("/dept/getDeptId/{id}")
    public Dept getDeptId(@PathVariable("id") long id);

    @GetMapping("/dept/queryAll")
    public List<Dept> queryAll();

    @PostMapping("/dept/addDept")
    public boolean addDept(Dept dept);
}
  1. 在消费者中调用此接口,如下:
@RestController
public class DeptConsumerController {
    @Autowired
    private FeignClientService feignService;
    /*
    使用Feign实现
     */
    @RequestMapping("/consumer/dept/getDeptId/{id}")
    public Dept getDeptId(@PathVariable("id") long id) {
        return this.feignService.getDeptId(id);
    }

    @RequestMapping("/consumer/dept/addDept")
    public boolean addDept(Dept dept){
        return this.feignService.addDept(dept);
    }

    @RequestMapping("/consumer/dept/queryAll")
    public List<Dept> queryAll(){
        return this.feignService.queryAll();
    }
}
  1. 在消费者启动类中添加Feign注解
@SpringBootApplication
// 启动Eureka
@EnableEurekaClient
@EnableFeignClients(basePackages = "com.god.springcloud")   //扫描Feight注解
@ComponentScan("com.god.springcloud")   //扫描所有注解
public class DeptConsumerApplication {
    public static void main(String[] args) {
        SpringApplication.run(DeptConsumerApplication.class, args);
    }
}
  1. 经过测试Feign同样可以实现负载均衡,Feign 默认集成了 Ribbon,默认的还是使用了轮询去做的负载均衡

Feign与Ribbon区别

Feign是通过调用接口的方式来进行调用服务,面向接口编程思想,可读性高但是性能低,中间多了一层;
Ribbon是直接通过微服务的地址调用服务,符合RESTFUL风格

相关标签: springcloud 学习