当前位置: 首页 > news >正文

远程调用 - OpenFeign

目录

RestTemplate 问题

OpenFeign

快速使用

OpenFeign 参数传递

传递单个参数

传递多个参数

传递对象

传递 JSON 字符串

最佳实践

Feign 继承方式

创建一个 Module

打 Jar 包

服务提供方

服务消费方

Feign 抽取方式

创建一个 module

引入依赖

API

打 Jar 包

服务消费方使用 product-api

部署服务


学习 OpenFeign 可以使用前面的 nacos 的代码~

RestTemplate 问题

远程调用的代码:

RestTemplate 对 HTTP 封装之后,较为简单方便,但还是存在一些问题。

1. URL 需要拼接,灵活度高,但封装时易出错。

2. 代码可读性差,风格不统一


微服务之间的通信方式有两种:RPC 和 HTTP

SpringCloud 中,默认使用 HTTP来进行微服务的通信,常用的实现方式有两种:

RestTemplate OpenFeign

RPC 远程调用,是一种通过网络,从远程计算机上请求服务,而不需要了解底层网络通信细节。 RPC 可以使用多种网络协议进行通信,HTTP,TCP,UDP... 并且在 TCP/IP 网络四层模型中,跨越了传输层和应用层。

总而言之,RPC 就像调用本地方法一样调用远程方法~~

常见的 RPC 框架:

1. Dubbo:Apache Dubbo

2. Thrift:Apache Thrift - Home

3. gRPC:gRPC

OpenFeign

OpenFeign 是一个声明式的 Web Service 客户端,它让微服务之间的调用变得更简单。类似 controller 调用 service,只需要创建一个接口,然后添加注解即可使用。

OpenFeign 发展历史

快速使用

1. 引入依赖

在 order-service 中引入对应的依赖:

由于 Feign 底层也会使用 Spring Cloud LoadBalance 进行负载均衡

还需要导入负载均衡的依赖

2. 添加注解

在 order-service 的启动类添加注解 @EnableFeginClients,开启 OpenFeign 的功能

3. 编写 OpenFeign 的客户端

在 order-service 中创建 api 包,包下创建 ProductApi 接口类

@FeigbClient 注解作用在接口上,说明如下:

name/value:指定 FeignClient 的名称,也就是微服务的名称,用于服务发现,Feign 底层也会使用 Spring Cloud LoadBalance 进行负载均衡。

path:定义当前 FeignClient 的统一前缀。

4. 远程调用

将 ProductApi 接口注入,然后直接调用方法

5. 测试

启动服务,nacos,访问接口

使用 Feign 也可以实现远程调用。

Feign 简化了与 HTTP 服务交互的过程,把 REST 客户端的定义转换为 Java 接口,并通过注解的方式来声明请求参数,请求信息等,使远程调用更加方便和简洁。

OpenFeign 参数传递

OpenFeign 的客户端(即我们上文实现的 ProductApi)和服务提供者的接口声明非常相似。

上面例子中,只演示了 Feign 从 URL 中获取参数,下面是 Feign 参数传递的方式

传递单个参数

1. 服务端需要提供相应的接口

2. Feign 客户端

注意:@RequestParam 做参数绑定,不可以省略

3. 服务消费方 order-service

传递多个参数

使用多个 @RequestParam 进行参数绑定即可~

1. 服务端提供对应接口:

2. Feign 客户端

3. 服务消费方 order-service

测试

传递对象

1. 服务端提供对应接口:

2. Feign 客户端

注意参数前面要有 @SpringQueryMap 注解

3. 服务消费方 order-service

传递 JSON 字符串

1. 服务端提供对应接口:

2. Feign 客户端

3. 服务消费方 order-service

最佳实践

即,在具体的项目过程中,总结出来的最好的使用方式。

通过观察,Feign 的客户端和服务提供者的 controller 代码非常相似

Feign 继承方式

Feign 支持继承的方式,我们可以将一些常见的操作,封装到一个接口中

即,定义好一个接口,服务提供方实现这个接口,服务消费方编写 Feign 接口的时候,直接继承这个接口即可~~

创建一个 Module

接口放在一个公共的 Jar 包中,供服务提供方和服务消费方使用

引入依赖:

目录结构如下:

将 ProductApi 和 ProductInfo 复制到 product-api 模块中

因为 order-service 和 product-service 中都需要 ProductInfo,所以我们直接将其提取出来在 product-api,然后就可以将之前两个模块重点 ProductInfo 全部注释掉了~~

打 Jar 包

通过 Maven 打包

观察 Maven 本地仓库,是否成功打包

服务提供方

服务提供方实现接口 ProductInterface

在 ProductController 方法中实现接口

