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

SpringCloud-OpenFeign

前言

1.存在问题

远程调用可以像Autowired一样吗
服务之间的通信⽅式,通常有两种:RPC和HTTP.
在SpringCloud中,默认是使⽤HTTP来进⾏微服务的通信,最常⽤的实现形式有两种:
RestTemplate
OpenFeign

RPC(RemoteProcedureCall)远程过程调⽤,是⼀种通过⽹络从远程计算机上请求服务,⽽不需
要了解底层⽹络通信细节。RPC可以使⽤多种⽹络协议进⾏通信,如HTTP、TCP、UDP等,并且在
TCP/IP⽹络四层模型中跨越了传输层和应⽤层。简⾔之RPC就是像调⽤本地⽅法⼀样调⽤远程⽅法。
常⻅的RPC框架有:

  1. Dubbo:ApacheDubbo中⽂
  2. Thrift : Apache Thrift- Home
  3. gRPC:gRPC

2. OpenFeign-介绍

这个是远程调用http的另一种实现形式
OpenFeign是⼀个声明式的WebService客⼾端.它让微服务之间的调⽤变得更简单,类似controller调⽤service, 只需要创建⼀个接⼝,然后添加注解即可使⽤OpenFeign

由于Feign的停更维护,对应的,我们使⽤的依赖是spring-cloud-starter-openfeign

3. OpenFeign-快速入门

OpenFeign是远程调用的,与nacos没什么关系
所以我们就将就使用nacos代码
直接复制文件夹
改名
父项目
在这里插入图片描述
子项目
在这里插入图片描述
在这里插入图片描述
order调用product
所以跟product没有什么关系
我们直接在order引入依赖
在这里插入图片描述
feign就是openfeign
order引入注解@EnableFeignClients
在这里插入图片描述
这个就是开启了feign的功能
我们的远程调用要像service调用mapper一样
所以先创建一个类似mapper的

在这里插入图片描述
在这里插入图片描述
然后这个接口要绑定product里面的contorller功能
先指明这个使用的是哪个服务
在这里插入图片描述
然后指定找哪个接口哪个方法
在这里插入图片描述
这样客户端order的声明就写好了
实现的话product里面的对应的controller已经实现了

在这里插入图片描述
可以这样优化一下
然后就是远程调用
在这里插入图片描述
这样就成功了
然后开始测试
在这里插入图片描述

在这里插入图片描述

发起远程调用
在这里插入图片描述
在这里插入图片描述

OpenFeign-参数传递

单个参数

product中

在这里插入图片描述
在这里插入图片描述
然后就是
order来调用

先声明
在这里插入图片描述
参数用注解RequestParam来接收
而且注解RequestParam不能省略
RequestParam是接收?后面的参数
PathVariable是接收最后一个路径的
然后就是测试了
新建一个controller,然后controller调用feign,feign在调用商品服务
在这里插入图片描述
然后就是FeignController调用ProductApi,ProductApi调用ProductController
在这里插入图片描述
这样就成功了
调用order,返回product

多个参数

在这里插入图片描述
我们用postman来测试

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
然后就是feign的客户端声明了

在这里插入图片描述
我们可以看出feign接收对象,和单个参数的格式和springmvc是不一样的

然后就是开始测试了

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

对象

Json

OpenFeign-最佳实践1

我们也能看出来,Feign的客⼾端与服务提供者的controller代码⾮常相似
可以简化吗可以提出来吗
在这里插入图片描述
先备份一份代码

继承

把公共代码提出来,然后继承
公共代码放在哪里呢–》创建一个公共的jar包
在这里插入图片描述
在这里插入图片描述

我们在这个里面直接写方法的声明
然后引入对应的依赖
在这里插入图片描述
在这里插入图片描述
现在就还差一个ProductInfo了
我们把ProductInfo也提取出来
这样product和order都可以使用ProductInfo了
在这里插入图片描述
然后另外两个模块的ProductInfo就注释掉了

在这里插入图片描述
怎么在product中使用api呢
把api打出jar包,存在maven仓库中,然后引入

在这里插入图片描述
点击install,就是把当前工程打成jar包放在maven本地仓库里面
在这里插入图片描述
就放在这个里面
在这里插入图片描述

选择第一个
在这里插入图片描述
然后product的pom文件就多了我们刚刚打的jar包了
这样就把product-api导入product中了
在这里插入图片描述
order里面也是这样添加
在这里插入图片描述
然后就是在product中继承我们在api中的接口,然后实现
product-api中有了修改的话,就一定要重新install打包
在这里插入图片描述
product继承接口,然后实现接口
在这里插入图片描述
我们order中的feign就直接继承api中的接口就可以了

然后就是哪里有错改哪里
然后就是重新启动了
在这里插入图片描述
这样就成功了

OpenFeign-最佳实践

抽取

官⽅推荐Feign的使⽤⽅式为继承的⽅式,但是企业开发中,更多是把Feign接⼝抽取为⼀个独⽴的模块(做法和继承相似,但理念不同).
操作⽅法:
将Feign的Client抽取为⼀个独⽴的模块,并把涉及到的实体类等都放在这个模块中,打成⼀个Jar.服务消费⽅只需要依赖该Jar包即可.这种⽅式在企业中⽐较常⻅,Jar包通常由服务提供⽅来实现

在复制一份文件
在这里插入图片描述
在这里插入图片描述

抽取就是把这个api抽取成独立的模块
如果order有10个,那么api就要写十份,或者如果继承的话,也要继承十份
在这里插入图片描述
然后又是引入依赖
在这里插入图片描述
在这里插入图片描述

