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

springcloud-openfeign

官方定义:声明式rest客户端

引入依赖
<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
开启openfeign

启动类加开启注解

@EnableFeignClients

一、声明式实现

定义一个feign客户端

//指定value会在nacos注册中心查找service-product服务
@FeignClient(value = "service-product")
public interface ProductFeign {//这个就是MVC注解,两套使用逻辑//标注在controller上,是接收这样的请求//标注在feign上,是发送这样的请求//这段代码的意思是,在service-product服务上有个完全对应的@GetMapping("/get/{id}")请求@GetMapping("/get/{id}")//Product意思是,将返回值转为Product类型Product getProductid(@PathVariable("id") Integer id);
}

假如接收方需要有请求头token校验,可以这样写,就可以实现发送请求头

@GetMapping("/get/{id}")
Product getProductid(@PathVariable("id") Integer id, @RequestHeader("token") String token);

注意:feign请求是自动实现负载均衡的

二、第三方请求

用feign请求非注册中心服务

//value 是随意指定的服务名称,url是第三方域名
@FeignClient(value = "weather-service", url = "http://aliv18.data.moji.com")
public interface WeatherFeign {//whapi/json/alicityweather/condition //这个地址请求地址,需要发送post请求@PostMapping("/whapi/json/alicityweather/condition")//请求需要带1个header,和两个参数String getWeather(@RequestHeader("Authorization") String auth,@RequestParam("token") String token,@RequestParam("cityId") String cityId);
}

三、超时控制

openfeign默认:
connectTimeout(连接超时)=10秒
readTimeout(读取超时)=60秒

feign:client:config:#设置默认feign配置default:logger-level: fullconnect-timeout: 6000read-timeout: 8000#设置指定service-product服务配置service-product:logger-level: fullconnect-timeout: 3000read-timeout: 5000

四、重试机制

可以通过注入一个Retryer 实现重试机制。

@Bean
public Retryer retryer(){return new Retryer.Default();
}

默认最大重试时间1分钟,重试5次,间隔100毫秒,也可以自己设置默认值
在这里插入图片描述

五、拦截器

实现一个RequestInterceptor feign接口,可以通过apply方法进行拦截

@Component
public class TokenRequestInterceptor implements RequestInterceptor {@Overridepublic void apply(RequestTemplate requestTemplate) {//拦截请求,给header赋值tokenrequestTemplate.header("token", UUID.randomUUID().toString());}
}

六、fallback 兜底返回

定义fallback类,实现目标Feign

@Component
public class ProductFeignFallback implements ProductFeign {@Overridepublic Product getProductid(Integer id) {Product product = new Product();product.setPrice("0");product.setName("0");product.setId(0);return product;}
}

目标Feign中要加上fallback = ProductFeignFallback.class

@FeignClient(value = "service-product", fallback = ProductFeignFallback.class)

fallback要结合sentinel使用

<dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
</dependency>

增加配置

feign:sentinel:enabled: true
http://www.xdnf.cn/news/127063.html

相关文章:

  • 使用钉钉机器人推送系统内部的ERP停机维护公告
  • 微信小程序 tabbar底部导航栏
  • 传统的图像压缩技术(二)
  • mysql——索引事务和JDBC编程
  • 【C++基础知识】namespace前加 inline
  • 低代码平台开发胎压监测APP
  • 【MySQL数据库】表的增删改查
  • C++智能指针上
  • 如何在Spring Boot中禁用Actuator端点安全性
  • containerd 配置代理
  • 生成随机验证码-解析与优化
  • 扩张尺度张量填充方式
  • HTML字符实体和转义字符串
  • 【Linux】基本指令(下)
  • Docker部署DeepSeek常见问题及解决方案
  • 详细讲解 QMutex 线程锁和 QMutexLocker 自动锁的区别
  • 提升内容创作效率:AI原创文章批量生成工具优势
  • 【DNS】BIND 9的配置
  • Android之AI自动化测试--Midscene
  • CentOS 7上Memcached的安装、配置及高可用架构搭建
  • 内存管理:内存堆管理
  • 编译原理(5):链接
  • Kafka命令行的使用/Spark-Streaming核心编程(二)
  • 17.磁珠在EMC设计中的运用
  • Happens-Before 原则
  • 理解js函数(Ⅱ)
  • CompletableFuture到底怎么用?
  • Code Splitting 分包策略
  • MobTech袤博ShareSDK集成错误 ld: symbol(s) not found for architecture arm64
  • 《一文读懂Transformers库:开启自然语言处理新世界的大门》