SpringCloud-OpenFeign基础

OpenFeign

OpenFeign简介

  1. OpenFeign是一个基于HTTP协议的RPC(远程过程调用)组件,用于简化HTTP请求和响应的处理。
  2. 它通过声明式的方式定义REST API接口,并自动生成实现该接口的客户端代码,从而简化了RESTful服务的调用过程。
  3. 它和其它框架,比如Dubbo、Mybatis等发送请求的框架相同,底层是动态代理
  4. 它是Feign的增强版,同时整合了Ribbon和Eureka,使Feign更加灵活

Feign.client

OpenFeign默认使用jdk的HttpUrlConnection,没有链接池,也没有资源管理,性能不是很好

Feign的日志

  1. Feign的日志级别
  2. NONE:默认的,不打印任何日志
  3. BASIC:仅记录请求方法,URL、响应状态码以及执行时间
  4. HEADERS:在BASIC基础上,记录请求和响应的header信息
  5. FULL:记录响应和请求的header、body和元数据
  6. 开发环境一般使用FULL,生产环境一般使用BASIC

配置Feign日志可以通过两种方式配置

Feign的日志打印是基于springboot日志的所以要配置springboot日志

  • 引入springboot日志依赖
        <!--日志--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-logging</artifactId></dependency>
  • 配置springboot日志输出级别
logging:level:com.shaoby: debug
  1. 配置类,需要注意的是如果使用配置类的方式,配置类加了@Configuration注解,全局使用;如果不加可以通过@FeignClient注解的configuration属性指定配置类;
public class FeignLogConfig {@Beanpublic Logger.Level logger(){return Logger.Level.FULL;}
}
@FeignClient(value = "SMS-cache",configuration = FeignLogConfig.class)
public interface SmsCacheClient {@GetMapping(value = "/cache/hGetAll/{key}")Map hGetAll(@PathVariable("key") String key);
}
  1. 配置文件,或直接使用配置文件配置feign日志
logging:level:com.shaoby: debug
feign:client:config:
#      feignClient的value,可以配置多个SMS-cache:loggerLevel: full

Feign支持的配置项

Feign契约

  1. Feign默认使用springMVC的契约,即springMVC中的注解如@RequestMapping、@PostMapper、@PathVariable等。
  2. 如果使用Feign的默认契约,就必须使用Feign中的注解调用远程接口,可通过配置文件或者配置类修改契约,默认值feign.Contract.Default
  3. 不建议修改

编解码

  1. 编解码是指的:指将请求数据编码成HTTP请求体并将HTTP响应体解码成Java对象的过程。
  2. Feign中提供了自定义编解码配置,同时也提供了多项编解码的实现,比如Gson、Jaxb、Jackson.默认使用SpringEncoder&&SpringDecoder
  3. 可通过实现Encoder&&Decoder自定义编解码
  4. 可通过配置文件指定编解码方式,一般不建议修改
feign:client:config:#调用的服务名称,可配置多个SMS-cache:encoder: com.xxx.xxxEncoderdecoder: com.xxx.xxxDecoder

拦截器

  1. 实现RequestInterceptor接口,自定义拦截器
public class FeignAuthRequestInterceptor implements RequestInterceptor {private String tookenId;public FeignAuthRequestInterceptor(String tookenId) {this.tookenId = tookenId;}@Overridepublic void apply(RequestTemplate requestTemplate) {requestTemplate.header("Authorization",tookenId);}
}
  1. 通过配置类将拦截器配置到Feign中
  2. 服务提供端加入拦截器

Client设置

Feign中默认使用JDK原生的URLConnection发送HTTP请求,可以自定义实现替换,一般使用feign自带的,比如OkHTTPClient,apche httpclient等,配置方式相同。只要引入依赖,springboot自动装配。

比如使用apche httpclient

  • 引入依赖
<dependency><groupId>io.github.openfeign</groupId><atrifactId>feign-httpclient</atrifactId>
</dependency>
  • 配置类
feign:
#  使用apche httpclienthttpclient: true
#  最大连接数max-connections: 200
#  单路径最大链接数max-connections-pre-rote: 50

