【SpringBoot】SpringBoot 之 OpenFeign服务调用(八)

2021-02-18 09:20

阅读:463

标签:project   default   apach   声明   maven   动态   Delve   pre   mave   

OpenFeign介绍

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

  Feign旨在式编写Java Http客户端变得更容易。

  Feign集成了Ribbon,利用Ribbon维护了服务列表信息,并且通过轮询实现了客户端的负载均衡。而与Ribbon不同的是,通过feign只需要定义服务绑定接口且以声明式的方法,优雅而简单的实现了服务调用

  Feign与OpenFeign的区别

  1)Feign是Spring Cloud组件中一个轻量级RESTful的HTTP服务客户端,Feign内置了Ribbon,用来做客户端负载均衡,去调用服务注册中心的服务。Feign的使用方式是:使用Feign的注解定义接口,调用接口,就可以调用服务注册中心的服务

    Feign的依赖

1 dependency>
2     groupId>org.springframework.cloudgroupId>
3     artifactId>spring-cloud-starter-feignartifactId>
4 dependency>

  2)OpenFeign是Spring Cloud在Feign的基础上支持了SpringMVC的注解,如@RequestMapping等等。OpenFeign的@FeignClient可以解析SpringMVC的@RequestMapping注解下的接口,并通过动态代理的方式产生实现类,实现类中

    OpenFeign的依赖

1 dependency>
2     groupId>org.springframework.cloudgroupId>
3     artifactId>spring-cloud-starter-openfeignartifactId>
4 dependency>  

OpenFeign使用

  项目架构如下:

  1个Eureka注册中心,2个服务提供者,1个服务消费者

  技术图片

  1、新建项目,参考【SpringCloud】SpringCloud 服务提供者集群与服务发现Discovery(三) 

  2、新建一个服务消费者模块(test-springcloud-order7997)的maven工程

  3、修改pom文件,引入OpenFeign依赖,完整pom文件如下:

技术图片技术图片
 1 xml version="1.0" encoding="UTF-8"?>
 2 project xmlns="http://maven.apache.org/POM/4.0.0"
 3          xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 4          xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
 5     parent>
 6         artifactId>test-springcloudartifactId>
 7         groupId>com.testgroupId>
 8         version>1.0-SNAPSHOTversion>
 9     parent>
10     modelVersion>4.0.0modelVersion>
11 
12     artifactId>test-springcloud-order7997artifactId>
13 
14 
15     dependencies>
16 
17         
18         dependency>
19             groupId>org.springframework.cloudgroupId>
20             artifactId>spring-cloud-starter-openfeignartifactId>
21         dependency>
22 
23         
24         dependency>
25             groupId>org.springframework.cloudgroupId>
26             artifactId>spring-cloud-starter-netflix-eureka-clientartifactId>
27         dependency>
28 
29         
30         dependency>
31             groupId>org.springframework.bootgroupId>
32             artifactId>spring-boot-starter-webartifactId>
33         dependency>
34         dependency>
35             groupId>org.springframework.bootgroupId>
36             artifactId>spring-boot-starter-actuatorartifactId>
37         dependency>
38         dependency>
39             groupId>org.springframework.bootgroupId>
40             artifactId>spring-boot-devtoolsartifactId>
41             scope>runtimescope>
42             optional>trueoptional>
43         dependency>
44 
45         dependency>
46             groupId>org.projectlombokgroupId>
47             artifactId>lombokartifactId>
48             optional>trueoptional>
49         dependency>
50         dependency>
51             groupId>org.springframework.bootgroupId>
52             artifactId>spring-boot-starter-testartifactId>
53             scope>testscope>
54         dependency>
55 
56     dependencies>
57 
58     build>
59         finalName>test-springcloud-order8000finalName>
60     build>
61 project>
pom.xml

    Feign集成了Ribbon:

    技术图片

  4、修改配置文件,application.yml

 1 # 端口
 2 server:
 3   port: 7997
 4 
 5 spring:
 6   application:
 7     name: cloud-order
 8 
 9 eureka:
10   client:
11     # 设置与Eureka Server交互的地址查询服务和注册服务都需要依赖这个地址
12     service-url:
13       defaultZone: http://localhost:8761/eureka
14   instance:
15     #  instance:
16     instance-id: ${spring.cloud.client.ip-address}:${server.port}
17     # 访问路径可以显示IP地址
18     prefer-ip-address: true

  4、编写SpringBoot启动类,并使用@EnableFeignClients注解,开始Feign客户端

1 // 开启Feign客户端
2 @EnableFeignClients
3 @SpringBootApplication
4 public class OrderMain7997 {
5     public static void main(String[] args) {
6         SpringApplication.run(OrderMain7997.class, args);
7     }
8 }

 

  5、编写接口,使用@FeignClient("CLOUD-PAYMENT-SERVICE")注解,表名此接口做为一个feign客户端,并调用CLOUD-PAYMENT-SERVICE服务。

1 @Component
2 // Feign客户端
3 @FeignClient("CLOUD-PAYMENT-SERVICE")
4 public interface PaymentFeignService {
5     // 获取
6     @GetMapping("/payment/get/{id}")
7     public CommonResult getPaymentById(@PathVariable("id") Long id)
8 }

 

  6、编写Controller,使用接口调用服务

 1 @RestController
 2 @Slf4j
 3 public class OrderFeignController {
 4 
 5     @Autowired
 6     private PaymentFeignService paymentFeignService;
 7 
 8     @GetMapping("/consumer/payment/get/{id}")
 9     public CommonResult getPaymentById(@PathVariable("id") Long id) {
10         return paymentFeignService.getPaymentById(id);
11     }
12 }

 

  7、启动项目,测试

    访问地址:http://localhost:7997/consumer/payment/get/1

    结果:

      正常远程调用服务提供者的服务,且达到负载均衡的目的

 

【SpringBoot】SpringBoot 之 OpenFeign服务调用(八)

标签:project   default   apach   声明   maven   动态   Delve   pre   mave   

原文地址:https://www.cnblogs.com/h--d/p/12690840.html


评论


亲,登录后才可以留言!