SpringCloud-OpenFeign基础

2024-06-22 19:36

本文主要是介绍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...");}
}

这篇关于SpringCloud-OpenFeign基础的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1085215

相关文章

Java实现检查多个时间段是否有重合

《Java实现检查多个时间段是否有重合》这篇文章主要为大家详细介绍了如何使用Java实现检查多个时间段是否有重合,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录流程概述步骤详解China编程步骤1:定义时间段类步骤2:添加时间段步骤3:检查时间段是否有重合步骤4:输出结果示例代码结语作

Java中String字符串使用避坑指南

《Java中String字符串使用避坑指南》Java中的String字符串是我们日常编程中用得最多的类之一,看似简单的String使用,却隐藏着不少“坑”,如果不注意,可能会导致性能问题、意外的错误容... 目录8个避坑点如下:1. 字符串的不可变性:每次修改都创建新对象2. 使用 == 比较字符串,陷阱满

Java判断多个时间段是否重合的方法小结

《Java判断多个时间段是否重合的方法小结》这篇文章主要为大家详细介绍了Java中判断多个时间段是否重合的方法,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录判断多个时间段是否有间隔判断时间段集合是否与某时间段重合判断多个时间段是否有间隔实体类内容public class D

IDEA编译报错“java: 常量字符串过长”的原因及解决方法

《IDEA编译报错“java:常量字符串过长”的原因及解决方法》今天在开发过程中,由于尝试将一个文件的Base64字符串设置为常量,结果导致IDEA编译的时候出现了如下报错java:常量字符串过长,... 目录一、问题描述二、问题原因2.1 理论角度2.2 源码角度三、解决方案解决方案①:StringBui

Java覆盖第三方jar包中的某一个类的实现方法

《Java覆盖第三方jar包中的某一个类的实现方法》在我们日常的开发中,经常需要使用第三方的jar包,有时候我们会发现第三方的jar包中的某一个类有问题,或者我们需要定制化修改其中的逻辑,那么应该如何... 目录一、需求描述二、示例描述三、操作步骤四、验证结果五、实现原理一、需求描述需求描述如下:需要在

Java中ArrayList和LinkedList有什么区别举例详解

《Java中ArrayList和LinkedList有什么区别举例详解》:本文主要介绍Java中ArrayList和LinkedList区别的相关资料,包括数据结构特性、核心操作性能、内存与GC影... 目录一、底层数据结构二、核心操作性能对比三、内存与 GC 影响四、扩容机制五、线程安全与并发方案六、工程

JavaScript中的reduce方法执行过程、使用场景及进阶用法

《JavaScript中的reduce方法执行过程、使用场景及进阶用法》:本文主要介绍JavaScript中的reduce方法执行过程、使用场景及进阶用法的相关资料,reduce是JavaScri... 目录1. 什么是reduce2. reduce语法2.1 语法2.2 参数说明3. reduce执行过程

如何使用Java实现请求deepseek

《如何使用Java实现请求deepseek》这篇文章主要为大家详细介绍了如何使用Java实现请求deepseek功能,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录1.deepseek的api创建2.Java实现请求deepseek2.1 pom文件2.2 json转化文件2.2

Java调用DeepSeek API的最佳实践及详细代码示例

《Java调用DeepSeekAPI的最佳实践及详细代码示例》:本文主要介绍如何使用Java调用DeepSeekAPI,包括获取API密钥、添加HTTP客户端依赖、创建HTTP请求、处理响应、... 目录1. 获取API密钥2. 添加HTTP客户端依赖3. 创建HTTP请求4. 处理响应5. 错误处理6.

Spring AI集成DeepSeek的详细步骤

《SpringAI集成DeepSeek的详细步骤》DeepSeek作为一款卓越的国产AI模型,越来越多的公司考虑在自己的应用中集成,对于Java应用来说,我们可以借助SpringAI集成DeepSe... 目录DeepSeek 介绍Spring AI 是什么?1、环境准备2、构建项目2.1、pom依赖2.2