超时时间配置

  • 注入配置:
@Configuration
public class FeignConfig {@Beanpublic Request.Options options(){return new Request.Options(200,400);}
}

基本使用案例

本案例基于nacos作为注册中心和配置中心,用OpenFeign实现远程过程调用。

服务提供端

  1. 引入nacos相关依赖,用于将服务注册到nacos中
<!--注册到nacos-->
<dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
<!--nacos拉取配置-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
  1. 配置nacos,配置注册中心地址
spring:application:name: SMS-cacheprofiles:active: devcloud:nacos:discovery:server-addr: 47.92.xxx.xxx:8848config:server-addr: 47.92.xxx.xxx:8848file-extension: ymlredis:host: 47.92.xxx.xxxport: 6379
  1. 开启nacos配置,启动类标记注解@EnableDiscoveryClient
@SpringBootApplication
@EnableDiscoveryClient
public class CacheStarterApp {public static void main(String[] args) {SpringApplication.run(CacheStarterApp.class,args);}
}
  1. 提供restful接口
/*** @Author Cookie* @Date 2024/6/22 0:42*/
@RestController
@Slf4j
public class CacheController {@Autowiredprivate RedisClient redisClient;@PostMapping(value = "/cache/hset/{key}")void hSet(@PathVariable("key") String key, @RequestBody Map map){log.info("【缓存模块】hSet方法存储数据成功key={},value{}",key,map);redisClient.putMap(key,map);}@GetMapping(value = "/cache/set/{key}/{value}")void set(@PathVariable("key") String key, @PathVariable("value") String value){log.info("【缓存模块】set方法存储数据成功key={},value{}",key,value);}
}

消费者

  1. 引入相关依赖,nacos、OpenFeign等
<!--注册到nacos--><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId></dependency><!--nacos拉取配置--><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId></dependency><!--openfeign--><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-openfeign</artifactId></dependency>
  1. 配置nacos

同被调用端,将服务注册到nacos中

  1. 标记启动类,使用@EnableFeignClients自动装配OpenFeign
@SpringBootApplication
@EnableDiscoveryClient
@EnableFeignClients
public class TestAppStarter {public static void main(String[] args) {SpringApplication.run(TestAppStarter.class,args);}
}
  1. 消费者调用提供者接口,通过@FeignClient注解实现。
@FeignClient("SMS-cache")
public interface CacheClient {@PostMapping(value = "/cache/hset/{key}")void hSet(@PathVariable("key") String key, @RequestBody Map map);@GetMapping(value = "/cache/set/{key}/{value}")void set(@PathVariable("key") String key, @PathVariable("value") String value);
}

@FeignClient中有以下属性:

  1. value:指定服务的名称,要和注册中心中服务提供者名称一致
  2. name:指定该类的容器名称,即ioc中的类ID
  3. url: url一般用于调试,可以手动指定@FeignClient调用的地址
  4. decode404:当发生http 404错误时,如果该字段位true,会调用decoder进行解码,否则抛出FeignException
  5. configuration: Feign配置类,可以自定义Feign的Encoder、Decoder、LogLevel、Contract
  6. fallback: 服务容错处理类
  7. fallbackFactory: 工厂类,用于生成fallback类示例,通过这个属性我们可以实现每个接口通用的容错逻辑
  8. path: 定义当前FeignClient的统一前缀,项目中配置了server.context-path,server.servlet-path时使用
  1. 测试,注入消费者调用提供者接口的接口,由组件自动生产动态代理类
@SpringBootTest
@RunWith(SpringRunner.class)
public class ClientBusinessMapperTest {@Autowiredprivate ClientBusinessMapper mapper;@Autowiredprivate CacheClient cacheClient;@Testpublic void findById() throws JsonProcessingException {ClientBusiness clientBusiness = mapper.findById(1L);ObjectMapper objectMapper = new ObjectMapper();Map map = objectMapper.readValue(objectMapper.writeValueAsString(clientBusiness), Map.class);cacheClient.hSet("test"+clientBusiness.getApikey(),map);System.out.println("success...");}
}

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

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

