Netflix Feign 请求拦截器

在 Netflix Feign 中,请求拦截器(Request Interceptor)是一个非常有用的组件。它允许你在每个 Feign 请求发送之前对请求进行自定义操作,比如添加请求头、修改请求参数、记录请求日志等。

请求拦截器在实现诸如认证、授权、统一日志记录等功能时非常方便。如下图:

3276c78e5a1826b3c24d29bb4c37f9b5_1730446883394-40b06c53-30e5-4fb8-9cf6-35a4b4d8c23c.png

创建请求拦截器

要创建一个请求拦截器,需要实现 feign.RequestInterceptor 接口。这个接口只有一个方法apply(RequestTemplate template),在这个方法中可以对 RequestTemplate 对象进行操作,该对象包含了即将发送的请求的所有信息,如请求 URL、请求头、请求体等。

以下是一个简单的示例,用于在每个请求中添加一个“X-Forwarded-For”请求头:

// 自定义请求拦截器
static class ForwardedForInterceptor implements RequestInterceptor {
    @Override
    public void apply(RequestTemplate template) {
        template.header("X-Forwarded-For", "origin.host.com");
    }
}

上面示例中,ForwardedForInterceptor 类实现了 RequestInterceptor 接口。在 apply() 方法中,通过template.header() 方法添加了一个名为“X-Forwarded-For”,值为“origin.host.com”的请求头到请求模板中。

配置请求拦截器

当使用 Feign.builder() 创建 Feign 客户端时,可以通过 requestInterceptor() 方法添加请求拦截器。例如:

// 创建Feign客户端实例的静态方法
static InterceptorFeign create() {
    return Feign.builder()
            .encoder(new Encoder.Default())
            .decoder(new Decoder.Default())
            .contract(new Contract.Default())
            // 添加请求拦截器
            .requestInterceptor(new ForwardedForInterceptor())
            .target(InterceptorFeign.class, "http://localhost:8090");
}

完整示例

下面是请求拦截器示例的完整代码:

(1)服务端代码,定义了一个简单的查询服务“/simple/interceptor”,如下:

@GetMapping("/interceptor")
public String interceptor(@RequestHeader("X-Forwarded-For") String xForwardedFor, @RequestParam("msg") String msg) {
    return "xForwardedFor=" + xForwardedFor + "<br/>msg=" + msg;
}

(2)定义 Feign 客户端代码,如下:

package com.hxstrive.demo_netflix_feign.feign;

import feign.*;
import feign.codec.Decoder;
import feign.codec.Encoder;

/**
 * Feign 请求拦截器
 * @author HuangXin
 */
public interface InterceptorFeign {

    // Feign 请求接口方法
    @RequestLine("GET /simple/interceptor?msg={msg}")
    String interceptor(@Param("msg") String message);

    // 自定义请求拦截器
    static class ForwardedForInterceptor implements RequestInterceptor {
        @Override
        public void apply(RequestTemplate template) {
            template.header("X-Forwarded-For", "origin.host.com");
        }
    }

    // 创建Feign客户端实例的静态方法
    static InterceptorFeign create() {
        return Feign.builder()
                .encoder(new Encoder.Default())
                .decoder(new Decoder.Default())
                .contract(new Contract.Default())
                // 添加请求拦截器
                .requestInterceptor(new ForwardedForInterceptor())
                .target(InterceptorFeign.class, "http://localhost:8090");
    }

}

(3)调用 Feign 客户端,如下:

@GetMapping("/")
public String index() {
    return InterceptorFeign.create().interceptor("hello");
}

运行结果如下图:

d00cbae5f216751e19263bbe96f4183d_1730445684287-e97cc12d-b168-4091-80da-5e514a70d532.png

从上面的输出信息可知,通过请求拦截器成功添加了“X-Forwarded-For”请求头信息。

说说我的看法
全部评论(
没有评论
关于
本网站专注于 Java、数据库(MySQL、Oracle)、Linux、软件架构及大数据等多领域技术知识分享。涵盖丰富的原创与精选技术文章,助力技术传播与交流。无论是技术新手渴望入门,还是资深开发者寻求进阶,这里都能为您提供深度见解与实用经验,让复杂编码变得轻松易懂,携手共赴技术提升新高度。如有侵权,请来信告知:hxstrive@outlook.com
公众号