这样就抽取完成了
然后把order里面的productapi给注释掉
在这里插入图片描述
我们给profiles增加

            <activation>
                <activeByDefault>true</activeByDefault>
            </activation>

这样每次打包的时候,都会默认勾选dev了
order也增加这个
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
我们在order中直接添加依赖
在这里插入图片描述
然后pom里面出现对应的依赖
在这里插入图片描述
我们把这个也给注释掉
然后就是修改包,慢慢改
我们发现有一个问题
在这里插入图片描述
因为spring扫描的时候默认就是扫描当前项目启动类所在的目录
所以spring-api里面的bean是扫描不到的
在这里插入图片描述
在这里插入图片描述

我们给EnableFeignClients增加指定扫描路径,clients是指定feign,basepackages是指定扫描的路径
在这里插入图片描述
把这个包引入进来,这样就可以打入bean了,我们用feign的注解来引入spring-api的bean
然后postman都是可以正常访问的
抽取的服务通常由服务的提供方来写

部署服务

在这里插入图片描述
配置的话原来就已经弄好了的
在这里插入图片描述

然后是打包,但是我们的maven引入了本地的包,我们在package打包的时候,是从maven中央仓库来下载这个包的

Maven打包默认是从远程仓库下载的,product-api这个包在本地,有以下解决⽅案:
上传到Maven中央仓库(参考:如何发布Jar包到Maven中央仓库,⽐较⿇烦)[不推荐]
搭建Maven私服,上传Jar包到私服[企业推荐]
从本地读取Jar包[个⼈学习阶段推荐]
我们先修改order的pom文件
在这里插入图片描述
scope修改为system,然后配置路径,不要反斜杠,改为斜杠
在这里插入图片描述
这样改一下
但是这样还不够

我们还要给springboot中的maven插件配置一下
原来:
在这里插入图片描述
现在:
在这里插入图片描述
这样设置就可以了
然后我们开始打包
先打包order
然后就是上传jar包了
然后是product的jar包
mkdir logs
nohup java -jar product-service-1.0-SNAPSHOT.jar > logs/product.log &
nohup java -jar order-service-1.0-SNAPSHOT.jar >logs/order.log &

在这里插入图片描述
这样就成功了

Gateway-网关介绍

总结


文章转载自:

http://golwIXf9.pycpt.cn
http://sSMguskL.pycpt.cn
http://Hdt7Vicd.pycpt.cn
http://W0p8ziRy.pycpt.cn
http://RWZwgxPK.pycpt.cn
http://N9B0yuzj.pycpt.cn
http://m0ii04aj.pycpt.cn
http://Kw9bEbBg.pycpt.cn
http://q6MLLrAT.pycpt.cn
http://JjuIPkJL.pycpt.cn
http://QfaaOlId.pycpt.cn
http://ozbUkGXG.pycpt.cn
http://v9CHSvgh.pycpt.cn
http://JNVeYVqJ.pycpt.cn
http://rK1Lqvg3.pycpt.cn
http://BP8boeUZ.pycpt.cn
http://cl1gpyaY.pycpt.cn
http://3XL9BWGM.pycpt.cn
http://kd1H62lM.pycpt.cn
http://coFtITYF.pycpt.cn
http://qL38fSXB.pycpt.cn
http://e5UHbB1R.pycpt.cn
http://7kgI58aJ.pycpt.cn
http://wqsBSfso.pycpt.cn
http://s7dBXuEg.pycpt.cn
http://S9egpP3c.pycpt.cn
http://PibMdbPB.pycpt.cn
http://fxbrmStd.pycpt.cn
http://sqIgR5n0.pycpt.cn
http://ROxQPvh6.pycpt.cn
http://www.dtcms.com/a/128433.html

相关文章:

  • 【家政平台开发(39)】解锁家政平台测试秘籍:计划与策略全解析
  • 【Code】《代码整洁之道》笔记-Chapter12-迭进
  • 【前端】【css】flex布局详解
  • qt的基本使用
  • 浏览器智能体-browser use理解与配置
  • 【AutoTest】自动化测试工具大全(Java)
  • c++ 表格控件 UltimateGrid 控件实例
  • 南墙WAF非标端口防护实战解析——指定端口安全策略深度剖析
  • 力扣热题100刷题day64|128.最长连续序列
  • ubuntu22.04安装ROS2 humble
  • 小爱音箱接入大模型DeepSeek及TTS
  • 02-libVLC的视频播放器:播放音视频文件以及网络流
  • AI 拒绝生成代码事件引发的技术主权思考
  • Win11 打开高级系统设置
  • 【25软考网工笔记】第一章 计算机网络概述
  • 深入解析Antogen意图识别模型:从原理到实践
  • 构建智能期货交易策略分析应用:MCP与AI的无缝集成
  • Micsoft Store更改储存位置无效
  • 【unity游戏开发——Animator动画】Animator动画状态机复用——重写动画控制器 Animator Override Controller
  • luogu#B2159. 成绩排序
  • 普通通话CSFB方式(2g/3g)
  • MyBatis-Plus 扩展功能
  • 医学图像隐私保护研究综述
  • 反射式人工智能的使用现在是 Shopify 的基本期望
  • 8D报告详解
  • MacOs java环境配置+maven环境配置踩坑实录
  • Java EE期末总结(第六章)
  • 2025 蓝桥杯省赛c++B组个人题解
  • sqli-labs靶场 less 7
  • 第 1 篇✅ 用 AI 编程之前,你得先搞清楚你和 AI 是啥关系