SpringCloud之feign

feign的使用

    • 一、概述
    • 二、feign的使用流程
      • 2.1 在pom文件中添加依赖
      • 2.2 feign的配置
        • 2.2.1 修改日志级别
          • 2.2.1.1 在yml中配置
          • 2.2.1.2 在代码中写配置类
        • 2.2.2 响应结果解析器
        • 2.2.3 请求参数编码
        • 2.2.4 支持的注解格式
        • 2.2.5 失败的重试机制
      • 2.3 Nacos支持Feign,可以直接在接口基础上实现负载均衡效果

一、概述

Feign是一个声明式HTTP客户端,它使HTTP API请求变得更简单和更优雅。它基于注解,在创建动态代理时解析接口方法,并将其映射到HTTP请求。我们只需要编写Java接口并添加注解,就可以轻松地使用Feign处理HTTP请求。
SpringCloud对Feign进行了增强,使Feign支持了SpringMVC注解,并整合了Ribbon和Eureka,从而让Feign的使用更加方便。
Feign还提供了可插拔的编码器和解码器,以将Java对象转换为HTTP请求、响应和错误

二、feign的使用流程

2.1 在pom文件中添加依赖

当模块A要调用模块B的方法时,要在调用者中加入Feign的依赖,要在调用者的启动类上添加注解 @EnableFeignClients

<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>

2.2 feign的配置

2.2.1 修改日志级别

feign.Logger.Level : 包含四种不同的级别:NONE、BASIC、HEADERS、FULL

NONE:没有任何日志,也是默认配置;BASIC:可以记录http请求什么时候发送,什么时候结束,耗时多久等基本信息;HEADERS:除了BASIC中含有的以外,还包含请求头和响应头; FULL:是最全面的,除了HEADERS中包含的以外,还包含请求体信息和响应体信息。
2.2.1.1 在yml中配置
feign:  client:config: userservice: # 针对某个微服务的配置#default: # 这里用default就是全局配置,如果是写服务名称,则是针对某个微服务的配置loggerLevel: FULL #  日志级别 
2.2.1.2 在代码中写配置类
public class DefaultFeignConfiguration {@Beanpublic Logger.Level logLevel(){return Logger.Level.BASIC;}
}

想要局部生效时,就在Feign的具体的接口上的注解上添加configuration = FeignConfiguration.class

@FeignClient(value = "userservice",configuration = DefaultFeignConfiguration.class)
public interface TopoClient {/*** 获取关联拓扑* @param param* @return*/@PostMapping("/api/topo/cmnet/getSerchCmNetTopo")public BTopo getSerchCmNetTopo(@RequestBody QueryRelParam param);
}

全局生效,在启动类添加EnableFeignClients注解 设置defaultConfiguration 属性;如果只有一个client可以使用clients=类.class,如果多个可以直接扫包

@EnableFeignClients(basePackages = {"com.softwaregroup.communication.topo"}, defaultConfiguration = DefaultFeignConfiguration.class)
2.2.2 响应结果解析器

feign.codec.Decoder: http远程调用的结果做解析,例如解析json字符串为java对象

2.2.3 请求参数编码

feign.codec.Encoder: 将请求参数编码,便于通过http请求发送

2.2.4 支持的注解格式

feign. Contract : 默认是SpringMVC的注解

2.2.5 失败的重试机制

feign. Retryer : 请求失败的重试机制,默认是没有,不过会使用Ribbon的重试

2.3 Nacos支持Feign,可以直接在接口基础上实现负载均衡效果

微服务名称:nrms-topo-ip

启动项目主类

@SpringCloudApplication
@EnableDiscoveryClient
@EnableFeignClients(basePackages = {"com.softwaregroup.communication.topo"})@Slf4j
public class TopoDataPluginDataNetwork {
}

CmNetClientFeign

@FeignClient(name = "nrms-topo-cmnet",configuration = FeignClientsConfiguration.class)
public interface CmNetClientFeign {/*** 获取关联拓扑* @param param* @return*/@PostMapping("/api/topo/getSerchTopo")public BTopo getSerchTopo(@RequestBody QueryRelParam param);}

注意!

因为我们大部分项目都需要进行权限认证,当接口调用别的微服务接口时,也需要把请求头传过去可以通过Interceptor(拦截器)实现