相关文章

4、MFC:菜单栏、工具栏与状态栏

菜单栏、工具栏与状态栏 1、菜单栏1.1 简介1.2 创建属性设置菜单消息成员函数 1.3 实例 2、工具栏2.1 简介工具栏属性2.2 创建消息CToolBar类的主要成员函数 2.3 实例 3、状态栏3.1 简介3.2 创建CStatusBar类状态栏创建 3.3 实例 1、菜单栏 1.1 简介 菜单在界面设计中是经常使…

渗透测试-若依框架的杀猪交易所系统管理后台

前言 这次是带着摸鱼的情况下简单的写一篇文章&#xff0c;由于我喜欢探究黑灰产业&#xff0c;所以偶尔机遇下找到了一个加密H币的交易所S猪盘&#xff0c;我记得印象是上年的时候就打过这一个同样的站&#xff0c;然后我是通过指纹查找其它的一些站&#xff0c;那个站已经关…

海外短剧系统如何征服观众心

海外短剧系统要征服观众的心&#xff0c;需要综合考虑多个方面。 1、紧凑的剧情设计&#xff1a; 短小精悍&#xff1a;海外短剧通常每集时长不超过半小时&#xff0c;甚至有的仅有几分钟。这种紧凑的剧情设计让观众能够在短时间内迅速沉浸在故事中&#xff0c;无需花费大量时间…

OpenCV一文入门

OpenCV一文入门 官网地址 OpenCV 当前版本 opencv-python 4.9.0.80 python 包地址 https://pypi.org/project/opencv-python/ OpenCV&#xff08;Open Source Computer Vision Library&#xff09;是一个开源计算机视觉和机器学习软件库&#xff0c;由Intel最初开发&#xff0c…

oracle中使用临时表GLOBAL TEMPORARY TABLE

需要在存储过程中返回一个临时结果集&#xff0c;这个结果集又是多个语句通过循环查询出来的&#xff0c;这时候就想到了将结果插入到临时表中&#xff0c;然后返回临时表的数据的思路&#xff0c;于是有了以下操作&#xff1a; 1.创建临时表 -- Create table create global …

STM32驱动-ads1112

汇总一系列AD/DA的驱动程序 ads1112.c #include "ads1112.h" #include "common.h"void AD5726_Init(void) {GPIO_InitTypeDef GPIO_InitStructure;RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOC, ENABLE );//PORTA、D时钟使能 G…

Oracle报错:ORA-02292: 违反完整约束条件 - 已找到子记录问题解决

目录 一、问题详情 二、原因分析 三、解决方案 一、问题详情 使用Mybatis删除数据的时候&#xff0c;报了如下错误详情&#xff1a; org.springframework.dao.DataIntegrityViolationException: ### Error updating database. Cause: java.sql.SQLException: ORA-02292: …

数学建模 —— 查找数据

目录 百度搜索技巧 完全匹配搜索&#xff1a;查询词的外边加上双引号“ ” 标题必含关键词&#xff1a;查询词前加上intitle: 搜索文档&#xff1a;空格再输入filetype:文件格式 去掉不想要的&#xff1a;查询词后面加空格后加减号与关键字 知网查文献 先看知网的硕博士…

大脑临界状态:探索思维背后的物理机制

在深度思考或创造性灵感的涌现时刻&#xff0c;个体常体验到一种介于混乱与有序之间的特殊心理状态。这种感受实则反映了大脑在认知过程中的临界状态&#xff0c;这是一种涉及复杂物理现象的心理活动表现。近期研究表明&#xff0c;大脑结构中存在着与临界性密切相关的物理特性…

为什么挂牌量是跟踪楼市情况的核心指标?

通过挂牌量&#xff0c;可以跟踪被动卖出者的数量&#xff0c;从而理解楼市的进展。 引子 楼市的“5.17”新政落地有一个多月了&#xff0c;然而&#xff0c;资本市场对“楼市的复苏预期”却在不断地下修。 以房地产开发的龙头企业保利发展为例&#xff0c;市场在“5.17”新…

学习笔记——路由网络基础——动态路由

