【微服务】Feign实现远程调用和负载均衡
目录
1.什么是Feign
2 订单微服务集成Feign
2.1.引入依赖
2.2添加注解
2.3编写Feign的客户端
2.4修改OrderServiceImpl.java的远程调用方法
2.5重启订单服务,并验证
总结
1.什么是Feign
2 订单微服务集成Feign
/*** Created by mxin5*/
@SpringBootApplication
@EnableDiscoveryClient
@EnableFeignClients
public class OrderServer {public static void main(String[] args) {SpringApplication.run(OrderServer.class,args);}/*** 远程调用通过resttemplate进行调用,直接进行bean的注入,那个业务需要直接autowired进行注入* @LoadBalanced就可以实现负载均衡,原理就是一个标记,标记Resttemplate发出的请求要被我们的Ribbon进行拦截和处理* */@LoadBalanced@Beanpublic RestTemplate restTemplate(){return new RestTemplate();}
} String url = "http://product-service/product/"+productId;Product product = restTemplate.getForObject(url,Product.class); 存在下面的问题:
-
代码可读性差,编程体验不统一
-
参数复杂URL难以维护
所以就采用feign来代替RestTemplate,采用接口的方式进行远程调用和负载均衡。
Fegin的使用步骤如下:
2.1.引入依赖
在shop-order-server项⽬的pom⽂件加⼊Fegin的依赖
<!--fegin组件--><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-openfeign</artifactId></dependency> 2.2添加注解
在启动类OrderServer.java上添加Fegin的扫描注解,注意扫描路径(默认扫描当前包及其⼦包)
/*** Created by mxin5*/
@SpringBootApplication
@EnableDiscoveryClient
@EnableFeignClients
public class OrderServer {public static void main(String[] args) {SpringApplication.run(OrderServer.class,args);}/*** 远程调用通过resttemplate进行调用,直接进行bean的注入,那个业务需要直接autowired进行注入* @LoadBalanced就可以实现负载均衡,原理就是一个标记,标记Resttemplate发出的请求要被我们的Ribbon进行拦截和处理* */
// @LoadBalanced
// @Bean
// public RestTemplate restTemplate(){
// return new RestTemplate();
// }
} 2.3编写Feign的客户端
在shop-order-server项⽬中新增接⼝ProductFeignApi
/*** Created by mxin5* name的名称一定要和订单服务的服务名保持一致,fallback表示调用失败时的兜底策略* 谁是主调用者谁就集成feign*/
@FeignClient(name = "product-service")
public interface ProductFeignApi {//跟product-service中的controller的接口一致@GetMapping("/product/{pid}")public Product findByPid(@PathVariable("pid") Long pid);
} @GetMapping("/product/{pid}")public Product findByPid(@PathVariable("pid") Long pid) {...} 这个客户端主要是基于SpringMVC的注解来声明远程调用的信息,比如:
服务名称:product-service
请求方式:GET
请求路径:/product/{pid}
请求参数:Long pid
返回值类型:Product
这样,Feign就可以帮助我们发送http请求,无需自己使用RestTemplate来发送了。
2.4修改OrderServiceImpl.java的远程调用方法
package cn.wolfcode.service.impl;import cn.wolfcode.dao.OrderDao;
import cn.wolfcode.domain.Order;
import cn.wolfcode.domain.Product;
import cn.wolfcode.feign.ProductFeignApi;
import cn.wolfcode.service.OrderService;
import com.alibaba.fastjson.JSON;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;@Service
@Slf4j //日志
public class OrderServiceImpl implements OrderService {@Autowiredprivate OrderDao orderDao;@Autowiredprivate ProductFeignApi productFeignApi;//以前的远程调用的方式
// @Autowired
// private RestTemplate restTemplate;@Overridepublic Order createOrder(Long productId, Long userId) {log.info("接收到{}号商品的下单请求,接下来调用商品微服务查询此商品信息", productId);/*** 以前的方式通过Resttemplate进行调用* 问题:1端口号和服务器修改了又要重新进行修改和重启* 2使用集群的方式的话要实现负载均衡,要不断的进行修改,服务器上下线无法感知* 这样就可以使用Springcloud的负载均衡组件feign和注册中心组件nacos* */
// String url = "http://localhost:8081/product/"+productId;
// String url = "http://product-service/product/"+productId; //ribbon实现远程调用和负载均衡//直接传入地址和实体类字节码文件(转成什么对象)进行获取
// Product product = restTemplate.getForObject(url,Product.class);/** 远程调用商品微服务,查询商品信息,通过feign进行调用,并采用负载均衡的方式openfeign直接省略了在启动类进行注入resttemplate的bean,直接调用的时候会将携带服务名去获取本地缓存的服务列表,然后采用轮询或其他负载均衡算法去选择一个可用的服务进行调用*/Product product = productFeignApi.findByPid(productId);log.info("查询到{}号商品的信息,内容是:{}", productId, JSON.toJSONString(product));//创建订单并保存Order order = new Order();order.setUid(userId);order.setUsername("mxin5");order.setPid(productId);order.setPname(product.getPname());order.setPprice(product.getPprice());order.setNumber(1);orderDao.save(order);log.info("创建订单成功,订单信息为{}", JSON.toJSONString(order));return order;}
} 2.5重启订单服务,并验证
SpringCloud应用在启动时,Feign会扫描标有@FeignClient注解的接口,生成代理(所以我们并不需要编写接口实现类),并注册到Spring容器中。
总结
使用Feign的步骤:
① 引入依赖
② 添加@EnableFeignClients注解
③ 编写FeignClient接口
④ 使用FeignClient中定义的方法代替RestTemplate
相关文章:
【微服务】Feign实现远程调用和负载均衡
目录 1.什么是Feign 2 订单微服务集成Feign 2.1.引入依赖 2.2添加注解 2.3编写Feign的客户端 2.4修改OrderServiceImpl.java的远程调用方法 2.5重启订单服务,并验证 总结 1.什么是Feign Feign是Spring Cloud提供的⼀个声明式的伪Http客户端, 它…...
Windows使用QEMU搭建arm64 ubuntu 环境
1. 下载 QEMU: https://qemu.weilnetz.de/w64/ QEMU UEFI固件文件: https://releases.linaro.org/components/kernel/uefi-linaro/latest/release/qemu64/QEMU_EFI.fd arm64 Ubuntu镜像: http://cdimage.ubuntu.com/releases/20.04.3/rel…...
NodeJS安装
一、简介Node.js是一个让JavaScript运行在服务端的开发平台,Node.js不是一种独立的语言,简单的说 Node.js 就是运行在服务端的 JavaScript。npm其实是Node.js的包管理工具(package manager),类似与 maven。二、安装步骤…...
Gin 优雅打印请求与回包内容
文章目录1.Gin 的 Middleware2.使用 Middleware 打印请求与回包内容3.多次读取请求 Body 的问题4.多次读取响应 Body 的问题5.小结参考文献在开发 Web 应用程序时,难免不会遇到功能或性能等问题。为了快速定位问题,需要打印请求和响应的内容。本文将介绍…...
关于k8s中ETCD集群备份灾难恢复的一些笔记
写在前面 集群电源不稳定,或者节点动不动就 宕机,一定要做好备份,ETCD 的快照文件很容易受影响损坏。重置了很多次集群,才认识到备份的重要博文内容涉及 etcd 运维基础知识了解静态 Pod 方式 etcd 集群灾备与恢复 Demo定时备份的任务编写二进…...
【设计模式之美 设计原则与思想:设计原则】19 | 理论五:控制反转、依赖反转、依赖注入,这三者有何区别和联系?
关于 SOLID 原则,我们已经学过单一职责、开闭、里式替换、接口隔离这四个原则。今天,我们再来学习最后一个原则:依赖反转原则。在前面几节课中,我们讲到,单一职责原则和开闭原则的原理比较简单,但是&#x…...
2023年全国最新高校辅导员精选真题及答案13
百分百题库提供高校辅导员考试试题、辅导员考试预测题、高校辅导员考试真题、辅导员证考试题库等,提供在线做题刷题,在线模拟考试,助你考试轻松过关。 一、单选题 131.下列不属于我国国土空间具有的特点的是() A.水资…...
【XXL-JOB】XXL-JOB定时处理视频转码
【XXL-JOB】XXL-JOB定时处理视频转码 文章目录【XXL-JOB】XXL-JOB定时处理视频转码1. 准备工作1.1 高级配置1.2 分片广播2. 需求分析2.1 作业分片方案2.2 保证任务不重复执行2.2.1 保证幂等性3. 视频处理业务流程3.1 添加待处理任务3.2 查询待处理任务3.3 更新任务状态3.4 工具…...
optuna用于pytorch的轻量级调参场景和grid search的自定义设计
文章目录0. 背景:why optuna0.1 插播一个简单的grid search0.2 参考1. Optuna1.1 a basic demo与部分参数释义1.2 random的问题1.3 Objective方法类2. Optuna与grid search4. optuna的剪枝prune5. optuna与可视化6. 未完待续0. 背景:why optuna 小模型参…...
语法篇--汇编语言先导浅尝
一、相关概念 1.机器语言 机器语言(Machine Language)是一种计算机程序语言,由二进制代码(0和1)组成,可被计算机直接执行。机器语言是计算机硬件能够理解和执行的唯一语言。 机器语言通常由一系列的指令组…...
【ID:17】【20分】A. DS顺序表--类实现
时间限制1秒内存限制128兆字节题目描述用C语言和类实现顺序表属性包括:数组、实际长度、最大长度(设定为1000)操作包括:创建、插入、删除、查找类定义参考输入第1行先输入n表示有n个数据,即n是实际长度;接着输入n个数据…...
【java web篇】Tomcat的基本使用
📋 个人简介 💖 作者简介:大家好,我是阿牛,全栈领域优质创作者。😜📝 个人主页:馆主阿牛🔥🎉 支持我:点赞👍收藏⭐️留言Ὅ…...
MySQL实战解析底层---行锁功过:怎么减少行锁对性能的影响
目录 前言 从两阶段锁说起 死锁和死锁检测 前言 MySQL 的行锁是在引擎层由各个引擎自己实现的但并不是所有的引擎都支持行锁,比如MyISAM 引擎就不支持行锁不支持行锁意味着并发控制只能使用表锁,对于这种引擎的表,同一张表上任何时刻只能有…...
初识STM32单片机
目录 初识STM32单片机 什么是单片机? STM系列单片机命名规则 STM32F103C8T6单片机简介 标准库与HAL库区别 通用输入输出端口GPIO 什么是GPIO? 定义 命名规则 内部框架图 推挽输出与开漏输出 如何点亮一颗LED灯 编程实现点灯 按键点亮LED灯…...
数据结构与算法系列之单链表
💗 💗 博客:小怡同学 💗 💗 个人简介:编程小萌新 💗 💗 如果博客对大家有用的话,请点赞关注再收藏 🌞 这里写目录标题test.hSList.h注意事项一级指针与二级指针的使用assert的使用空…...
MySQL基础
本单元目标 一、为什么要学习数据库 二、数据库的相关概念 DBMS、DB、SQL 三、数据库存储数据的特点 四、初始MySQL MySQL产品的介绍 MySQL产品的安装 ★ MySQL服务的启动和停止 ★ MySQL服务的登录和退出 ★ MySQL的常见命令和语法规范 五、…...
面试热点题:环形链表及环形链表寻找环入口结点问题
环形链表 问题: 给你一个链表的头节点 head ,判断链表中是否有环。 如果链表中有某个节点,可以通过连续跟踪 next 指针再次到达,则链表中存在环。 为了表示给定链表中的环,评测系统内部使用整数 pos 来表示链表尾连接…...
【算法】DFS与BFS
作者:指针不指南吗 专栏:算法篇 🐾题目的模拟很重要!!🐾 文章目录1.区别2.DFS2.1 排列数字2.2 n-皇后问题3.BFS3.1走迷宫1.区别 搜索类型数据结构空间用途过程DFSstackO( n )不能用于最短路搜索到最深处&a…...
湖州银行冲刺A股上市:计划募资约24亿元,资产质量水平较高
3月4日,湖州银行股份有限公司(下称“湖州银行”)递交招股书,准备在上海证券交易所主板上市。本次冲刺上市,湖州银行计划募资23.98亿元,将在扣除发行费用后全部用于补充该行资本金。 湖州银行在招股书中表示…...
高性能网络I/O框架-netmap源码分析
前几天听一个朋友提到这个netmap,看了它的介绍和设计,确实是个好东西。其设计思想与业界不谋而合——因为为了提高性能,几个性能瓶颈放在那里,解决方法自然也是类似的。 netmap的出现,它既实现了一个高性能的网络I/O框…...
深入理解SAP RAP中的语义依赖:从/DMO测试数据看BTP应用的数据建模精髓
解密SAP RAP语义依赖:从/DMO测试数据到企业级数据建模实战 在SAP BTP应用开发领域,数据建模的质量直接决定了系统的健壮性和可维护性。当我们在/DMO/CONNECTION表开发中遇到"DISTANCE字段具有单位量转换和EDM类型int32"的元数据错误时…...
springboot+vue基于web的在线学习资源推荐的设计与实现
目录功能模块分析推荐系统功能交互功能设计后台管理功能技术实现要点项目技术支持源码获取详细视频演示 :文章底部获取博主联系方式!同行可合作功能模块分析 用户管理模块 用户注册与登录:支持邮箱/手机号注册,提供密码找回功能…...
Phi-3-mini-4k-instruct-gguf实操手册:短问答/改写/摘要三大高频场景落地
Phi-3-mini-4k-instruct-gguf实操手册:短问答/改写/摘要三大高频场景落地 1. 模型简介与核心能力 Phi-3-mini-4k-instruct-gguf是微软推出的轻量级文本生成模型,基于Phi-3系列优化而来。这个GGUF版本特别适合处理短文本任务,具有以下特点&a…...
别再让Jetson NX的CPU跑视频了!手把手教你用FFmpeg+NVENC实现硬件编解码(附4.2版本完整编译流程)
Jetson NX视频处理性能优化实战:FFmpegNVENC硬件加速全解析 如果你正在使用Jetson Xavier NX开发视频处理应用,却苦于CPU软编解码的低效表现,这篇文章将为你揭示如何彻底释放这块嵌入式AI计算板的硬件潜能。我们将从性能瓶颈分析开始…...
从电子管到全固态:中波广播发射机核心技术演进与选型指南
1. 中波广播发射机的前世今生 第一次见到中波发射机是在十年前参观某省级广播电台时,那座两层楼高的电子管设备让我印象深刻——嗡嗡作响的风扇、散发着热量的金属外壳、闪烁着微光的电子管,活像科幻电影里的场景。如今这种"大家伙"已经逐渐被…...
别再死记硬背了!用这5个真实运维脚本,搞定90%的Shell面试题
5个实战Shell脚本:从面试题到真实运维场景的蜕变 在技术面试中,Shell脚本能力往往是区分普通候选人和优秀候选人的关键指标。但死记硬背面试题答案的时代已经过去,现代企业更看重候选人解决实际问题的能力。本文将带你通过5个真实运维场景中的…...
dexcount-gradle-plugin最佳实践:提升Android应用性能的10个技巧
dexcount-gradle-plugin最佳实践:提升Android应用性能的10个技巧 【免费下载链接】dexcount-gradle-plugin A Gradle plugin to report the number of method references in your APK on every build. 项目地址: https://gitcode.com/gh_mirrors/de/dexcount-grad…...
OpenLara最佳实践:开发高质量游戏引擎的10个关键原则
OpenLara最佳实践:开发高质量游戏引擎的10个关键原则 【免费下载链接】OpenLara Classic Tomb Raider open-source engine 项目地址: https://gitcode.com/gh_mirrors/op/OpenLara OpenLara作为一款经典古墓丽影开源引擎,凭借跨平台设计和高效渲染…...
别再只用命令行!华为防火墙USG6000V的Web界面到底怎么玩?eNSP实战演示
华为USG6000V防火墙Web界面高效操作指南:从CLI到图形化的思维转换 对于习惯了命令行操作的老牌网络工程师来说,第一次接触华为USG6000V防火墙的Web管理界面时,往往会陷入一种矛盾心理——既惊叹于可视化操作的直观,又担心图形化界…...
Mask2Former性能对比分析:R50到Swin-L各主干网络的优劣选择
Mask2Former性能对比分析:R50到Swin-L各主干网络的优劣选择 【免费下载链接】Mask2Former Code release for "Masked-attention Mask Transformer for Universal Image Segmentation" 项目地址: https://gitcode.com/gh_mirrors/ma/Mask2Former Ma…...