/*** @author:  zhang* @date:  Created in 2024/7/9 20:24* 文件说明:  <p>Feign 调用增强请求头,防止登录信息无法传递而被服务拦截*/
@Component
public class FeignInterceptor implements RequestInterceptor {@Overridepublic void apply(RequestTemplate requestTemplate) {//获取客户端访问的请求ServletRequestAttributes requestAttributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();if(requestAttributes != null){HttpServletRequest request = requestAttributes.getRequest();if (request != null) {String cookie = request.getHeader("Cookie");String token = request.getHeader("Authorization");//同步到 feign 请求中requestTemplate.header("Cookie", cookie);requestTemplate.header("Authorization", token);return;}}}
}

调用CmNetClientFeign 接口

在控制层中引入cmNetClientFeign便可以直接通过cmNetClientFeign调用另一个微服务的接口@Resourceprivate CmNetClientFeign cmNetClientFeign;

具体实现控制层

该微服务名:nrms-topo-cmnet

@RestController
@RequestMapping("/api")
@Slf4j
public class CmNetController {@PostMapping("/topo/getSerchTopo")public BTopo getSerchCmNetTopo(@RequestBody QueryRelParam param) {return cmNetService.getSerchCmNetTopo(param);}
}

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

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

相关文章

前端web开发HTML+CSS3+移动web(0基础,超详细)——第1天

一、开发坏境的准备 1&#xff0c;在微软商店下载并安装VS Code 以及谷歌浏览器或者其他浏览器&#xff08;我这里使用的是Microsoft Edge&#xff09; 2&#xff0c;打开vs code &#xff0c;在电脑桌面新建一个文件夹命名为code&#xff0c;将文件夹拖拽到vs code 中的右边…

空气处理机组系统中的设计和选型参考

1、静压的选择&#xff1a; 1.机组所承受的正压值和负压值既不是指机组的机外静压&#xff0c;也不是指风机的压头&#xff0c;而是指机组内部与机组外部大气压的差值&#xff0c;具体的计算方法如下&#xff1a; 如图所示&#xff0c;机组的新、回、送风管阻力分别为A、B、C帕…

【轨物方案】开关柜在线监测物联网解决方案

随着物联网技术的发展&#xff0c;电力设备状态监测技术也得到了迅速发展。传统的电力成套开关柜设备状态监测方法主要采用人工巡检和定期维护的方式&#xff0c;这种方法不仅效率低下&#xff0c;而且难以保证设备的实时性和安全性。因此&#xff0c;基于物联网技术的成套开关…

Qt自定义MessageToast

效果&#xff1a; 文字长度自适应&#xff0c;自动居中到parent&#xff0c;会透明渐变消失。 CustomToast::MessageToast(QS("最多添加50张图片"),this);1. CustomToast.h #pragma once#include <QFrame>class CustomToast : public QFrame {Q_OBJECT pub…

图——“多对多”的逻辑结构

目录 1.什么是图&#xff1f; 图包含&#xff1a; 2.图的基本术语 无向图&#xff1a; 有向图&#xff1a; 权重&#xff1a;边上的数字 度&#xff1a; 邻接点&#xff1a; 完全图&#xff1a; 3.图的抽象数据类型定义 4.怎么在程序中表示一个图&#xff1f; 邻接矩…

Java的日期类

1.第一代日期类 ① Date类&#xff1a;精确到毫秒&#xff0c;代表特定的瞬间 public static void main(String[] args) { // 获取当前系统时间 // 这里的Date类是在java.util包 // 默认输出的格式是国外的格式Date date new Date();System.out.println…

C#体检系统源码,医院健康体检系统PEIS,C#+VS2016+SQLSERVER

体检中心/医院体检科PEIS系统源码&#xff0c;C#健康体检信息系统源码&#xff0c;PEIS源码 开发环境&#xff1a;C/S架构C#VS2016SQLSERVER 2008 检前&#xff1a; 多种预约方式网站预约、电话预约、微信平台预约及检前沟通&#xff0c;提前制作套餐&#xff0c;客人到达体检…

【原创】java+ssm+mysql医生信息管理系统设计与实现

个人主页&#xff1a;程序员杨工 个人简介&#xff1a;从事软件开发多年&#xff0c;前后端均有涉猎&#xff0c;具有丰富的开发经验 博客内容&#xff1a;全栈开发&#xff0c;分享Java、Python、Php、小程序、前后端、数据库经验和实战 开发背景&#xff1a; 随着信息技术的…

【七】Hadoop3.3.4基于ubuntu24的分布式集群安装

文章目录 1. 下载和准备工作1.1 安装包下载1.2 前提条件 2. 安装过程STEP 1: 解压并配置Hadoop选择环境变量添加位置的原则检查环境变量是否生效 STEP 2: 配置Hadoop2.1. 修改core-site.xml2.2. 修改hdfs-site.xml2.3. 修改mapred-site.xml2.4. 修改yarn-site.xml2.5. 修改hado…

【Linux从青铜到王者】tcp协议2

滑动窗口 滑动窗口是什么 上篇提到如果两端发送数据如果是一发一收那就是串行&#xff0c;效率很低&#xff0c;所以可以一次发送多个报文&#xff0c;一次也可以接受多个报文&#xff0c;可以大大的提高性能(其实是将多个段的等待时间重叠在一起了&#xff09; 那么是怎么发…

解锁人工智能学习中的数学密钥

一、启航&#xff1a;奠定数学基础 1. 线性代数&#xff1a;AI的入门语言 学习目标&#xff1a;掌握向量、矩阵的基本概念及运算&#xff0c;理解线性空间、线性变换及特征值、特征向量的意义。学习建议&#xff1a;从基础教材入手&#xff0c;如《线性代数及其应用》&#x…

【黄啊码】零代码动手创建ModelScope Agent

还没开始学习&#xff0c;先来回复一下&#xff0c;什么是Agent Agent包含的模块 好了&#xff0c;开始发放干货&#xff1a; 1、创建通义千问API (新注册用户有一定的限时免费额度) 2、登录阿里云账号&#xff0c;打开 DashScope管理控制台&#xff0c;开通 DashScope灵积模…

WinUI vs WPF vs WinForms: 三大Windows UI框架对比

1.前言 在Windows平台上开发桌面应用程序时&#xff0c;WinUI、WPF和WinForms是三种主要的用户界面框架。每种框架都有其独特的特点和适用场景。本文将通过示例代码&#xff0c;详细介绍这些框架的优缺点及其适用场景&#xff0c;帮助dotnet桌面开发者更好地选择适合自己项目的…

使用EasyAR打包安卓操作注意

EasyAR for Scene 4.6.3 丨Unity2020.3.15f2 打包Unity注意事项 一、默认渲染管线 官方参考链接&#xff1a;ARFoundation 简单注意 1.打包设置为Android平台 2.PackageName和EasyAR中保持一致 3.Scripting Backend设置为IL2CPP&#xff0c;以及设置为ARM64 4.取消Auto …

数据结构·红黑树

1. 红黑树的概念 红黑树&#xff0c;是一种搜索二叉树&#xff0c;但在每个节点上增加一个存储位表示节点的颜色&#xff0c;可以是Red或Black。通过对任意一条从根到叶子的路径上各个节点着色方式的限制&#xff0c;红黑树确保没有一条路径会比其他路径长出两倍&#xff0c;因…

秋招突击——7/29——复习{有塔游戏——关联传递性}——新作{随机链表的复制、合并K个升序链表,二叉树——二叉树的中序遍历、二叉树的最大深度、反转二叉树}

文章目录 引言复习有塔游戏——关联传递性实现复习实现参考实现 新作随机链表的复制个人实现参考实现 排序链表个人实现参考实现 二叉树章节二叉树的中序遍历个人实现 二叉树的最大深度个人实现参考实现 反转二叉树个人实现参考实现 总结 引言 旅游完回来了&#xff0c;今天继…

Matlab编程资源库(14)常微分方程初值问题的数值解法

一、 龙格&#xff0d;库塔法简介 龙格-库塔法&#xff08;Runge-Kutta method&#xff09;是一种常用的数值解微分方程的方法&#xff0c;由德国数学家卡尔龙格&#xff08;Carl Runge&#xff09;和马丁威尔海尔姆库塔&#xff08;Martin Wilhelm Kutta&#xff09;在20世纪…

IDEA 本地有jar包依赖文件,但是所有引用的jar包全部爆红

前端时间 看源码&#xff0c;下载源码额按钮不见了&#xff0c;折腾了很久&#xff0c;遂打算重新安装idea&#xff0c;但是重新安装后&#xff0c;发现代码全都爆红&#xff0c;按照晚上说的删除idea 文件夹&#xff0c;idea缓存删除&#xff0c;都不好使&#xff0c;但是看到…

【JavaScript】`Map` 数据结构

文章目录 一、Map 的基本概念二、常见操作三、与对象的对比四、实际应用场景 在现代 JavaScript 中&#xff0c;Map 是一种非常重要且强大的数据结构。与传统的对象&#xff08;Object&#xff09;不同&#xff0c;Map 允许您使用各种类型的值作为键&#xff0c;不限于字符串或…

机器学习算法——常规算法,在同的业务场景也需要使用不同的算法(一)

&#x1f468;‍&#x1f4bb;个人主页&#xff1a;开发者-曼亿点 &#x1f468;‍&#x1f4bb; hallo 欢迎 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! &#x1f468;‍&#x1f4bb; 本文由 曼亿点 原创 &#x1f468;‍&#x1f4bb; 收录于专栏&#xff1a…