(超详细)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.mzph.cn/web/16620.shtml

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

相关文章

AI大模型探索之路-实战篇4:深入DB-GPT数据应用开发框架调研

目录 前言一、DB-GPT总体概述二、DB-GPT关键特性1、私域问答&数据处理&RAG2、多数据源&GBI3、多模型管理4、自动化微调5、Data-Driven Multi-Agents&Plugins6、隐私安全 三、服务器资源准备1、创建实例2、打开jupyterLab 四、DB-GPT启动1、激活 conda 环境2、切…

docker安装etcd

1.查找etcd镜像 docker search etcdNAME: 镜像仓库源的名称 DESCRIPTION: 镜像的描述 STARS: 类似 Github 里面的 star&#xff0c;表示点赞、喜欢的意思。 OFFICIAL: 是否 docker 官方发布 2.拖取镜像并生成对应容器 docker run --name etcd -d -p 2379:2379 -p 2380:2380 …

MyBatis懒加载数据(大批量数据处理)

使用范例 Cursor约定使用Iterator去懒加载数据&#xff0c;以时间换空间&#xff0c;非常适合处理通常无法容纳在内存中的数百万个项目查询。如果在 resultMap 中使用集合&#xff0c;则必须使用 resultMap 的 id 列对游标 SQL 查询进行排序(resultOrdered“true”)。 //为了避…

校园一体式气象站功能特点与应用

TH-XQ4随着教育理念的更新和科技的发展&#xff0c;校园一体式气象站在现代校园中的应用越来越广泛。它不仅为学生提供了实时、准确的气象数据&#xff0c;还成为了推动科学教育、培养学生实践能力和环保意识的重要工具。本文将从功能、特点和应用三个方面对校园一体式气象站进…

Python学习---利用Python操作数据库

如何理解连接connection和游标 cursor&#xff1f; connection就像是连接出发地和目的地的高速公路cursor就像是在高速公路上的货车-拉货我们使用游标就可以完成对数据的操作当我们完成操作完成后就可以停下货车&#xff0c;然后公路再停止使用。 pysql实现查询 ""…

WEB--基本了解

1.Typical Features of Web Applications The client (or user interface) runs in a web browser. 客户端(或用户界面)在web浏览器中运行。 Part of the application runs on a server, i.e. it isn’t a standalone application. 应用程序的一部分在服务器上运行&#xf…

【MySQL精通之路】SQL优化(1)-查询优化(9)-外部联接优化

主博客&#xff1a; 【MySQL精通之路】SQL优化(1)-查询优化-CSDN博客 上一篇&#xff1a; 【MySQL精通之路】SQL优化(1)-查询优化(8)-嵌套联接优化-CSDN博客 下一篇&#xff1a; 【MySQL精通之路】SQL优化(1)-查询优化(10)-外部联接简化-CSDN博客 外部联接包括LEFT JOIN和…

使用微信开发者工具真机调试的时候总是提示“tapShareButton WebviewId: xxxxx not foun ”

提示 机型 Android手机 调试型号 真机调试1.0 问题解决 由于真机调试1.0版本属于稳定版本&#xff0c;但是没想到会出现这个问题&#xff0c;所以想要解决真机调试的时候点击转发按钮调用 onShareAppMessage 方法的时候需要将真机调试切换至2.0版本。 onShareAppMessage 方…

【八股系列】为什么会有webpack配置?webpack的构建流程是什么?

文章目录 1. webpack是什么&#xff1f;2. 为什么需要webpack&#xff1f;3. webpack构建原理4. 构建流程通常包括以下步骤5. Webpack构建流程图 1. webpack是什么&#xff1f; Webpack是一个模块打包工具&#xff0c;它可以将项目中的各种静态资源&#xff0c;如JavaScript、…

JavaScript 新特性:新增声明命令与解构赋值的强大功能

个人主页&#xff1a;学习前端的小z 个人专栏&#xff1a;JavaScript 精粹 本专栏旨在分享记录每日学习的前端知识和学习笔记的归纳总结&#xff0c;欢迎大家在评论区交流讨论&#xff01; ES5、ES6介绍 文章目录 &#x1f4af;声明命令 let、const&#x1f35f;1 let声明符&a…

