(超详细)SpringCloud集成OpenFeign实现服务调用

文章目录

    • 概要
    • 整体架构流程
    • 技术名词解释
    • 技术细节
    • 小结

概要

        OpenFeign 是一个声明式的 HTTP 客户端,它使得我们可以用接口的方式调用 HTTP 服务,极大地简化了 REST 客户端的编写。在 Spring Cloud 中,集成了 OpenFeign,使得开发者可以更加方便地调用其他微服务的接口。

(通俗的说就是,在springcloud中可以直接在一个模块中调用另一个模块的接口,实现别的接口的功能)。 

特点

二、主要特点

  1. 声明式 HTTP 客户端:通过定义接口和注解即可实现 HTTP 调用。
  2. 与 Spring Cloud 无缝集成:支持 Spring MVC 注解,如 @RequestMapping、@GetMapping、@PostMapping 等。
  3. 负载均衡支持:结合 Ribbon 可以实现客户端负载均衡。
  4. 可插拔的解码和编码器:支持 JSON、XML 等格式的请求和响应。
  5. 日志记录:内置日志系统,可以方便地记录 HTTP 请求和响应。

集成流程

第一步,在脑子里想好哪一个是生产者(被调用的方法所在模块),哪一个是消费者(调用另一个模块的方法)
第二步,确定好要使用的注册中心(eureka或者nacos都可以,要保证生产者和消费者所在的服务可以被注册到注册中心中以供调用)

生产者模块(这里举得例子是商品模块作为生产者),引入nacos依赖注册中心,将服务注册上去。

        <dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId></dependency><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-bootstrap</artifactId></dependency><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId><exclusions><exclusion><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-netflix-ribbon</artifactId></exclusion></exclusions></dependency>

消费者模块

nacos依赖(将消费者模块注册到nacos中)

        <dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId></dependency><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-bootstrap</artifactId></dependency><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId><exclusions><exclusion><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-netflix-ribbon</artifactId></exclusion></exclusions></dependency>
第三步在消费者魔模块中引入openfeign依赖
         <dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-openfeign</artifactId></dependency>
第四步在消费者模块的启动类中加入注解

@FeignClient(value = "jingxi-mall")
public interface OpenFeignService {@GetMapping("/product/tb/{id}")Result<OpenFeignDto> getTypeById(@PathVariable("id") Integer id);@GetMapping("/product/tb/selectAll")public List<OpenFeignDto>  selectAll();@GetMapping("/product/tb/selectByIds")public List<OpenFeignDto>  selectAllByIds(@RequestParam Integer[] ids);}
第五步在消费者模块(jx-order模块)中引入对接到生产者模块(jx-mall)的方法

@FeignClient(value = "jingxi-mall")声音该消费者引用的是哪一个生产者模块(value中代码对应的是需要绑定的生产者在服务注册中心的名字)

需要注意是的不能加入@RequestMapping注解,否则会出现报错

该接口中的方法名,方法的Rest请求风格要和生产者中对应的方法对应

@FeignClient(value = "jingxi-mall")
public interface OpenFeignService {@GetMapping("/product/tb/{id}")Result<OpenFeignDto> getTypeById(@PathVariable("id") Integer id);@GetMapping("/product/tb/selectAll")public List<OpenFeignDto>  selectAll();@GetMapping("/product/tb/selectByIds")public List<OpenFeignDto>  selectAllByIds(@RequestParam Integer[] ids);}
生产者(ji-mall模块)中的方法
@Resourceprivate OpenFeignService openFeignService;@Resourceprivate JxCountService jxCountService;//分页查询排行榜(当日的榜单)@GetMapping("/selectAll")public List<TbProduct>  selectAll(){List<TbProduct> list = iTbProductService.getAll();return list;}

第六步,消费者模块调用

