个人随笔
目录
四、服务之间的调用Feign客户端
2020-09-11 22:46:02

上一篇博文,我们介绍了服务治理,注册中心Eureka,学会了基本的服务之间的调用,但是我们用的是RestTemplate的方式,其实这里,我们可以有一种更加简便的服务之间的调用方式,那就是Feign。Spring Cloud Feign是一套基于Netflix Feign实现的声明式服务调用客户端。它使得编写Web服务客户端变得更加简单。我们只需要通过创建接口并用注解来配置它既可完成对Web服务接口的绑定。下面我们一起来写个例子使用吧。

一、首先建立一个特注册中心和一个服务提供者

这里我们建立一个注册中心和服务提供者,可以参考上一篇博文服务治理SpringCloud Eureka入门实战。这里我们提供的服务如下:

  1. @RestController
  2. public class ProviderController {
  3. @RequestMapping("/getMsg")
  4. public String getMsg() {
  5. return "Provider";
  6. }
  7. }

二、建立服务消费者

这我们新建一个服务消费者,通过Feign的方式调用服务端。相信学过我上一篇博文的读者对于新建一个SpringClopud的应用已经很简单那啦。项目结构如下:

1、pom.xml

  1. <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  2. <modelVersion>4.0.0</modelVersion>
  3. <groupId>cn.suibibk</groupId>
  4. <artifactId>springcloud-feign-consumer</artifactId>
  5. <version>0.0.1-SNAPSHOT</version>
  6. <parent>
  7. <groupId>org.springframework.boot</groupId>
  8. <artifactId>spring-boot-starter-parent</artifactId>
  9. <version>2.0.0.RELEASE</version>
  10. </parent>
  11. <!-- 管理依赖 -->
  12. <dependencyManagement>
  13. <dependencies>
  14. <dependency>
  15. <groupId>org.springframework.cloud</groupId>
  16. <artifactId>spring-cloud-dependencies</artifactId>
  17. <version>Finchley.M7</version>
  18. <type>pom</type>
  19. <scope>import</scope>
  20. </dependency>
  21. </dependencies>
  22. </dependencyManagement>
  23. <dependencies>
  24. <!-- SpringBoot整合Web组件 -->
  25. <dependency>
  26. <groupId>org.springframework.boot</groupId>
  27. <artifactId>spring-boot-starter-web</artifactId>
  28. </dependency>
  29. <!-- SpringBoot整合eureka客户端 -->
  30. <dependency>
  31. <groupId>org.springframework.cloud</groupId>
  32. <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
  33. </dependency>
  34. <!-- SpringBoot整合feign客户端-->
  35. <dependency>
  36. <groupId>org.springframework.cloud</groupId>
  37. <artifactId>spring-cloud-starter-openfeign</artifactId>
  38. </dependency>
  39. </dependencies>
  40. <!-- 注意: 这里必须要添加, 否者各种依赖有问题 -->
  41. <repositories>
  42. <repository>
  43. <id>spring-milestones</id>
  44. <name>Spring Milestones</name>
  45. <url>https://repo.spring.io/libs-milestone</url>
  46. <snapshots>
  47. <enabled>false</enabled>
  48. </snapshots>
  49. </repository>
  50. </repositories>
  51. </project>

我们只需要在引入如下依赖就可以啦

  1. <!-- SpringBoot整合feign客户端-->
  2. <dependency>
  3. <groupId>org.springframework.cloud</groupId>
  4. <artifactId>spring-cloud-starter-openfeign</artifactId>
  5. </dependency>

2、application.yml

其实该配置文件跟上一篇博文里的一样,开启feign功能并不需要去修改配置文件。

  1. ###服务消费者启动端口
  2. server:
  3. port: 8081
  4. ###服务名称(服务注册到eureka名称)
  5. spring:
  6. application:
  7. name: app-suibibk-consumer
  8. ###服务注册到eureka地址
  9. eureka:
  10. client:
  11. service-url:
  12. defaultZone: http://localhost:8000/eureka
  13. ###注册到Eureka
  14. register-with-eureka: true
  15. ###是否需要从eureka上获取注册信息
  16. fetch-registry: true

3、ProviderFeign.java

创建Feign客户端调用工具接口,这里很简单的,代码如下

  1. @FeignClient("app-suibibk-provide")
  2. public interface ProviderFeign {
  3. @RequestMapping("/getMsg")
  4. public String getMsg();
  5. }

@FeignClient(“app-suibibk-provide”)这个注解就表示这个是远程调用app-suibibk-provide服务的/getMsg接口,这里必须标明具体的接口:

  1. @RequestMapping("/getMsg")
  2. public String getMsg();

但是如果我们有几十个接口,这里如果写几时个接口大的话,代码重复太高,所以这里建议,并且实际上用微服务架构搭建的项目都是把接口抽取出来,然后服务端和Feign客户端直接继承即可,那么这里的代码就会变成如下:

  1. @FeignClient("app-suibibk-provide")
  2. public interface ProviderFeign extents ProviderService{
  3. }

ProviderService.java为

  1. public interface ProviderService{
  2. @RequestMapping("/getMsg")
  3. public String getMsg();
  4. }

ProviderController.java为

  1. @RestController
  2. public class ProviderController implements ProviderService {
  3. @Override
  4. @RequestMapping("/getMsg")
  5. public String getMsg() {
  6. return "Provider";
  7. }
  8. }

这样子,我们只需要修改ProviderService和ProviderController即可。添加接口删除接口并不会影响Feign客户端的代码。

4、ConsumerController.java

这里我们只需要将ProviderFeign注入即可。

  1. @RestController
  2. public class ConsumerController{
  3. @Autowired
  4. private ProviderFeign providerFeign;
  5. @RequestMapping("/toProviderGetMsg")
  6. public String toProviderGetMsg() {
  7. return providerFeign.getMsg();
  8. }
  9. }

5、启动类AppConsumer.java

  1. @SpringBootApplication
  2. @EnableEurekaClient
  3. @EnableFeignClients
  4. public class AppConsumer {
  5. public static void main(String[] args) {
  6. SpringApplication.run(AppConsumer.class, args);
  7. }
  8. }

@EnableEurekaClient表示这个是Eureka客户端
@EnableFeignClients 表示这个是Feign客户端

三、启动Eureka、服务提供者、服务消费者测试

启动程序后输入:
http://127.0.0.1:8081/toProviderGetMsg
页面返回:Provider
表示调用成功

结语

到此,我们就实现了Feign的调用方式,是不是很简单,当然我们一依然可以用http、restTemplate的调用方式,如果是同一个项目各个微服务之间调用的话,我这里是推荐用Feign;毕竟按我上面说的抽取出接口来真的可以很方便。顺便说一句SpringCloud feign 默认开启支持ribbon,支持本地负载均衡。:bowtie:

 399

啊!这个可能是世界上最丑的留言输入框功能~


当然,也是最丑的留言列表

有疑问发邮件到 : suibibk@qq.com 侵权立删
Copyright : 个人随笔   备案号 : 粤ICP备18099399号-2