Spring Cloud: openFegin使用

文章目录

  • 一、OpenFeign简介
  • 二、Springboot集成OpenFeign
    • 1、引入依赖
    • 2、@EnableFeignClients注解
      • (1)应用
      • (2)属性解析
    • 3、 @FeignClient
      • (1)应用
      • (2)属性解析
      • (3)向Fegin客户端提供URL的几种方式
  • 三、openFegin应用
    • 1、使用openfegin下载文件

一、OpenFeign简介

OpenFeign 利用 Ribbon 维护了远程服务的列表信息,以实现客户端侧的负载均衡。

二、Springboot集成OpenFeign

1、引入依赖

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

2、@EnableFeignClients注解

(1)应用

在使用openfegin时需要再启动类上加上改注解,以启用 OpenFeign。

@SpringBootApplication
@EnableFeignClients
public class Application {public static void main(String[] args) {SpringApplication.run(Application.class, args);}
}

(2)属性解析

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
@Documented
@Import(FeignClientsRegistrar.class)
public @interface EnableFeignClients {String[] value() default {};String[] basePackages() default {};Class<?>[] basePackageClasses() default {};Class<?>[] defaultConfiguration() default {};Class<?>[] clients() default {};
}
  • basePackages 或 value
    这两个属性是等价的,用于指定扫描 Feign 客户端接口的包路径。Spring Cloud 会自动扫描这些包下的接口,并为它们创建代理实现,这些代理会实现声明的 Feign 客户端接口。
@EnableFeignClients(basePackages = "com.example.demo.client")

@EnableFeignClients(value = "com.example.demo.client")
  • defaultConfiguration
    这个属性允许你指定一个默认的配置类,该类会应用于所有 Feign 客户端,除非它们有自己特定的配置。
@EnableFeignClients(defaultConfiguration = DefaultFeignConfig.class)
  • clients
    这个属性允许你明确地指定哪些接口应该作为 Feign 客户端来创建。这在你不想扫描整个包,而只想为特定的接口创建 Feign 客户端时非常有用。
@EnableFeignClients(clients = {MyServiceClient.class, AnotherServiceClient.class})
  • basePackageClasses
    @EnableFeignClients 注解中的 basePackageClasses 属性是一个替代 basePackages 或 value 的方式,用于指定扫描 Feign 客户端接口的基准类。Spring Cloud 会扫描这些基准类所在的包及其子包,以查找标有 @FeignClient 注解的接口,并为这些接口创建代理实现。

使用 basePackageClasses 而不是直接指定包路径的好处是,它提供了类型安全的方式来定义扫描的包。你只需提供一个位于所需包中的类的 Class 对象,Spring Cloud 就会自动确定该类的包路径,并扫描该包及其子包。

下面是一个使用 basePackageClasses 的例子:

@SpringBootApplication  
@EnableFeignClients(basePackageClasses = MyFeignClient.class)  
public class DemoApplication {  public static void main(String[] args) {  SpringApplication.run(DemoApplication.class, args);  }  }

在这个例子中,假设 MyFeignClient 接口位于 com.example.demo.client 包中。通过指定 MyFeignClient.class 作为 basePackageClasses 的值,Spring Cloud 将扫描 com.example.demo.client 包及其所有子包,查找带有 @FeignClient 注解的接口。

这样做的好处是,即使你的包结构发生变化(例如,重命名包),只要 MyFeignClient 接口仍然位于相同的包中,你就不需要更新 @EnableFeignClients 注解。因此,它提供了一种更灵活的方式来指定扫描的包,减少了由于包路径更改而导致的维护工作量。

需要注意的是,basePackageClasses 和 basePackages/value 是互斥的,你不应该同时指定它们。你应该选择其中一种方式来定义扫描的包。通常,如果你的应用结构较为简单,直接指定包路径可能更直接。而在更复杂的场景中,使用 basePackageClasses 可能会更加灵活和易于维护。