@RequestMapping("/order/sort")
public class OrderCountController {@Resourceprivate OpenFeignService openFeignService;@Resourceprivate JxCountService jxCountService;//分页查询排行榜(当日的榜单)@GetMapping("/countSort")public PageResponse getDto2(@RequestParam(required = false,defaultValue = "1") Integer pageNo,@RequestParam(required = false,defaultValue = "10") Integer pageSize){List<OpenFeignDto> openFeignDtos = openFeignService.selectAll();List<OrderCountDto> orderCountDtos = jxCountService.prepareSort(openFeignDtos);List<RedisOrderSort> list = jxCountService.queryToSortSum(orderCountDtos);
// 计算总页数int total = list.size();int pageCount = (total + pageSize - 1) / pageSize;// 计算起始索引int start = Math.max((pageNo - 1) * pageSize, 0);// 计算结束索引int end = Math.min(start + pageSize, total);// 获取当前页的数据List<RedisOrderSort> pageItems = list.subList(start, end);// 创建PageInfo对象PageInfo<RedisOrderSort> pageInfo = new PageInfo<>();pageInfo.setTotal(total);pageInfo.setPages(pageCount);pageInfo.setPageSize(pageSize);pageInfo.setPageNum(pageNo);pageInfo.setList(pageItems);pageInfo.setSize(pageItems.size());return PageResponse.suc(pageInfo);}

第七步,启动消费者和生产者模块

可以发现,该消费者模块已经可以成功嗲调用生产者模块中的.selectAll方法。

小结

通过集成 OpenFeign,Spring Cloud 应用可以方便地实现微服务之间的调用,简化了 REST 客户端的编写。结合服务发现、负载均衡等功能,能够显著提升微服务架构的开发效率和可靠性。在实际应用中,可以根据具体需求对 Feign 客户端进行定制化配置,以满足各种复杂的调用场景。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/329715.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Java 对外API接口开发 java开发api接口如何编写

Java API API&#xff08;Application Programming Interface&#xff09;是指应用程序编程接口&#xff0c;的JavaAPI是指JDK提供的各种功能的Java类 String类 String类的初始化&#xff1a; &#xff08;1&#xff09;使用字符串常量直接初始化 初始化&#xff1a;String s…

闲话 .NET(4):为什么要跨平台?

前言 .NET Core 有一个关键词就是跨平台&#xff0c;为什么要跨平台呢&#xff1f;Windows 操作系统不香吗&#xff1f;今天我们来聊聊这个 原因一&#xff1a;安全考虑 Windows OS 是闭源的&#xff0c;而 Linux 是开源的&#xff0c;因此有些公司的技术负责人就认为 Linux…

笔记:weblogic配置内存启动参数

可以在控制台配置 参数值 -Xms2048m -Xmx2048m -XX:PermSize512m -XX:MaxPermSize512m -Xss128k激活更改。修改完之后&#xff0c;节点需要重启才能生效。 参数说明&#xff1a; -Xms 为JVM启动时分配的内存 -Xmx 为JVM运行过程中分配的最大内存 -XX:PermSize 为JVM初始分配…

Qt笔记:动态处理多个按钮点击事件以更新UI

问题描述 在开发Qt应用程序时&#xff0c;经常需要处理多个按钮的点击事件&#xff0c;并根据点击的按钮来更新用户界面&#xff08;UI&#xff09;&#xff0c;如下图。例如&#xff0c;你可能有一个包含多个按钮的界面&#xff0c;每个按钮都与一个文本框和一个复选框相关联…

python从0开始学习(十二)

目录 前言 1、字符串的常用操作 2、字符串的格式化 2.1 格式化字符串的详细格式&#xff08;针对format形式&#xff09; ​编辑 总结 前言 上一篇文章我们讲解了两道关于组合数据类型的题目&#xff0c;本篇文章我们将学习新的章节&#xff0c;学习字符串及正则表达式。 …

react实现把pc网站快捷添加到桌面快捷方式

文章目录 1. 需求2. 实现效果3. 核心逻辑4. 完整react代码 1. 需求 这种需求其实在国外一些游戏网站和推广网站中经常会用到&#xff0c;目的是为了让客户 快捷方便的保存网站到桌面 &#xff0c;网站主动尽量避免下次找不到网站地址了&#xff0c;当然精确的客户自己也可以使…

打印安全:防止打印过程中的商业机密泄露

在数字化办公日益普及的今天&#xff0c;打印安全常常成为企业信息保护中被忽视的一环。商业机密在打印过程中泄露&#xff0c;可能会给企业带来巨大的损失。本文将探讨如何通过一系列措施&#xff0c;确保打印过程中的商业机密安全。 一、打印安全的重要性 打印设备作为企业中…

hbase版本从1.2升级到2.1 spark读取hive数据写入hbase 批量写入类不存在问题

在hbase1.2版本中&#xff0c;pom.xml中引入hbase-server1.2…0和hbase-client1.2.0就已经可以有如下图的类。但是在hbase2.1.0版本中增加这两个不行。hbase-server2.1.0中没有mapred包&#xff0c;同时mapreduce下就2个类。版本已经不支持。 <dependency><groupId>…

两步将 CentOS 6.0 原地升级并迁移至 RHEL 7.9

《OpenShift / RHEL / DevSecOps 汇总目录》 说明 本文介绍如何将一个 CentOS 6.0 的系统升级并转换迁移到 RHEL 7.9。 本文是《在离线环境中将 CentOS 7.X 原地升级并迁移至 RHEL 7.9》阶进篇。 所有被测软件的验证操作可参见上述前文中对应章节的说明。 准备 CentOS 6.…

数据量较小的表是否有必要添加索引问题分析

目录 前言一、分析前准备1.1、准备测试表和数据1.2、插入测试数据1.3、测试环境说明 二、具体业务分析2.1、单次查询耗时分析2.2、无索引并发查询服务器CPU占用率分析2.3、添加索引并发查询服务器CPU占用率分析 三、总结 前言 在一次节日活动我们系统访问量到达了平时的两倍&am…

SAP PRD覆盖QAS 替代方案构想

随着时间的推移&#xff0c;SAP PRD的数据跟QAS的差异会越来越大&#xff0c;一般是定期PRD覆盖QAS。但是在没有BASIS的情况下&#xff0c;没有这块经验的情况下&#xff0c;也没有外部支持的情况下&#xff0c;贸然做这个事情也是有风险的&#xff0c;有没有替代方案&#xff…

算法2:滑动窗口(上)

文章目录 长度最小子数组无重复字符的最长子串[最大连续 1 的个数III](https://leetcode.cn/problems/max-consecutive-ones-iii/description/)将x减到0的最小操作数 长度最小子数组 class Solution { public:int minSubArrayLen(int target, vector<int>& nums) {in…

vue3中基于element-plus封装一个表格弹框组件,要求可以单选和多选table数据

单选&#xff1a; <template><SelectMaterialref"selectMaterialRef"check"checkbox"select"selectMaterial"></SelectMaterial><el-button type"primary" size"small" icon"el-icon-plus"…

Web API——获取DOM元素

目录 1、根据选择器来获取DOM元素 2.、根据选择器来获取DOM元素伪数组 3、根据id获取一个元素 4、通过标签类型名获取所有该标签的元素 5、通过类名获取元素 目标&#xff1a;能查找/获取DOM对象 1、根据选择器来获取DOM元素 语法&#xff1a; document.querySelector(css选择…

RedisTemplate操作Redis, 看这一篇文章就够了

文章目录 1. String 命令1.1 添加缓存1.2 设置过期时间(单独设置)1.3 获取缓存值1.4 删除key1.5 顺序递增1.6 顺序递减1.7 常用的 2. Hash命令2.1 添加缓存2.2 设置过期时间(单独设置)2.3 添加一个Map集合2.4 提取所有的小key2.5 提取所有的value值2.6 根据key提取value值2.7 获…

C语言-牛客-实现四舍五入

欢迎来到Harper.Lee的学习小世界&#xff01; 博主主页传送门&#xff1a;Harper.Lee的博客主页 想要一起进步的uu欢迎来后台找我哦&#xff01; 本篇博客总结C语言刷题的相关笔记~~~~ #牛客–实现四舍五入 题目描述&#xff1a;随机输入浮点数&#xff0c;输出四舍五入后的整数…

vue中数据已经改变了,但是table里面内容没更新渲染!

解决方案&#xff1a; 给table或者el-table标签上添加一个动态key值&#xff0c;只要数据发生改变&#xff0c;key值变动一下即可 标签上&#xff1a; :key“timeStamp” 初始data&#xff1a;timeStamp:0, 更新数据&#xff1a;this.timeStamp 这样每次更新数据&#xff…

【B站 heima】小兔鲜Vue3 项目学习笔记Day03

文章目录 Home1.Home整体结构搭建和分类实现2. banner轮播图功能3. Home 面板组件封装4.新鲜好物和人气推荐实现5. 图片懒加载指令实现6. Home- product产品列表实现7. Home-GoodsItem 组件封装 一级路由1. 整体认识和路由配置2. 面包屑导航3. 一级分类 - 轮播图的实现4. 激活状…

2024年5月天润融通JAVA二面15-20K

二面 1、聊项目 2、举例说明你在上家公司职级晋升的原因 3、开发者和管理者的区别&#xff0c;你怎么做管理者 4、对sass的理解&#xff0c;包括流程&#xff0c;技术选型 5、springboot如何把bean加载到ioc容器中&#xff0c;ioc容器的理解 6、一万个任务同时执行&#…

内网安全之搭建ADCS证书服务

在域控上安装ADCS服务时&#xff0c;默认会自动配置完LDAPS&#xff0c;如果不是在域控上安装ADCS服务&#xff0c;需要手动配置LDAPS 安装证书服务ADCS 打开服务器管理器——>添加角色和功能 选择“基于角色或基于功能的安装”选项&#xff0c;然后点击下一步 选择“从…