What
通过Feign的定义,我们知道Feign是一个客户端
所以将Feign配置到项目中时,只需要配置Feign到服务调用方即可。
通过接口式调用,实现访问Http请求。(类似Mybatis访问数据库的方式)
why
在Feign之前我们一直用RestTemplate实现微服务之间的调用,如果少量还好,但随着微服务的增加,其相互调用的复杂性也呈指数式上升。于是就有了接口式的http工具Feign(Feign沿袭了Retrofit)。这些东西可以参考跟我学Spring Cloud(Finchley版)-09-Feign
How
- 连接Eureka server (Feign会通过Eureka server上的微服务名称调用)
注: 此步为可选,Feign也可以通过url方式直接访问service,但此文不涉及 -
添加Feign依赖,并指定Feign版本
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-openfeign</artifactId> <version>2.2.2.RELEASE</version> </dependency>
-
添加eureka和Feign的依赖后,在client项目的主方法上添加相应注解:
@SpringBootApplication @EnableEurekaClient @EnableFeignClients
-
编写FeignClient接口,此接口对应后端的微服务 - 类似Mybatis的mapper
接口 => 后端微服务项目
接口方法 => 微服务RequestMapping// 对应Eureka中名字为feign-provider1的微服务 @FeignClient(name = "feign-provider1") public interface UserFeignClient { // 对应此微服务中名字为hello的Get请求 @GetMapping("hello") String findString(); }
-
使用此接口(发送请求)
此时无论是在普通方法,还是过滤器、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此版本下提供的所有项目的小版本都在其中有声明,直接使用即可。
?
也可以在本地maven仓库中寻找,比如SR4的pom.xml在路径C:\Users\XXX\.m2\repository\org\springframework\cloud\spring-cloud-dependencies\Hoxton.SR4\spring-cloud-dependencies-Hoxton.SR4.pom
下
比如笔者本地就有如下的大版本:
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。