但我们这个接口的定义是在其他模块中,由于刚刚已经打成了 jar 包放在了我们的本地 maven 仓库中,所以当我们使用快捷键修复的时候,会自动提示我们添加依赖~~

可以在 pom 文件中看到我们刚刚打的 jar 包已经被添加进来了~~

此时进行接口的实现:

注意!由于我们在前面将 ProductInfo 对象抽取到了新的 jar 包 product-api 中,所以之前导入的 ProductInfo 类全会报错,之前的 ProductInfo 都是来自各自模块中的 ProductInfo,现在都被我们注释掉了,需要重新导一下包~~(此处没有报错是因为我已经都导完了~~)

服务消费方

同样的,在 order-service 中,ProductInfo 相关的类的也需要重新导包~

服务消费方继承 ProductInterface

order-service 中的 service 层代码不需要变化

测试:

总的来说:是将我们前面快速上手中,在 order 中的 TestFeignController 的代码,抽象出了一个模块的接口,然后将那个模块打成 jar 包,分别引入 product 和 order 中,在 product 中进行实现,在 order 中进行继承~~

Feign 抽取方式

官方推荐方式为继承的方式,但企业开发中更多将 Feign 接口抽象为一个独立的模块(做法和继承相似,理念不同)

方法:

将 Feign 的 Client 抽取为一个独立的模块,并把涉及到的实体类都放在这个模块中,打成一个 Jar 包。服务消费方只需要依赖 Jar 包即可。Jar 包通常由服务提供方来实现。

创建一个 module

引入依赖

API

将 ProductApi 和 ProductInfo 到 product-api 模块中

打 Jar 包

服务消费方使用 product-api

1. 将 order-service 中的 ProductApi 和 ProductInfo 全部删掉

2. 将打好的 jar 包引入进来

使用之前路径的 ProductApi 和 ProductInfo 全部会报错,需要将路径更换为 product-api 中的路径

3. 指定扫描类:ProductApi

在启动类的 @EnableFeignClients 中添加扫描类

启动服务,测试远程调用

部署服务

1. 将数据库 Nacos 等配置进行修改

2. 对两个服务进行打包

        Maven 打包默认是从远程仓库下载的,product-api 这个包在本地,解决方案:

                1. 将我们的包上传到 Maven 中央仓库(麻烦,不好弄)

                2. 搭建 Maven 私服,将 Jar 包上传到私服(企业使用)

                3. 从本地读取 Jar 包(学习阶段使用~~)

从本地读取 Jar 包:

修改 pom 文件

systemPath 标签中的路径,对应我们本地的 Maven 仓库的地址

3. 上传 jar 包到 Linux 服务器

4. 启动 Nacos(启动前可以将 data 数据删除掉)

5. 启动服务

6. 测试符合预期~

http://www.dtcms.com/a/557566.html

相关文章:

  • 简述电子商务网站的建设步骤酷炫的网站模板免费下载
  • 【车载开发系列】常见集成测试的方法
  • Java 异常处理机制专项优化
  • 外设模块学习(12)——SW-520D倾斜传感器、SW-420震动传感器、声音传感器(三引脚)(STM32代码参考)
  • 行业网站解决方案wordpress主题点赞
  • 微网站的特点模板之家html5
  • 模电基础和数电基础
  • 企业免费网站模板企业宣传册范例
  • 神经网络组植物分类学习规划与本周进展综述13
  • 生产管理系统详解:10 张表覆盖“下单→设计→生产→采购→出入库→售后”全链路,字段与流程图节点一一对应,直接建库即可使用
  • 炒币网站开发网站建设项目经验
  • 论坛类网站开发报价wordpress官方主题下载地址
  • 安路FPGA_LED闪烁
  • 徐州模板开发建站营销型网站设计公司哪里有
  • C# 进程管理实战:检查与启动EXE程序的完整指南
  • ssm面试六十题
  • 做网站内容需要自己填的吉安做网站
  • C# 使用 CSRedisCore指南
  • AD域 BloodHound 2025最新Linux穩定版|Docker封鎖繞過安裝脚本
  • 基于单片机的高频感应加热式棉花糖机的电气控制系统的设计(论文+源码)
  • C++:模板的幻觉 —— 实例化、重定义与隐藏依赖势中
  • 国外市场网站推广公司毕业设计做网站大小有什么要求
  • 【LUT技术专题】SVDLUT代码讲解
  • 基于多模态特征提取与贝叶斯优化的污染源智能识别与分类系统
  • 将遥感数据处理成dfine可以处理的数据
  • 网站关键词掉了织梦网站后台一键更新没反应
  • 前端进阶:从理论到实践体系
  • Android Build系列专题【篇五:构建系统主入口文件build/core/makefile】
  • 网站制作中需要注意的地方研磨材料 东莞网站建设
  • 数字马力Java开发面试题及参考答案(中)