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

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);}
}

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 前端三大主流框架对比
  • 流媒体服务器一:使用成熟的流媒体SRS 搭建 RTMP流媒体服务器
  • Java的序列化和反序列化
  • 阿里云服务器上怎么生成公钥和私钥对
  • K210视觉识别模块学习笔记7:多线程多模型编程识别
  • Qt基础 | QSqlTableModel 的使用
  • 深入解析 Java 集合类:ArrayList、LinkedList、Vector
  • RIP路由协议
  • set(集合),multiset容器及pair队组的创建
  • Java语言程序设计基础篇_编程练习题**15.28(显示一个转动的风扇)
  • 【Linux】进程IO|重定向|缓冲区|dup2|dup|用户级缓冲区|模拟缓冲区
  • leetcode 69. x 的平方根
  • C++里memset的使用
  • Oracle 文件管理-参数文件、控制文件、归档
  • Java语言程序设计——篇九(3)
  • hexo+github搭建个人博客
  • 5分钟即可掌握的前端高效利器:JavaScript 策略模式
  • Android交互
  • Docker 1.12实践:Docker Service、Stack与分布式应用捆绑包
  • hadoop集群管理系统搭建规划说明
  • NSTimer学习笔记
  • PAT A1092
  • react-native 安卓真机环境搭建
  • UMLCHINA 首席专家潘加宇鼎力推荐
  • Vue2.0 实现互斥
  • 高度不固定时垂直居中
  • 函数式编程与面向对象编程[4]:Scala的类型关联Type Alias
  • 力扣(LeetCode)965
  • 漫谈开发设计中的一些“原则”及“设计哲学”
  • 异常机制详解
  • 用 vue 组件自定义 v-model, 实现一个 Tab 组件。
  • ionic异常记录
  • Redis4.x新特性 -- 萌萌的MEMORY DOCTOR
  • 东超科技获得千万级Pre-A轮融资,投资方为中科创星 ...
  • 摩拜创始人胡玮炜也彻底离开了,共享单车行业还有未来吗? ...
  • 新年再起“裁员潮”,“钢铁侠”马斯克要一举裁掉SpaceX 600余名员工 ...
  • ​TypeScript都不会用,也敢说会前端?
  • #### go map 底层结构 ####
  • #07【面试问题整理】嵌入式软件工程师
  • #NOIP 2014# day.1 T3 飞扬的小鸟 bird
  • (1)(1.9) MSP (version 4.2)
  • (11)工业界推荐系统-小红书推荐场景及内部实践【粗排三塔模型】
  • (vue)el-cascader级联选择器按勾选的顺序传值,摆脱层级约束
  • (备忘)Java Map 遍历
  • (补充)IDEA项目结构
  • (二) Windows 下 Sublime Text 3 安装离线插件 Anaconda
  • (南京观海微电子)——I3C协议介绍
  • (三)uboot源码分析
  • (三分钟)速览传统边缘检测算子
  • (图文详解)小程序AppID申请以及在Hbuilderx中运行
  • (译) 理解 Elixir 中的宏 Macro, 第四部分:深入化
  • (原創) 系統分析和系統設計有什麼差別? (OO)
  • (转)ABI是什么
  • (转)C#开发微信门户及应用(1)--开始使用微信接口
  • (转)scrum常见工具列表