Feign:使用接口方式调用服务

调用微服务访问两种方法:

1.微服务名字 Ribbon

2.接口和注解 Feigin

前面在使用Ribbon+RestTemplate时,利用RestTemplate对Http请求的封装处理,形成了一套模板化的调用方法,但在实际开发中,由于对服务依赖的调用可能不止一处,往往是一个接口会被多处调用,所以通常都会针对每个微服务自行封装一些客户端类来包装这些依赖服务的调用。所以Feign在此基础上做了进一步封装,用它帮助定义和实现依赖服务接口的定义,在Feign的实现下,我们只需要创建一个接口并使用注解的方式来配置它,即可完成对服务提供方的接口绑定,简化了使用Spring Cloud Ribbon时,自动封装服务调用客户端的开发量。

Feign集成了Ribbon

Feign利用Ribbon维护了服务列表信息,并通过轮询实现了客户端的负载均衡,与Ribbon的不同之处在于,通过Fegin只需要定义服务接口且以声明式的方法,简单地实现了服务调用。

使用Feign后,不用使用RestTemplate,更像是采用Dubbo+Zookeeper的那种方式,创建一个接口,在Controller使用时加上Reference注释。 Feign也是创建一个接口,给它加上注释绑定服务名以及写上与服务提供者一样的Controller方法(不用写实现类),然后在启动类开启功能即可。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-9mPTdj6J-1647436586692)(C:\Users\Freeze_three\AppData\Roaming\Typora\typora-user-images\image-20220316151743609.png)]

Feign的使用

1、与之前一样,服务注册中心Eureka和服务提供者都不需要修改什么代码,用Feign方式来实现消费者服务调用。为了不跟Ribbon的搞混,创建一个新的Module(springcloud-consumer-dept-feign)来对比,把之前的消费者代码和配置复制过来。

2、导入pom.xml依赖,与之前的服务消费者类似,多了个Feign依赖

        <!--Feign-->
        <!-- https://mvnrepository.com/artifact/org.springframework.cloud/spring-cloud-starter-openfeign -->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-openfeign</artifactId>
            <version>2.2.5.RELEASE</version>
        </dependency>
       

3、添加一个接口DeptClientService,虽然说名里有Service像之前学的Service层,我觉得更有 Service的意思,服务,对应服务提供者的服务(给出的Controller方法接口)。

接口上面加上注释@FeignClient name即为服务提供者的服务名(在yml配置文件定义的服务名字), 方法上的url跟服务提供者的controller层的url相同。

@Component
@FeignClient(name = "SPRINGCLOUD-PROVIDER-DEPT")
public interface DeptClientService {

    @GetMapping("/dept/get/{id}")//跟服务提供者的controller的 url相同
    public Dept queryById(@PathVariable("id") Long id);

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

    @RequestMapping("/dept/add")
    public boolean addDept(@RequestBody Dept dept);

}

4、修改复制原本的消费者过来的Controller,Ribbon采用RestTemplate 远程调用服务,通过服务名,写好地址进行调用。使用Feign后,简化了我们写Controller的代码量,也更符合我们一层一层调用的那种习惯思想。

package com.freeze.springcloud.controller;

import com.freeze.springcloud.pojo.Dept;
import com.freeze.springcloud.service.DeptClientService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;

import java.util.HashMap;
import java.util.List;
import java.util.Map;

@RestController
public class DeptConsumerController {

    @Autowired
    private DeptClientService deptClientService=null;

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

    @RequestMapping("/consumer/dept/get/{id}")
    public Dept get(@PathVariable("id") Long id){
        return this.deptClientService.queryById(id);
    }

    @RequestMapping("/consumer/dept/list")
    public List<Dept> list(){
        return this.deptClientService.queryAll();
    }
}

与之前Ribbon+RestTemplate相比,使用feign之后,我们调用eureka 注册的其他服务,在代码中就像调用各个service那么简单。

今日上早课,下午只学了一个Feign,由于各种依赖版本的原因,一直启动不成功(创建的Service,报错原因是无法注入,还有个报错说没加入Ribbon的依赖,但是新版本的Eureka是包含了Ribbon的,无语了),本着全部使用新版本的依赖,最后无奈妥协,去学习视频评论下拿了别人的版本,修改所有的依赖版本后,IDEA一时反应不过来??! 每次重开IDEA就有一个模块的pom爆红,后面不红了,Maven窗口那边还是红的,但是能使用了,折腾了好久。。还好没啥事。

Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