【人工智能】数据分析与机器学习——泰坦尼克号(更新中)

1912年4月15日&#xff0c;泰坦尼克号在首次航行期间撞上冰山后沉没&#xff0c;船上共有2224名乘客和乘务人员&#xff0c;最终有1502人遇难。沉船导致大量伤亡的重要原因之一是&#xff0c;没有足够的救生艇给乘客和船员。虽然从这样的悲剧性事故中幸存下来有一定的运气因素&…

Flink任务自动恢复脚本

线上环境经常遇到flink任务挂掉得问题&#xff0c;这里写一个自动恢复脚本 # 我这里使用得datastream api编写的任务&#xff0c;类class路径 MAIN_CLASS"com.flink.job.CommonFlinkStreamJob" # 我的代码包 JAR_PATH"/home/dev/flink/lib/flink-cdc-1.0.jar&q…

微信小程序进阶(1)--自定义组件

自定义组件 1.1 什么是自定义组件 开发文档&#xff1a;https://developers.weixin.qq.com/miniprogram/dev/framework/custom-component/ 小程序中常常会有些通用的交互模块&#xff0c;比如&#xff1a;下拉选择列表、搜索框、日期选择器等&#xff1b;这些界面交互模块可…

C-数据结构-动态库

/* 动态库基本实现 libxx.so xx是库名 .so 后缀 gcc -shared -fpic -o libxx.so yyy.c发布到 /usr/local/include/ /usr/local/lib在 /etc/ld.so.conf 中添加路径 /sbin/ldconfig 重读 /etc/ld.so.conf 为了上面的步骤生效 gcc -I/usr/local/include -L/usr/local/…

数据挖掘案例-航空公司客户价值分析

文章目录 1. 案例背景2. 分析方法与过程2.1 分析流程步骤2.2 分析过程1. 数据探索分析2. 描述性统计分析3. 分布分析1.客户基本信息分布分析2. 客户乘机信息分布分析3. 客户积分信息分布分析 4. 相关性分析 3. 数据预处理3.1 数据清洗3.2 属性约束3. 3 数据转换 4. 模型构建4. …

spring 指定bean id 来加载相同类名 不同包路径的bean 并使用set方法注入

业务场景&#xff0c;数据源可能是mysql也可能是impala。在mapper层级方法都是一样的。所以抽象出来一个父接口&#xff0c;再分别用mysql包下面的一个mapper和一个impala包mapper接口分别继承它。注意这俩mapper的beanid要区分开。 使用&#xff1a;首先有两个bean在不同的包…

超融合架构下,虚拟机高可用机制如何构建?

作者&#xff1a;SmartX 产品部 钟锦锌 虚拟机高可用&#xff08;High Availability&#xff0c;简称 HA&#xff09;是虚拟化/超融合平台最常用、关键的功能之一&#xff0c;可在服务器发生故障时通过重建业务虚拟机以降低故障对业务带来的影响。因此&#xff0c;为了充分保障…

ubuntu22.04下 easyconnect+输入法安装

先使用对应ubuntu版本的easyconnect安装 sudo dpkg -i EasyConnect_x64_7_6_7_3.deb 下载压缩包servicePack&#xff0c;并解压缩 cd 下载路径/servicePack sudo cp * /usr/share/sangfor/EasyConnect/ 打开easyConnect /usr/share/sangfor/EasyConnect/EasyConnect 此处…

pid中的d到底是什么意思?微分到底是用来做什么的,什么情况下用,避免入坑实际案例中的使用-----------PDI中的D阻尼调节

1,PID中表示的含义是什么? 比例&#xff08;proportional&#xff09;&#xff1a;放大比例-------表示现在 0.2 积分&#xff08;integral&#xff09;&#xff1a;误差积分------过去 0.04 微分 &#xff08;derivative&#xff09;&#xff1a;阻尼 ------未来 0.002 在调节…