What

通过Feign的定义,我们知道Feign是一个客户端
所以将Feign配置到项目中时,只需要配置Feign到服务调用方即可。
通过接口式调用,实现访问Http请求。(类似Mybatis访问数据库的方式)

why

在Feign之前我们一直用RestTemplate实现微服务之间的调用,如果少量还好,但随着微服务的增加,其相互调用的复杂性也呈指数式上升。于是就有了接口式的http工具Feign(Feign沿袭了Retrofit)。这些东西可以参考跟我学Spring Cloud(Finchley版)-09-Feign

How

  1. 连接Eureka server (Feign会通过Eureka server上的微服务名称调用)
    注: 此步为可选,Feign也可以通过url方式直接访问service,但此文不涉及
  2. 添加Feign依赖,并指定Feign版本

    <dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-openfeign</artifactId>
    <version>2.2.2.RELEASE</version>
    </dependency>
  3. 添加eureka和Feign的依赖后,在client项目的主方法上添加相应注解:

    @SpringBootApplication
    @EnableEurekaClient
    @EnableFeignClients
  4. 编写FeignClient接口,此接口对应后端的微服务 - 类似Mybatis的mapper
    接口 => 后端微服务项目
    接口方法 => 微服务RequestMapping

    // 对应Eureka中名字为feign-provider1的微服务
    @FeignClient(name = "feign-provider1")
    public interface UserFeignClient {
    
    // 对应此微服务中名字为hello的Get请求
    @GetMapping("hello")
    String findString();
    }
  5. 使用此接口(发送请求)

    此时无论是在普通方法,还是过滤器、controller,都可以进行请求调用的操作。
    此处我使用最入门的方式: 将请求放在Controller中。
    代码如下:

    @RestController
    public class IndexController {
    
        UserFeignClient userFeignClient;
    
        @Autowired
        public IndexController(UserFeignClient userFeignClient) {
        this.userFeignClient = userFeignClient;
        }
    
        @GetMapping("/test")
        public String index(){
        return userFeignClient.findString();
        }
    }

    此时若访问localhost:XXX/test, 请求会自动交给后端微服务进行处理并返回。

Questions

关于指定Feign版本:

  • 可以通过上面第二步的方式,直接在dependency中添加version标签指定
  • 也可以让Spring cloud来管理其版本,此种方式见如下code:

    <properties>
        <spring-cloud.version>Hoxton.SR4</spring-cloud.version>
    </properties>
    <dependencies>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-openfeign</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
        </dependency>
    </dependencies>
    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>${spring-cloud.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>
    • 推荐第二种方式,使用Spring Cloud管理更方便,而且容易升级。

笔者注: 已知Spring cloud大版本(此例中为Hoxton.SR4),但又想用第一种方式添加依赖,那么如何确定一个具体dependency的version呢?

在pom.xml中,按住ctrl键,单击dependencyManagement中的groupid或artifactId,即可打开spring cloud当前版本的pom,spring cloud此版本下提供的所有项目的小版本都在其中有声明,直接使用即可。
?
image.png

也可以在本地maven仓库中寻找,比如SR4的pom.xml在路径C:\Users\XXX\.m2\repository\org\springframework\cloud\spring-cloud-dependencies\Hoxton.SR4\spring-cloud-dependencies-Hoxton.SR4.pom
比如笔者本地就有如下的大版本:
image.png



yizheng
301 声望27 粉丝

一蓑烟雨任平生


引用和评论

0 条评论