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

SpringCloud-04 OpenFeign服务调用与负载均衡

OpenFeign是一个声明式、模板化的HTTP客户端,它简化了在Java应用程序中调用RESTful API的过程。OpenFeign是Netflix开发的一个开源项目,它构建在Feign的基础上,为开发者提供了更加简单、灵活的方式来实现HTTP请求。OpenFeign的特点包括:

前面在使用SpringCloud LoadBalancer+RestTemplate时,利用RestTemplate对http请求的封装处理形成了一套模版化的调用方法。但是在实际开发中,由于对服务依赖的调用可能不止一处,往往一个接口会被多处调用,所以通常都会针对每个微服务自行封装一些客户端类来包装这些依赖服务的调用。所以,OpenFeign在此基础上做了进一步封装,由他来帮助我们定义和实现依赖服务接口的定义。在OpenFeign的实现下,我们只需创建一个接口并使用注解的方式来配置它(在一个微服务接口上面标注一个@FeignClient注解即可),即可完成对服务提供方的接口绑定,统一对外暴露可以被调用的接口方法,大大简化和降低了调用客户端的开发量,也即由服务提供者给出调用接口清单,消费者直接通过OpenFeign调用即可。

OpenFeign同时还集成SpringCloud LoadBalancer,可以在使用OpenFeign时提供Http客户端的负载均衡,也可以集成阿里巴巴Sentinel来提供熔断、降级等功能。而与SpringCloud LoadBalancer不同的是,通过OpenFeign只需要定义服务绑定接口且以声明式的方法,优雅而简单的实现了服务调用。

在一个接口上添加@FeugnClient注解即可

OpenFeign使用:

1.新建一个Module,添加pom依赖

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><parent><groupId>com.dc.cloud</groupId><artifactId>cloud2024</artifactId><version>1.0-SNAPSHOT</version></parent><artifactId>cloud-consumer-feign-order80</artifactId><properties><maven.compiler.source>17</maven.compiler.source><maven.compiler.target>17</maven.compiler.target><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding></properties><dependencies><!--openfeign-->
<!--        <dependency>-->
<!--            <groupId>org.springframework.cloud</groupId>-->
<!--            <artifactId>spring-cloud-starter-openfeign</artifactId>-->
<!--            <version></version>-->
<!--        </dependency>--><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-openfeign</artifactId><version>4.1.3</version></dependency><!--SpringCloud consul discovery--><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-consul-discovery</artifactId></dependency><!-- 引入自己定义的api通用包 --><dependency><groupId>com.dc.cloud</groupId><artifactId>cloud-api-commons</artifactId><version>1.0-SNAPSHOT</version></dependency><!--web + actuator--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-actuator</artifactId></dependency><!--lombok--><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><optional>true</optional></dependency><!--hutool-all--><dependency><groupId>cn.hutool</groupId><artifactId>hutool-all</artifactId></dependency><!--fastjson2--><dependency><groupId>com.alibaba.fastjson2</groupId><artifactId>fastjson2</artifactId></dependency><!-- swagger3 调用方式 http://你的主机IP地址:5555/swagger-ui/index.html --><dependency><groupId>org.springdoc</groupId><artifactId>springdoc-openapi-starter-webmvc-ui</artifactId></dependency></dependencies><build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId></plugin></plugins></build>
</project>

2.修改yml配置文件

server:port: 80spring:application:name: cloud-consumer-openfeign-order####Spring Cloud Consul for Service Discoverycloud:consul:host: localhostport: 8500discovery:prefer-ip-address: true #优先使用服务ip进行注册service-name: ${spring.application.name}

3.主启动类

@SpringBootApplication
@EnableDiscoveryClient //该注解用于向使用consul为注册中心时注册服务
@EnableFeignClients//启用feign客户端,定义服务+绑定接口,以声明式的方法优雅而简单的实现服务调用
public class MainOpenFeign80 {public static void main(String[] args) {SpringApplication.run(MainOpenFeign80.class,args);}
}

4.修改cloud-api-commons通用模块

