微服务中传递公共参数,在网关层header添加参数,各子微服务,openfeign,线程池等地方拿到网关传递过来的参数

需求:

网关层在header中添加参数,header-user_id=1001,header-user_name=小明

各个子微服务,可以通过openfeign,线程池等方式拿到上面的参数

1 网关层 gateway添加需要传递的参数信息

复制代码
import cn.hutool.core.net.URLEncodeUtil;
import org.springframework.cloud.gateway.filter.GatewayFilterChain;
import org.springframework.cloud.gateway.filter.GlobalFilter;
import org.springframework.core.Ordered;
import org.springframework.core.io.buffer.DataBuffer;
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpStatus;
import org.springframework.http.MediaType;
import org.springframework.http.server.reactive.ServerHttpRequest;
import org.springframework.http.server.reactive.ServerHttpResponse;
import org.springframework.stereotype.Component;
import org.springframework.web.server.ServerWebExchange;
import reactor.core.publisher.Mono;

/**
 * 认证过滤器组件
 * 该组件用于检查请求中的认证令牌,以确保只有合法的请求才能继续传递到下游服务
 */
@Component
public class AuthFilter implements GlobalFilter, Ordered {

    /**
     * 过滤器的主要逻辑
     * 检查请求中的令牌,如果不是预期的令牌,则返回未授权的状态
     * 如果令牌有效,则在请求头中添加公共请求参数,并将请求传递给下游服务
     *
     * @param exchange 当前的服务器Web交换对象,包含请求和响应信息
     * @param chain    网关过滤器链,用于将请求传递给下一个过滤器或最终的目标服务
     * @return Mono<Void> 表示异步处理的空结果
     */
    @Override
    public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
        ServerHttpRequest request = exchange.getRequest();
        String token = getToken(request);
        // 根据自己的逻辑来判断处理
        if (!"xxx".equals(token)) {
            ServerHttpResponse response = exchange.getResponse();
            response.setStatusCode(HttpStatus.UNAUTHORIZED);
            response.getHeaders().add(HttpHeaders.CONTENT_TYPE, MediaType.TEXT_PLAIN_VALUE);
            DataBuffer dataBuffer = response.bufferFactory().wrap("Invalid token".getBytes());
            return response.writeWith(Mono.just(dataBuffer));
        }

        // 放入公共请求参数到请求头中,向下层服务中传递
        ServerHttpRequest.Builder mutate = request.mutate();
        mutate.header("header-user_id", "1001");
        mutate.header("header-user_name", URLEncodeUtil.encode("小明"));
        return chain.filter(exchange.mutate().request(mutate.build()).build());
    }

    /**
     * 获取请求中的令牌
     * 当前实现简单地从请求头中获取名为"token"的值
     *
     * @param request 当前的HTTP请求对象
     * @return String 表示请求中的令牌
     */
    private String getToken(ServerHttpRequest request) {
        return request.getHeaders().getFirst("token");
    }

    /**
     * 获取过滤器的顺序
     * 返回Ordered.LOWEST_PRECEDENCE表示该过滤器具有最低的优先级
     *
     * @return int 表示过滤器的顺序值
     */
    @Override
    public int getOrder() {
        return Ordered.LOWEST_PRECEDENCE;
    }
}

2 新建一个中间处理层微服务,处理openfeign,普通请求,线程池中拿到header参数传递的逻辑

3 在各个子微服务中拿参数,@FeignClient要加上configuration 属性

复制代码
@FeignClient(name = "chao-chi-service", path = "/chi_controller",configuration = SystemContextRequestInterceptor.class)

@GetMapping("/getheadparam")
public String test1() {
        
        Map<String, String> contextMap = SystemContextHolder.getSystemContext().getContextMap();
        log.info("contextMap:{}", JSONUtil.toJsonPrettyStr(contextMap));
        
        this.threadPoolExecutor.execute(() -> {
            log.info("通过线程池 execute 执行任务,{}", SystemContextHolder.getSystemContext().getContextMap());
        });
        
        //5、使用线程池执行任务,调用的是 submit 方法
        this.threadPoolExecutor.submit(() -> {
            log.info("通过线程池 submit 执行任务,{}", SystemContextHolder.getSystemContext().getContextMap());
        });
        
        return "我是child-service-getHeadParam--------------"+JSONUtil.toJsonStr(contextMap);
    }

代码链接

复制代码
通过网盘分享的文件:微服务网关层发送参数-各子微服务通过openfeign-线程池等方式拿到参数.rar
链接: https://pan.baidu.com/s/1_NrJ-wz7-zmGlIskdPApwA?pwd=88cx 提取码: 88cx
相关推荐
min18112345619 分钟前
HR人力资源招聘配置流程图制作教程
大数据·网络·人工智能·架构·流程图·求职招聘
升职佳兴42 分钟前
从 0 到 1:我做了一个提升 AI 对话效率的浏览器插件(架构+实现+发布)
人工智能·架构
BullSmall43 分钟前
SEDA (Staged Event-Driven Architecture, 分阶段事件驱动架构
java·spring·架构
Coder_Boy_1 小时前
基于SpringAI的在线考试系统-DDD(领域驱动设计)核心概念及落地架构全总结(含事件驱动协同逻辑)
java·人工智能·spring boot·微服务·架构·事件驱动·领域驱动
小北方城市网2 小时前
SpringBoot 集成 RabbitMQ 实战(消息队列解耦与削峰):实现高可靠异步通信
java·spring boot·python·微服务·rabbitmq·java-rabbitmq·数据库架构
sunfove2 小时前
光电共封装(CPO):突破算力互连瓶颈的关键架构
人工智能·架构
装不满的克莱因瓶2 小时前
【2026最新 架构环境安装篇三】Docker安装RabbitMQ4.x详细教程
linux·运维·docker·容器·架构·rabbitmq
Coder_Boy_4 小时前
基于SpringAI的在线考试系统-DDD(领域驱动设计)核心概念及落地架构全总结 (2)
java·人工智能·spring boot·架构·serverless·ddd·服务网格
Python_Study20254 小时前
TOB机械制造企业获客困境与技术解决方案:从传统模式到数字化营销的架构升级
大数据·人工智能·架构
小程同学>o<4 小时前
嵌入式之ARM体系与架构面试题(一)硬件基础篇
arm开发·笔记·学习·面试·架构