五、动态路由 1、动态路由概述 动态路由&#xff1a;通过在设备上运行某种协议&#xff0c;通过该协议自动交互路由信息的过程。 动态路由协议有自己的路由算法&#xff0c;能够自动适应网络拓扑的变化&#xff0c;适用于具有一定数量三“层设备的网络。 动态路由协议适用场…

Python发送Email的性能怎么样?如何配置?

Python发送Email怎么配置SMTP&#xff1f;批发邮件的方法技巧&#xff1f; Python是一种广泛使用的编程语言&#xff0c;因其简洁和强大的功能深受开发者喜爱。在许多应用场景中&#xff0c;Python发送Email是一个常见需求。那么&#xff0c;Python发送Email的性能怎么样呢&am…

基于Java的农机电招平台系统

你好呀&#xff0c;我是计算机学姐码农小野&#xff01;如果你对农机电招平台系统感兴趣或有相关开发需求&#xff0c;可以私信联系我。 开发语言 Java 数据库 MySQL 技术 B/S结构&#xff0c;SpringBoot框架 工具 Eclipse&#xff0c;Navicat&#xff0c;Tomcat8.0 系…

代理的匿名级别有哪些?为什么匿名性很重要?

在互联网时代&#xff0c;代理服务器在许多领域都扮演着重要的角色。无论是个人用户还是企业&#xff0c;都可能需要使用代理来保护自己的隐私和数据安全。在选择代理服务时&#xff0c;匿名级别是一个重要的考虑因素。本文将介绍代理的匿名级别&#xff0c;并解释为什么匿名性…

OpenTLD源码生成VS2010工程和编译过程

OpenTLD算法是做什么的&#xff0c;我就不多介绍了&#xff0c;很多人前辈都介绍过了。我参考的博客有 庖丁解牛TLD&#xff08;五&#xff09;——井底之蛙啦~ OpenTLD C 尝试车辆目标跟踪[1] 看了这个挺好玩的&#xff0c;就打算自己编译一下跑跑看。 我的环境是win7 v…

从零开始学JAVA-数组和方法篇

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 目录 文章目录 前言 一、数组是什么&#xff1f; 1.格式 2.动态初始化 3.元素的访问 4.静态初始化 5.数组的遍历 6.常见问题 二、方法 1.什么是方法 2.方法定义和调…

华为RH2288 V3安装 Linux 系统,安装过程心得

带着U盘&#xff0c;怀着激动的心情进入机房安装操作系统&#xff0c;结果没有显示器和键盘鼠标&#xff0c;傻眼了。 作为过来人&#xff0c;温馨提醒&#xff0c;进入机房前记得先打听&#xff0c;准备好这些&#xff1a;机房房间号、机柜编号、物理机编号、键盘、鼠标、显示…

ShareX,屏幕截图、屏幕录制和文件共享,还提供了丰富的高级功能和自定义选项

ShareX是一个免费开源的Windows应用程序&#xff0c;用于屏幕截图、屏幕录制和文件共享。它不仅支持基本的屏幕截图功能&#xff0c;还提供了丰富的高级功能和自定义选项&#xff0c;使其成为提高工作效率和截图体验的利器。以下是ShareX v16.1.0便携版的主要功能和特色&#x…

别再滥用std::async了,strace命令暴露了一个乱开线程问题

用strace查看进程的系统调用后&#xff0c;发现一个std::async滥用问题 问题现象 进程的系统调用clone次数持续增加 使用工具strace发现进程clone系统调用过多且一直在增加 strace -c -p PID问题分析 clone在做什么&#xff1a;创建进程&#xff08;线程&#xff09; 查看…

【吊打面试官系列-Mysql面试题】什么是存储过程?用什么来调用?

大家好&#xff0c;我是锋哥。今天分享关于 【什么是存储过程&#xff1f;用什么来调用&#xff1f;】面试题&#xff0c;希望对大家有帮助&#xff1b; 什么是存储过程&#xff1f;用什么来调用&#xff1f; 答&#xff1a;存储过程是一个预编译的 SQL 语句&#xff0c;优点是…