3、 @FeignClient

(1)应用

定义一个接口,并使用 @FeignClient 注解指定远程服务的名称。

import feign.Response;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;import javax.validation.constraints.NotBlank;
import java.util.List;
@FeignClient(name = "xxx", contextId = "FileServiceAPI", path = url)
@Validated
public interface FileServiceAPI {/*** 获取文件详情接口* @param code* @return*/@GetMappingBizBaseResponse<FileInfoVo> getFileDetail(@NotBlank @RequestParam(name = "code") String code);@GetMapping("files")BizBaseResponse<List<FileInfoVo>> getFileDetails( @RequestParam(name = "codes") List<String> codes);/*** 文件下载接口* @param code*/@GetMapping("/download")Response download(@RequestParam(name = "code") String code);

(2)属性解析

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
public @interface FeignClient {// name和value属性用于标注客户端名称,也可以用${propertyKey}获取配置属性@AliasFor("name")String value() default "";// 该类的Bean名称String contextId() default "";// name和value属性用于标注客户端名称,也可以用${propertyKey}获取配置属性@AliasFor("value")String name() default "";// 弃用 被qualifiers()替代。@DeprecatedString qualifier() default "";// 模拟客户端的@Qualifiers值。如果qualifier()和qualifiers()都存在,我们将使用后者,除非qualifier()返回的数组为空或只包含空值或空白值,在这种情况下,我们将首先退回到qualifier(),如果也不存在,则使用default = contextId + "FeignClient"。String[] qualifiers() default {};// 绝对URL或可解析主机名String url() default "";// 是否应该解码404而不是抛出FeignExceptionsboolean decode404() default false;// 用于模拟客户端的自定义配置类。可以包含组成客户端部分的覆盖@Bean定义,默认配置都在FeignClientsConfiguration类中,可以指定FeignClientsConfiguration类中所有的配置Class<?>[] configuration() default {};// 指定失败回调类Class<?> fallback() default void.class;// 为指定的假客户端接口定义一个fallback工厂。fallback工厂必须生成fallback类的实例,这些实例实现了由FeignClient注释的接口。Class<?> fallbackFactory() default void.class;// 所有方法级映射使用的路径前缀String path() default "";// 是否将虚拟代理标记为主bean。默认为true。boolean primary() default true;
}

(3)向Fegin客户端提供URL的几种方式

  • 使用@FeignClient注解的url属性
    这是最直接的方式。你可以在@FeignClient注解中直接指定URL。这样,Feign客户端就会使用这个URL来进行请求。
@FeignClient(name = "myServiceClient", url = "http://example.com/api")  
public interface MyServiceClient {  // 定义你的方法  
}

在上面的例子中,MyServiceClient接口将使用http://example.com/api作为请求的基础URL。没有负载均衡能力,只能定向发送。

  • 使用配置文件:
    你可以在应用的配置文件(如application.yml或application.properties)中设置Feign客户端的URL。然后,你可以通过@Value注解或者@ConfigurationProperties来注入这个URL到Feign客户端的配置中。
# application.yml  
my-service-client:  url: http://example.com/api
@FeignClient(name = "myServiceClient", configuration = MyServiceClientConfiguration.class)  
public interface MyServiceClient {  // 定义你的方法  
}  @Configuration  
public class MyServiceClientConfiguration {  @Value("${my-service-client.url}")  private String url;  @Bean  public Request.Options options() {  return new Request.Options(connectTimeoutMillis(), readTimeoutMillis());  }  private int connectTimeoutMillis() {  return 10 * 1000;  }  private int readTimeoutMillis() {  return 60 * 1000;  }  
}

在这个例子中,MyServiceClientConfiguration类从配置文件中读取URL,并可能还配置了其他的Feign请求选项。没有负载均衡能力,只能定向发送,优先使用注解中的url。

