【Fegin技术专题】「原生态」打开Fegin之RPC技术的开端,你会使用原生态的Fegin吗?(高级用法)

news2025/2/27 1:40:54

对于Httpclient请求机制进行设置操作处理。

@Body注解申明一个请求体模板,模板中可以带有参数,与方法中@Param注解申明的参数相匹配,使用方法如下:

interface LoginClient {

 void login( String user,  String password);
}
...

client.login("denominator", "secret");

复制代码

Feign支持给请求的api设置或者请求的客户端设置请求头,如下:


interface BaseApi {

  void put( String, V value);
}
复制代码

void post( String token);
复制代码

设置key和value都是动态的请求头

可以使用 @HeaderMap 注解,如下:


void post( Map headerMap);
复制代码

给Target设置请求头

有时我们需要在一个API实现中根据不同的endpoint来传入不同的Header,这个时候我们可以使用自定义的RequestInterceptor 或 Target来实现.

通过自定义的 RequestInterceptor 来实现请查看 Request Interceptors

下面是一个通过自定义Target来实现给每个Target设置安全校验信息Header的例子:

static class DynamicAuthTokenTarget implements Target {
 public DynamicAuthTokenTarget(Class clazz,
                UrlAndTokenProvider provider,
                ThreadLocal requestIdProvider);
 ...

 public Request apply(RequestTemplate input) {
  TokenIdAndPublicURL urlAndToken = provider.get();
  if (input.url().indexOf("http") != 0) {
   input.insert(0, urlAndToken.publicURL);
  }
  input.header("X-Auth-Token", urlAndToken.tokenId);
  input.header("X-Request-ID", requestIdProvider.get());
  return input.request();
 }
}
...

Bank bank = Feign.builder()
    .target(new DynamicAuthTokenTarget(Bank.class, provider, requestIdProvider));
复制代码
  • 这种方法的实现依赖于给Feign 客户端设置的自定义的RequestInterceptor 或 Target。可以被用来给一个客户端的所有api请求设置请求头。比如说可是被用来在header中设置身份校验信息。这些方法是在线程执行api请求的时候才会执行,所以是允许在运行时根据上下文来动态设置header的。
  • 比如说可以根据线程本地存储(thread-local storage)来为不同的线程设置不同的请求头。

有些请求中的一些方法是通用的,但是可能会有不同的参数类型或者返回类型,这个时候可以这么用:


interface BaseAPI {

  String health();

  List all();
}

interface CustomAPI extends BaseAPI {

 String custom();
}

interface BaseApi {

 V get( String key);

 List list();

 void put( String key, V value);
}

interface FooApi extends BaseApi { }
interface BarApi extends BaseApi { }

复制代码

你可以通过设置一个 Logger 来记录http消息,如下:

