首页 > 其他分享 >SpringCloud【OpenFeign】-服务间调用的利器

SpringCloud【OpenFeign】-服务间调用的利器

时间:2022-09-30 11:08:23浏览次数:61  
标签:Feign 调用 服务 OpenFeign SpringCloud 接口 利器 public


SpringCloud【OpenFeign】-服务间调用的利器_自定义拦截器

文章目录


前言

在学习OpenFeign之前,我们有必要了解下​​什么是Feign​​❓,好多人老把这两个东西混为一谈。认为他们是一个东西。

  • ​Feign:​​​Feign是Netflix公司写的,是SpringCloud组件中的一个轻量级RESTful的HTTP服务客户端,是SpringCloud中的第一代负载均衡客户端。​​也就是说Feign有缺陷,所以OpenFeign就产生了。​
  • -​​Openfeign:​​​是Spring CLoud的二级子项目,是基于Feign的基础上进行了完善和优化,​​支持了SpringMVC的注解​​​,​我们可以像写控制层的转发一样完成服务与服务之间的调用。

Feign现在已经不再更新维护,所以目前基本上都是使用OpenFeign


介绍完Feign和OpenFeign的区别后,那么我可以回想下以前我们调用服务是怎么样调用的?----​​RestTemplate​

使用RestTemplate我们需要在控制层不断地维护请求服务的地址,参数,返回值。很不优雅,代码阅读也十分繁琐。不好,不喜欢!!!

❓那么有没有一种更加简便且优雅的方式调用服务呢-----那就是接下来要学习的OpenFeign了。

OpenFeign也是放在服务消费端的,也整合了负载均衡器。

一、OpenFeign快速使用

1.1 SpringCloud Alibaba快速整合OpenFeign

【父级pom】

<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.3.11.RELEASE</version>
<relativePath /> <!-- lookup parent from repository -->
</parent>


<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>1.8</java.version>
<spring.cloud-version>Hoxton.SR8</spring.cloud-version>
</properties>

<dependencyManagement>
<dependencies>
<!-- springCloud -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>${spring.cloud-version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>

<!-- springcloud alibaba -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-dependencies</artifactId>
<version>2.2.5.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>

<dependencies>
<!-- springBoot -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<!-- web -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- json -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.47</version>
</dependency>
</dependencies>

二、声明式服务调用

所谓的声明式,就是需要利用注解声明一个调用服务的接口方法,这个方法必须声明在服务消费方。使用@FeignClient声明

【实现步骤】

  1. 引入依赖
<!--OpenFeign-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
  1. 在服务消费者端,写一个调用服务的接口
@Component
@FeignClient(name = "stock-service",path = "/stock")
public interface FeignStockService {

@RequestMapping("/reduct")
public String name();

}
  • @FeignClient:指明需要调用的服务的名称以及路径和失败回调,这个注解​​会扫描@EnableFeignClients指定的包​​​;如果未指定,​​则会找@FeignClient指定的服务名,在注册中心找对应的服务IP万层服务调用​
  • name:​指定FeignClient的名称​,如果项目使用了Ribbon,name属性会作为微服务的名称,用于服务发现
  • path:​定义当前FeignClient的统一前缀​,当我们项目中配置了server.context-path,server.servlet-path时使用
  • fallbackFactory:​工厂类,用于生成fallback类示例​,通过这个属性我们可以实现每个接口通用的容错逻辑,减少重复的代码
  • fallback:​定义容错的处理类,当调用远程接口失败或超时时,会调用对应接口的容错逻辑,fallback指定的类必须实现@FeignClient标记的接口
  • configuration:​Feign配置类​,可以自定义Feign的Encoder、Decoder、LogLevel、Contract
  • url:​ url一般用于调试

在写FeignClients的时候,我们可以找一个规律,就是这里的接口方法实际就是从服务提供者的controller里粘贴过来的方法,如下图所示:

SpringCloud【OpenFeign】-服务间调用的利器_自定义拦截器_02


SpringCloud【OpenFeign】-服务间调用的利器_自定义拦截器_03

  1. 控制层实现调用
@RestController
@RequestMapping("/order")
public class OrderController {

@Autowired
private FeignStockService feignStockService;

@RequestMapping("/add")
public String add() {
System.out.println("下单成功!");
return "hello Feign" + feignStockService.name();
}
}

使用了OpenFeign后,我们在也不需要向原来使用RestTemplate一样在写很多遍的url,去获取服务。很方便,但是又有一个新的问题❓
就是我们又要去写很多遍的服务接口方法—这样耦合度还是很高,还不够优雅—接着改

  1. 在启动类上加上​​@EnableFeignClients​​注解,表示自动开启Feign远程调用。
@SpringBootApplication
@EnableDiscoveryClient // nacos版本在1.4以后就可以不用添加 表示nacos启动客户端
@EnableFeignClients // 开启Feign调用
public class OrderApplication {

public static void main(String[] args) {
SpringApplication.run(OrderApplication.class, args);
}
}

三、编程式服务调用

标签:Feign,调用,服务,OpenFeign,SpringCloud,接口,利器,public
From: https://blog.51cto.com/u_14957231/5725615

相关文章