//在通用模块端口也需添加pom依赖<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-openfeign</artifactId><version>4.1.3</version></dependency>
//新建接口
@FeignClient("cloud-payment-service")
public interface PayFeignApi {@PostMapping(value="/pay/add")public ResultData addPay(@RequestBody payDTO paydto);@GetMapping(value="/pay/get/{id}")public ResultData getPayInfo(@PathVariable("id") Integer id);@GetMapping(value="/pay/get/info")public String mylb();}
//在cloud-consumer-feign-order80模块新增controller
@RestController
public class OrderController {@Resourceprivate PayFeignApi payFeignApi;@PostMapping(value="/feign/pay/add")public ResultData addOrder(@RequestBody payDTO payDTO){System.out.println("新增订单操作");ResultData resultData=payFeignApi.addPay(payDTO);return resultData;}@GetMapping(value="/feign/pay/get/{id}")public ResultData getPayInfo(@PathVariable("id")Integer id){System.out.println("按照id查看订单支付流水");ResultData resultData=payFeignApi.getPayInfo(id);return resultData;}@GetMapping(value="/feign/pay/mylb")public String mylb(){return payFeignApi.mylb();}
}

在这里插入图片描述

在这里插入图片描述
OpenFeign高级特性

1.超时控制
在使用OpenFeign进行服务调用时,可以设置超时控制来限制请求的最大执行时间。OpenFeign提供了两种设置超时的方式:全局超时设置和针对特定请求的超时设置。
默认等待60秒,超过60秒拿不到查询结果就会报错
在这里插入图片描述

//全局设置
server:port: 80spring:application:name: cloud-consumer-openfeign-ordercloud:consul:host: localhostport: 8500discovery:prefer-ip-address: true #优先使用服务ip进行注册service-name: ${spring.application.name}openfeign:client:config:default:#连接超时时间connectTimeout: 3000#读取超时时间readTimeout: 3000//局部配置会覆盖全局配置
server:port: 80spring:application:name: cloud-consumer-openfeign-ordercloud:consul:host: localhostport: 8500discovery:prefer-ip-address: true #优先使用服务ip进行注册service-name: ${spring.application.name}openfeign:client:config:default:#连接超时时间connectTimeout: 3000          #3秒#读取超时时间readTimeout: 3000cloud-payment-service:#连接超时时间connectTimeout: 10000#读取超时时间readTimeout: 10000

2.重试机制
重试机制默认关闭(只会在规定时间调用一次)