GitHub github = Feign.builder()
decoder(new GsonDecoder())
           .logger(new Logger.JavaLogger().appendToFile("logs/http.log"))
           .logLevel(Logger.Level.FULL)
           .target(GitHub.class, https:
复制代码

当你希望修改所有的的请求的时候,你可以使用Request Interceptors。比如说,你作为一个中介,你可能需要为每个请求设置 X-Forwarded-For

static class ForwardedForInterceptor implements RequestInterceptor {
  public void apply(RequestTemplate template) {
    template.header("X-Forwarded-For", "origin.host.com");
  }
}
...

Bank bank = Feign.builder()
         .decoder(accountDecoder)
         .requestInterceptor(new ForwardedForInterceptor())
         .target(Bank.class, https:
复制代码

或者,你可能需要实现Basic Auth,这里有一个内置的基础校验拦截器

BasicAuthRequestInterceptor
Bank bank = Feign.builder()
         .decoder(accountDecoder)
         .requestInterceptor(new BasicAuthRequestInterceptor(username, password))
         .target(Bank.class, https:
复制代码

@Param 注解给模板中的参数设值的时候,默认的是使用的对象的 toString() 方法的值,通过声明 自定义的Param.Expander,用户可以控制其行为,比如说格式化 Date 类型的值:


Result list( Date date);
复制代码

动态查询参数支持,通过使用 @QueryMap 可以允许动态传入请求参数,如下:


V find( Map queryMap);
复制代码

原生Feign只能一次解析一个接口,生成对应的请求代理对象,如果一个包里有多个调用接口就要多次解析非常麻烦。

自定义注解:在扫描接口的过程中,可以通过一个自定义注解,来区分Feign接口并且指定调用的服务Url


public class FeignClientRegister implements BeanFactoryPostProcessor{

    public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) {
        List classes = scan(scanPath);
        if(classes==null){
            return ;
        }
        Feign.Builder builder = getFeignBuilder();
        if(classes.size()>0){
            for (String claz : classes) {
                Class targetClass = null;
                try {
                    targetClass = Class.forName(claz);
                    String url=targetClass.getAnnotation(FeignApi.class).serviceUrl();
                    if(url.indexOf("http://")!=0){
                        url="http://"+url;
                    }
                    Object target = builder.target(targetClass, url);
                    beanFactory.registerSingleton(targetClass.getName(), target);
                } catch (Exception e) {
                    throw new RuntimeException(e.getMessage());
                }
            }
        }
    }
    public Feign.Builder getFeignBuilder(){
        Feign.Builder builder = Feign.builder()
                .encoder(new JacksonEncoder())
                .decoder(new JacksonDecoder())
                .options(new Request.Options(1000, 3500))
                .retryer(new Retryer.Default(5000, 5000, 3));
        return builder;
    }
    public List scan(String path){
        ScanResult result = new FastClasspathScanner(path).matchClassesWithAnnotation(FeignApi.class, (Class aClass) -> {
        }).scan();
        if(result!=null){
            return result.getNamesOfAllInterfaceClasses();
        }
        return  null;
    }
}
复制代码

分享资源

资源分享
获取以上资源请访问开源项目 点击跳转

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

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

相关文章

小红书投放流程是什么,达人选择注意事项!

很多人会发现有些笔记的内容并不是很出彩,但是偏偏就火了,自己想去模仿就平平无奇,其中包含了很多因素,有运气、也有选题和博主发文思路在里面,今天,来和大家分享下小红书投放流程是什么,达人选…

Python Selenium 设置带账号密码的socks5代理,启动浏览器

selenium添加带有账密的socks5代理 我们都知道在使用selenium开发爬虫的时候不可避免的会使用socks5高匿名代理。一般情况下我们使用方法如下(开发语言为python): from selenium import webdriver chrome_options webdriver.ChromeOptions() chrome_options.add_…

手动整理:腾讯云轻量应用服务器优缺点大全

腾讯云轻量应用服务器开箱即用、运维简单的轻量级云服务器,CPU内存带宽配置高并且特别合适,轻量2核2G3M带宽、2核2G4M、2核4G5M带宽、4核8G12M带宽,还有8核16G18M和16核32G28M配置可选,腾讯云服务器网分享腾讯云轻量应用服务器详细…

filebeat 采集k8s 中nginx deployment 日志

一、背景 在k8s集群中,已经部署了nginx应用,需要使用elk来收集日志。 注意:elk并没有放在k8s集群中,使用单独的服务器进行安装。不推荐elk放在k8s集群中! 其中filebeat,使用DaemonSet方式部署&#xff0…

【递归函数的几种常见题型】

递归函数的几种常见题型 目录 题型一:打印一个数的每一位 题型二:计算一个数的每位之和 题型三:计算n的k次方 题型一:打印一个数的每一位 1.1递归函数的实现 void print(int n) {if (n > 9)print(n / 10);printf("…

海外ASO优化之关于应用的营销1

应用程序市场存在一个悲惨的现实:再优秀的应用程序仍然可能会失败。这通常是因为没有人知道它们的存在。所以应用的营销是取得成功的关键。 1、选择正确的应用名称。 实用的应用程序的销售基础是以某种方式使用户的生活更轻松,所以我们需要设置一些功能…

浦东优秀解决方案!闪马智能加速赋能数字化转型

近日,由上海市浦东新区城市数字化转型应用促进中心和上海数字产业发展有限公司联合主办的2023年浦东新区“数转汇”品牌活动启动仪式暨上海数产“科技下午茶”活动举行。现场“2022年浦东新区数字化转型应用优秀解决方案”正式发布,凭借智慧交通一体化感…

深入解析搜好货API:开启智能化电商解决方案

随着电商行业的快速发展,人们对于个性化、智能化的购物体验的追求也越来越高。为了满足消费者的需求,搜好货API应运而生。 一、搜好货API的基本原理 搜好货API基于先进的数据挖掘和机器学习算法,通过收集和分析大量的商品信息和用户行为数据…

[保研/考研机试] KY3 约数的个数 清华大学复试上机题 C++实现

题目链接&#xff1a; KY3 约数的个数 https://www.nowcoder.com/share/jump/437195121691716950188 描述 输入n个整数,依次输出每个数的约数的个数 输入描述&#xff1a; 输入的第一行为N&#xff0c;即数组的个数(N<1000) 接下来的1行包括N个整数&#xff0c;其中每个…

golang拥有wireshark数据包解析能力

golang拥有wireshark数据包解析能力 1. 功能和实现 wireshark拥有世界上最全面的协议解析能力并且还在不断更新中&#xff0c;通过调研&#xff0c;没有办法找到与wireshark同水平的解析工具。 为了使得golang语言可以拥有wireshark一样强大的协议解析能力&#xff0c;库 gowir…

嗨,你的MySQL性能瓶颈在这!

MySQL的高级用法和性能优化 1. MySQL的高级用法1.1 replace into 用法1.2 内连接&#xff08;inner join&#xff09;1.2.1 等值连接1.2.2 非等值连接1.2.3 左连接1.2.4 右连接 1.3 索引1.3.1 索引的概念1.3.2 索引的分类1.3.3 索引的优点1.3.4 索引的缺点1.3.5 索引的使用场景…

高级身份威胁检测系统可检测拦截攻防演练漏洞

近期将迎来大型攻防演练活动。随着各种实战攻防演练活动和红队&#xff08;攻击队&#xff09;利用 0-Day 及 N-Day 漏洞频繁攻击&#xff0c;甲方的蓝队&#xff08;防守队&#xff09;会出现应接不暇。攻击队为了拿到靶机完成演习目的&#xff0c;一定会拿出最先进的攻击手段…

侯捷 C++ part2 兼谈对象模型笔记——4 specialization 特化

4. specialization 特化 4.1 全特化 full specialization 模板是泛化&#xff0c;特化是泛化的反面&#xff0c;可以针对不同的类型&#xff0c;来设计不同的东西 其语法为template<> struct xxx<type> template<> struct hash<char> { ...size_t …

window7 安装JDK17下载安装

1、下载JDK JDK下载官网&#xff1a;https://www.oracle.com/ 2、安装JDK 双击打开下载好的JDK进入安装界面 选择安装的位置 等待安装成功 安装成功 3、环境变量配置 右键此电脑选择属性选择高级系统设置&#xff08;展示是win7系统&#xff0c;win10也有仔细找找&#xff09;…

优思学院|质量第一的目的是什么?

国外有一句很著名的话&#xff1a;Quality comes first, profit is its logical sequence&#xff0c;意思是&#xff1a;质量第一&#xff0c;利润是其合理的结果&#xff0c;这句话也是很多公司或者商店使用的标语。 简而言之&#xff0c;只要你把质量放在第一位&#xff0c…

C语言 冒泡排序

目录 一、原理 二、代码演示 三、代码优化 一、原理 假设&#xff1a; int arr[] { 9,8,7,6,5,4,3,2,1,0 }; 将 arr 内的元素进行升序排列&#xff0c;得到一个新的数组 int arr[] { 0&#xff0c;1&#xff0c;2&#xff0c;3&#xff0c;4&#xff0c;5&#xff0c;…

数字经济时代,如何加强应用数据保护?

在数字经济时代&#xff0c;加强应用数据保护对于个人和组织来说至关重要。以下是一些加强应用数据保护的建议&#xff1a; 合规法律法规&#xff1a;了解并遵守适用于您所在地区或行业的数据保护法律法规。这包括个人隐私保护法、数据安全法等。 安全意识培训&#xff1a;为组…

Simulink仿真模块 - Trigonometric Function

Trigonometric Function:指定应用于输入信号的三角函数 在仿真库中的位置为:Simulink / Math Operations HDL Coder / Math Operations 模型为: 双击模型打开参数设置界面,如图所示: 说明 Trigonometric Function 模块执行常见的三角函数,并以 rad 为单位输出结…

京东h5滑块

大表哥们我又来了&#xff0c;今日话题&#xff1a;凑字数水文章。 今天来看看这个h5的滑块&#xff0c;老早之前写过一篇关于京东手势验证的&#xff0c;链接在这&#xff0c;大家感兴趣可以去看看。 京东手势验证_某东滑块_逆向学习之旅的博客-CSDN博客 这个怎么讲&#xf…

2023年第2季社区Task挑战赛升级新玩法,等你来战!

第1季都有哪些有趣的作品&#xff1f; 在大家的共建下&#xff0c;FISCO BCOS开源生态不断丰富完善&#xff0c;涌现了众多实用技术教程和代码&#xff1a;基于数字身份凭证的业务逻辑设计&#xff0c;贡献了发放数字身份凭证的参考实现&#xff1b;提供企业碳排放、慈善公益等…