OpenFeign 实现远程调用

server/2025/2/23 11:25:27/

1. 问题引入

在前面写的代码中,通过使用RestTemplate来实现远程调用,但是这种方式还是存在一些问题

  1. 需要拼接 URL,灵活性高,但是 URL 复杂时容易写错
  2. 代码可读性差

而 OpenFeign 就解决了上述问题,OpenFeign 是一个声明式的 Web Service 客户端,用于简化在 Java 应用程序中调用 RESTful 服务的过程,也就是可以使用接口和注解来定义和调用 RESTful 服务,而不是手动编写 HTTP 请求代码。这种方式使得代码更简洁、易读,易于维护。

2. OpenFeign 的使用

首先,由于是 order-service 进行远程调用 product-service,需要在 order-service 中引入 openfeign 的依赖

<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>

然后需要在 order-service 的启动类上添加@EnableFeignClients注解,开启 OpenFeign 的功能

@EnableFeignClients
@SpringBootApplication
public class OrderServiceApplication {public static void main(String[] args) {SpringApplication.run(OrderServiceApplication.class,args);}
}

然后来定义一个 Feign 客户端接口:

@FeignClient(value = "product-service",path = "/product")
public interface ProductApi {@RequestMapping("/{productId}")ProductInfo getProductById(@PathVariable("productId") Integer productId);
}

通过@FeignClient注解来定义对远程服务的调用,value 指的是要调用的服务名称,path 指的是 Feign客户端 的统一路径

接着就可以通过之前的方式来注入,再调用方法

这样就完成了远程调用

3. 参数传递

在上面的代码中,演示的是从 URL 中获取参数,接下来演示 Feign 传递参数的方式

传递单个参数和传递多个参数都是通过@RequestParam来进行参数绑定

@RequestMapping("/p1")
String product1(@RequestParam("id") Integer id);@RequestMapping("/p2")
String product2(@RequestParam("id") Integer id,@RequestParam("name") String name);

传递对象是通过@SpringQueryMap注解来把对象作为多个参数传递的

@RequestMapping("/p3")
String product3(@SpringQueryMap ProductInfo productInfo);

传递 JSON 还是用的@RequestBody注解来实现的

@RequestMapping("/p4")
String product4(@RequestBody ProductInfo productInfo);

4. 最佳实践

从上面的代码中可以看出,Feign 客户端和服务提供者的 controller 代码非常相似,可以通过下面的这两种方式进行简化

4.1. 继承方式

上面是官方给出的继承的方式,来看具体怎么实现:

接口可以放在一个公共的 jar 包中,这样服务提供方和客户端都能够使用

然后把公共实体类和要被继承的接口都写在模块中

然后把当前模块打成 jar包,

让 order-service 和 product-service 分别去引入 jar 包

然后让服务提供方的 controller 实现 ProductInterface:

服务消费方去继承该接口

4.2. 抽取方式

首先还是把 Feign 的 Client 抽取为一个独立的模块,并把涉及到的实体类等都放在这个模块中,然后打成 jar 包,服务消费方只需要引入依赖即可

抽取的部分和上面还是一样的

引入依赖之后就可以直接调用,不用再写继承了,只需要在启动类上添加扫描路径,有两种方式可以添加扫描路径,一种是使用 basePackages 直接指定要扫描的路径,另一种是通过 clients 来指定具体的客户端接口类

@EnableFeignClients(basePackages = "com.example.feignclients")
@SpringBootApplication
public class OrderServiceApplication {public static void main(String[] args) {SpringApplication.run(OrderServiceApplication.class, args);}
}
@EnableFeignClients(clients = {ProductApi.class})
@SpringBootApplication
public class OrderServiceApplication {public static void main(String[] args) {SpringApplication.run(OrderServiceApplication.class,args);}
}

之后就可以成功调用了

5. 部署

由于项目中引用的是一个本地的依赖,所以打包的配置和之前又有些不一样了,首先需要指明需要从本地获取 jar 包

在 order-service 中引入依赖时指定一下要获取的 jar 包的路径

在插件中也配置一下,表示包含系统范围的依赖

之后就可以打包上传了


http://www.ppmy.cn/server/170116.html

相关文章

MySQL 日志

MySQL 日志 慢查询日志(Slow query log) 慢查询⽇志由执⾏时间超过系统变量 long_query_time 指定的秒数的SQL语句组成&#xff0c;并且检 查的⾏数⼤于系统变量 min_examined_row_limit 指定值。被记录的慢查询需要进⾏优化&#xff0c; 可以使⽤mysqldumpslow客⼾端程序对慢…

rk3588/3576板端编译程序无法运行视频推理

图片推理可以&#xff0c;但是视频不行&#xff0c;运行视频推理报错&#xff1a;segment fault. 我遇到的问题原因是ffmpeg安装有问题&#xff0c;可以先在板端运行&#xff1a;ffmpeg -version ffmpeg version 4.2.4-1ubuntu1.0firefly6 Copyright (c) 2000-2020 the FFmpe…

Android SDK封装打包流程详解

在Android开发中&#xff0c;SDK的封装和打包是将功能模块化并供其他开发者使用的常见需求。以下是Android SDK封装和打包的基本流程&#xff1a; 1. 创建Android Library模块 首先&#xff0c;你需要创建一个Android Library模块&#xff0c;而不是普通的Application模块。 在…

Ubuntu22.04 - gflags的安装和使用

目录 gflags 介绍gflags 安装gflags 使用 gflags 介绍 gflags 是Google 开发的一个开源库&#xff0c;用于 C应用程序中命令行参数的声明、定义和解析。gflags 库提供了一种简单的方式来添加、解析和文档化命令行标志(flags),使得程序可以根据不同的运行时配置进行调整。 它具…

告别卡关!XSS挑战之旅全关卡通关思路详解

XSS挑战之旅 XSS测试思路Level1Level2Level3Level4Level5Level6Level7Level8Level9Level10Level11Level12Level13Level14Level15Level16Level17Level18Level19Level20免责声明&#xff1a; XSS测试思路 确定输入输出点&#xff1a; 寻找URL参数、表单输入、HTTP头&#xff08;R…

C从入门到放弃篇1

各位新入坑C语言的朋友&#xff0c;你们有福了因为你们遇到了我&#xff0c;我会带你放弃C语言&#xff0c;哈哈哈哈哈。 其实&#xff0c;学任何东西都是循序渐进的&#xff0c;在学习的初期投入更多的精力&#xff0c;将来你会越学越快。我相信&#xff0c;放弃是最容易的事…

把 vscode 伪装成 goland

goland 开发项目太卡了&#xff0c;想换到更轻量级的 vscode&#xff0c;但是用久了 goland&#xff0c; vscode 的界面风格和快捷键又看不习惯和用不习惯&#xff0c;所以把 vscode 改成了跟 goland 一样的使用方式。 下载 2个插件 安装插件「JetBrains IDE Keymap」可以让 vs…

区块链相关方法-SWOT分析

1.SWOT 一、定义:一种基于内外部竞争环境和竞争条件下的态势分析&#xff0c;通过对企业的内外环境所形成的优势&#xff08;Strengths&#xff09;、劣势&#xff08;Weaknesses&#xff09;、机会&#xff08;Opportunities&#xff09;和威胁&#xff08;Threats&#xff0…