  • 使用服务发现
    如果你的应用运行在Spring Cloud环境中,并使用了服务发现(如Eureka或Consul),那么通常不需要在Feign客户端中直接指定URL。相反,你可以通过服务名称来引用远程服务,Spring Cloud会自动解析服务名称到实际的URL。
@FeignClient(name = "my-service")  
public interface MyServiceClient {  // 定义你的方法  
}

在这个例子中,my-service是注册在服务发现中的服务名称。当发起请求时,Spring Cloud会查询服务发现来找到my-service的实例,并使用它们的URL进行请求。

三、openFegin应用

1、使用openfegin下载文件

(1)下载文件Controler实现

import org.springframework.core.io.FileSystemResource;  
import org.springframework.core.io.Resource;  
import org.springframework.http.HttpHeaders;  
import org.springframework.http.MediaType;  
import org.springframework.http.ResponseEntity;  
import org.springframework.web.bind.annotation.GetMapping;  
import org.springframework.web.bind.annotation.RestController;  import javax.servlet.http.HttpServletResponse;  
import java.io.IOException;  
import java.io.InputStream;  
import java.nio.file.Files;  
import java.nio.file.Path;  
import java.nio.file.Paths;  @RestController  
public class FileDownloadController {  @GetMapping("/download")  public void downloadFile(HttpServletResponse response) throws IOException {  // 文件路径  String filePath = "path/to/your/file.txt";  // 创建文件路径  Path path = Paths.get(filePath);  Resource resource = new FileSystemResource(path);  // 获取文件名  String filename = resource.getFilename();  // 设置响应头  response.reset();response.setContentType(MediaType.APPLICATION_OCTET_STREAM_VALUE);  response.setHeader(HttpHeaders.CONTENT_DISPOSITION, "attachment; filename=\"" + filename + "\"");  // 读取文件内容并写入响应输出流  try (InputStream inputStream = Files.newInputStream(path);  OutputStream outputStream = response.getOutputStream()) {  byte[] buffer = new byte[1024];  int bytesRead;  while ((bytesRead = inputStream.read(buffer)) != -1) {  outputStream.write(buffer, 0, bytesRead);  }  outputStream.flush();  }  }  
}

(2)openfegin配置

import feign.Response;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;import javax.validation.constraints.NotBlank;
import java.util.List;
@FeignClient(name = "xxx", contextId = "FileServiceAPI", path = url)
@Validated
public interface FileServiceAPI {/*** 文件下载接口* @param code*/@GetMapping("/download")Response download();

其中Response引用的是:feign.Response

(3)调用openfegin接口方法