//在80端口添加配置类OpenFeignConfig类
@Configuration
public class OpenFeignConfig {@Beanpublic Retryer myRetryer() {
//        return Retryer.NEVER_RETRY;//默认:不会重试return new Retryer.Default(100,1,4);//初始间隔时间   重试间隔时间1s  最大重试次数   }
}

3.OpenFeign中的http client
如果不做特殊配置,OpenFeign默认使用JDK自带的HttpURLConnection发送HTTP请求,由于默认HttpURLConnection没有连接池、性能和效率比较低,如果采用默认,性能上不是最好的。

//在OPenFeign80端口添加pom依赖<groupId>org.apache.httpcomponents.client5</groupId><artifactId>httpclient5</artifactId><version>5.3</version></dependency><!-- feign-hc5--><dependency><groupId>io.github.openfeign</groupId><artifactId>feign-hc5</artifactId><version>13.1</version></dependency>//修改yml文件httpclient:hc5:enabled: true

在这里插入图片描述
在这里插入图片描述
4.请求/响应压缩功能
Spring Cloud OpenFeign支持对请求和响应进行GZIP压缩,以减少通信过程中的性能损耗。

//yml文件修改
server:port: 80spring:application:name: cloud-consumer-openfeign-ordercloud:consul:host: localhostport: 8500discovery:prefer-ip-address: true #优先使用服务ip进行注册service-name: ${spring.application.name}openfeign:client:config:default:#连接超时时间connectTimeout: 3000          #3秒#读取超时时间readTimeout: 3000cloud-payment-service:#连接超时时间connectTimeout: 10000#读取超时时间readTimeout: 10000httpclient:hc5:enabled: truecompression:request:enabled: truemin-request-size: 2048 #最小触发压缩的大小mime-types: text/xml,application/xml,application/json #触发压缩数据类型response:enabled: true

5.日志打印功能
Feign 提供了日志打印功能,我们可以通过配置来调整日志级别,从而了解 Feign 中 Http 请求的细节,就是对Feign接口的调用情况进行监控和输出。

NONE:默认的,不显示任何日志;
BASIC:仅记录请求方法、URL、响应状态码及执行时间;
HEADERS:除了 BASIC 中定义的信息之外,还有请求和响应的头信息;
FULL:除了 HEADERS 中定义的信息之外,还有请求和响应的正文及元数据。

//修改OpenFeignConfig类
@Configuration
public class OpenFeignConfig {@Beanpublic Retryer myRetryer() {return Retryer.NEVER_RETRY;//默认:不会重试
//        return new Retryer.Default(100,1,4);//初始间隔时间   重试间隔时间1s  最大重试次数}@BeanLogger.Level feignLoggerLevel() {return Logger.Level.FULL;}
}//yml文件修改
server:port: 80spring:application:name: cloud-consumer-openfeign-ordercloud:consul:host: localhostport: 8500discovery:prefer-ip-address: true #优先使用服务ip进行注册service-name: ${spring.application.name}openfeign:client:config:default:#连接超时时间connectTimeout: 3000          #3秒#读取超时时间readTimeout: 3000cloud-payment-service:#连接超时时间connectTimeout: 10000#读取超时时间readTimeout: 10000httpclient:hc5:enabled: truecompression:request:enabled: truemin-request-size: 2048 #最小触发压缩的大小mime-types: text/xml,application/xml,application/json #触发压缩数据类型response:enabled: true
# feign日志以什么级别监控哪个接口
logging:level:com:dc:cloud:apis:PayFeignApi: debug

压缩
在这里插入图片描述

三次重试
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • Springboot 集成 Swing
  • 【面试八股总结】GMP模型
  • 小程序开发设计-第一个小程序:创建小程序项目④
  • curl格式化json之jq工具?
  • Java高级编程——泛型(泛型类、泛型接口、泛型方法,完成详解,并附有案例+代码)
  • 6--SpringBootWeb案例(详解)
  • springboot实战学习笔记(2)
  • vue项目中,属性表头默认为横向排列,却没有纵向排列的组件或相关属性,如何将其纵向排列?
  • vivado中选中bd文件后generate output product是什么用,create HDL wrapper是什么用
  • Java | Leetcode Java题解之第414题第三大的数
  • 检查和测绘室内防撞无人机技术详解
  • 828华为云征文|Flexus X实例Docker+Jenkins+gitee实现CI/CD自动化部署-解放你的双手~
  • Qt 模型视图(四):代理类QAbstractItemDelegate
  • 3D GS 测试自己的数据
  • 深入剖析:C++类对象的内存布局与优化
  • 时间复杂度分析经典问题——最大子序列和
  • java B2B2C 源码多租户电子商城系统-Kafka基本使用介绍
  • javascript 总结(常用工具类的封装)
  • Java的Interrupt与线程中断
  • java多线程
  • Linux快速配置 VIM 实现语法高亮 补全 缩进等功能
  • Python中eval与exec的使用及区别
  • SOFAMosn配置模型
  • TypeScript迭代器
  • ​​​​​​​STM32通过SPI硬件读写W25Q64
  • $分析了六十多年间100万字的政府工作报告,我看到了这样的变迁
  • (26)4.7 字符函数和字符串函数
  • (el-Date-Picker)操作(不使用 ts):Element-plus 中 DatePicker 组件的使用及输出想要日期格式需求的解决过程
  • (含react-draggable库以及相关BUG如何解决)固定在左上方某盒子内(如按钮)添加可拖动功能,使用react hook语法实现
  • (四)activit5.23.0修复跟踪高亮显示BUG
  • (文章复现)基于主从博弈的售电商多元零售套餐设计与多级市场购电策略
  • (一)Dubbo快速入门、介绍、使用
  • (转) SpringBoot:使用spring-boot-devtools进行热部署以及不生效的问题解决
  • (转)Android学习系列(31)--App自动化之使用Ant编译项目多渠道打包
  • (转)http-server应用
  • *1 计算机基础和操作系统基础及几大协议
  • ./configure,make,make install的作用
  • .locked1、locked勒索病毒解密方法|勒索病毒解决|勒索病毒恢复|数据库修复
  • .net core MVC 通过 Filters 过滤器拦截请求及响应内容
  • .Net Core中Quartz的使用方法
  • .NET HttpWebRequest、WebClient、HttpClient
  • .NET Standard 的管理策略
  • .net 桌面开发 运行一阵子就自动关闭_聊城旋转门家用价格大约是多少,全自动旋转门,期待合作...
  • @EnableConfigurationProperties注解使用
  • @Repository 注解
  • [2009][note]构成理想导体超材料的有源THz欺骗表面等离子激元开关——
  • [2017][note]基于空间交叉相位调制的两个连续波在few layer铋Bi中的全光switch——
  • [ActionScript][AS3]小小笔记
  • [autojs]逍遥模拟器和vscode对接
  • [BFS广搜]迷阵
  • [BSidesCF 2019]Kookie1
  • [bzoj1912]异象石(set)
  • [C][栈帧]详细讲解
  • [C++]AVL树怎么转
  • [CVPR2021]Birds of a Feather: Capturing Avian Shape Models from Images