 public File downFileByCode() {String path = PROJECT_PATH;Response response = fileServiceAPI.download(ossFileCode);mkDirs(path);File file = new File(path);if (response.status() == 200) {try (InputStream inputStream = response.body().asInputStream();FileOutputStream outputStream = new FileOutputStream(file)) {// 将响应体中的字节写入目标文件byte[] buffer = new byte[1024];int bytesRead;while ((bytesRead = inputStream.read(buffer)) != -1) {outputStream.write(buffer, 0, bytesRead);}} catch(Exception e) {LOGGER.error(e.getMessage(), e);throw new RunTimeException(e.getMessage());}}return file;}public static String mkDirs(String filePath) {if (StringUtils.isBlank(filePath)) {throw new RuntimeException("file path is null");}if (!filePath.endsWith(File.separator)) {LOGGER.info("mkdir , file path is {}", filePath);filePath = filePath.substring(0, filePath.lastIndexOf(File.separator));}//如果目录不存在,自动创建文件夹File dir = new File(filePath);if (!dir.exists()) {dir.mkdirs();}return dir.getAbsolutePath();}

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

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

相关文章

基于百度地图实现Android定位功能实现(一)

Android集成百度地图 文章目录 Android集成百度地图前言准备工作创建工程申请密钥 在项目中集成BaiduMap SDK创建地图 前言 本案例使用百度地图实现在Android中集成地图&#xff0c;并且实现了普通地图/卫星地图&#xff0c;以及路况图和热状图功能&#xff1b; 参考技术文档&…

Android SQLite的使用

前言 本文用于介绍SQLite&#xff0c;SQLite是Android内置的数据库&#xff0c;是一款轻量级的关系型数据库。它具有运算速度快、占用资源少等优点。支持SQL语法同时遵循数据库的ACID事务。 创建数据库 Android为我们提供了一个SQLiteOpenHelper帮助类&#xff0c;我们可以在…

MTU/TCPMSS/VLAN/ACCESS/TRUNK/HYBRID

MTU RFC标准定义以太网的默认MTU值为1500 最小64字节是为了保证最极端的冲突能被检测到&#xff0c;64字节是能被检测到的最小值&#xff1b;最大不超过1518字节是为了防止过长的帧传输时间过长而占用共享链路太长时间导致其他业务阻塞。所以规定以太网帧大小为64~1518字节&am…

OpenFeign使用

OpenFeign天然支持负载均衡 想要去消费接口的API的服务引入pom依赖 <dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-openfeign</artifactId> </dependency> 主启动类上加注解 EnableFeignC…

C++入门(二)

目录 函数重载&#xff1a; 函数重载概念&#xff1a; 参数类型不同&#xff1a; 参数个数不同&#xff1a; 参数类型顺序不同&#xff1a; C支持函数重载的原理--名字修饰&#xff1a; 引用&#xff1a; 引用概念&#xff1a; 引用特性&#xff1a; 常引用&#xff1…

网页的血液——javascript

1.简介 网络开发唯一可选语言&#xff0c; 增加网页动态性与交互性&#xff0c;服务端开发&#xff0c; Nodejs&#xff0c;可以进行数据库文件读写 2.引入 html内部使用script标签&#xff0c;在script内部直接编写js 在外部js文件中编写&#xff0c;在script内部通…

JJJ:linux系统中第一个进程

以linux4.19内核linux系统中第一个进程。 执行shell指令 ps -ef 结果如下&#xff1a; xxxxxx-virtual-machine:~$ ps -ef UID PID PPID C STIME TTY TIME CMD root 1 0 0 20:55 ? 00:00:02 /sbin/init splash root …

【机器学习300问】58、什么是词袋模型和N-gram模型?

词袋模型&#xff08;Bag of Words, BoW&#xff09;和N-gram模型主要用于早期的自然语言处理任务&#xff0c;上文中我介绍了机器是如何读懂文本的四个阶段&#xff0c;这篇文章带大家来看看在不同阶段中会用到的两个模型——词袋模型和N-gram模型。如果没有读过我之前的文章&…

C语言二进制常用逻辑运算符介绍与使用

在C语言中&#xff0c;二进制常用的逻辑运算符包括与&#xff08;AND&#xff09;、或&#xff08;OR&#xff09;、非&#xff08;NOT&#xff09;&#xff0c;以及异或&#xff08;XOR&#xff09;。以下是它们的介绍和使用方法&#xff1a; 与&#xff08;AND&#xff09;&a…

Nodejs 第六十章(http缓存)

HTTP缓存 HTTP 缓存主要分为两大类&#xff1a;强缓存和协商缓存。这两种缓存都通过 HTTP 响应头来控制&#xff0c;目的是提高网站性能。 强缓存介绍 强缓存之后则不需要向服务器发送请求&#xff0c;而是从浏览器缓存读取分为&#xff08;内存缓存&#xff09;| &#xff…

HarmonyOS 应用开发之FA模型与Stage模型应用组件

应用配置文件概述&#xff08;FA模型&#xff09; 每个应用项目必须在项目的代码目录下加入配置文件&#xff0c;这些配置文件会向编译工具、操作系统和应用市场提供描述应用的基本信息。 应用配置文件需申明以下内容&#xff1a; 应用的软件Bundle名称&#xff0c;应用的开发…

《Long-CLIP: Unlocking the Long-Text Capability of CLIP》

论文:https://arxiv.org/pdf/2403.15378.pdf源码:https://github.com/beichenzbc/Long-CLIP 导读 CLIP(Contrastive Language–Image Pre-training),这个由 OpenAI 团队开源的多模态预训练模型,它通过对比学习的方式,同时学习图像和文本的表示,从而实现在没有针对特定…

坐标变换矩阵之平移-opencv

平移矩阵m&#xff0c;平移向量(tx,ty,tz) double tx10.2; double ty0.0; double tz0.0; cv::Mat m cv::Mat::eye(4, 4, CV_64FC1);//单位矩阵 m.at<double>(0,3)tx; m.at<double>(1,3)ty; m.at<double>(2,3)tz;齐次点p(1,0,0,1)&#xff0c; cv::Mat p(4…

ESD保护二极管ESD9B3.3ST5G 以更小的空间实现强大的保护 车规级TVS二极管更给力

什么是汽车级TVS二极管&#xff1f; TVS二极管是一种用于保护电子电路的电子元件。它主要用于电路中的过电压保护&#xff0c;防止电压过高而损坏其他部件。TVS二极管通常被称为“汽车级”是因为它们能够满足汽车电子系统的特殊要求。 在汽车电子系统中&#xff0c;由于车辆启…

SEO文章写作器,批量写作原创SEO收录文章

在当今数字化时代&#xff0c;搜索引擎优化&#xff08;SEO&#xff09;已经成为了网站获得流量和曝光度的关键手段之一。而在SEO领域中&#xff0c;内容的质量和原创性是至关重要的。为了应对不断增长的内容需求&#xff0c;越来越多的人开始转向AI写作生成器&#xff0c;这些…

ChatGPT如何升级为GPT-4在国内

通过 WildCard 可以把ChatGPT升级为GPT-4 地址 1: 2155 Bailey Hill Rd 城市: Eugene 邮编: 97405 州: Oregon ChatGPT Plus/Team 一键升级&#xff0c;几分钟即可自动升级到 ChatGPT Plus。 选择我的邮箱账号符合要求 复制这个页面的链接即可 复制上面的link 到请在…

32-4 APP渗透 - APP渗透与防御

一、APP渗透测试流程 准备阶段: 确定安全测试的范围,包括受测方的测试目标和敏感数据。获取被测单位的书面盖章渗透测试授权,确保合法性和透明度。(重要)信息搜集: 收集关于APP的环境、业务用例和架构等信息,了解目标系统的特点和运行环境。可以使用各种信息收集工具和技术…

通俗易懂:什么是Java虚拟机(JVM)?它的主要作用是什么?

Java虚拟机&#xff08;Java Virtual Machine, JVM&#xff09;是一种软件实现的抽象计算机&#xff0c;它负责执行Java字节码&#xff08;Bytecode&#xff09;。Java程序并不是直接在物理计算机上运行&#xff0c;而是先由Java编译器将源代码编译成与平台无关的字节码&#x…

基于springboot实现房产销售系统项目【项目源码+论文说明】计算机毕业设计

基于springboot实现房产销售系统演示 摘要 随着科学技术的飞速发展&#xff0c;各行各业都在努力与现代先进技术接轨&#xff0c;通过科技手段提高自身的优势&#xff1b;对于房产销售系统当然也不能排除在外&#xff0c;随着网络技术的不断成熟&#xff0c;带动了房产销售系统…

CI/CD实战-jenkins结合ansible 7

配置主机环境 在jenkins上断开并删除docker1节点 重新给master添加构建任务 将server3&#xff0c;server4作为测试主机&#xff0c;停掉其上后面的docker 在server2&#xff08;jenkins&#xff09;主机上安装ansible 设置jenkins用户到目标主机的免密 给测试主机创建用户并…