微服务远程调用之拦截器实战

微服务远程调用之拦截器实战

前言:

在我们开发过程中,很可能是项目是从0到1开发,或者在原有基础上做二次开发,这次是根据已有代码做二次开发,需要在我们微服务一【这里方便举例,我们后面叫模版微服务】调用微服务二【后面叫系统管理模块】

需求背景

1,模版服务需要给当前系统所有用户做默认的模版数据

2,用户数据在系统管理模块里面

3,需要将没有默认模板的用户的人查找出来,添加默认模板数据。

4,一般服务与服务之间调用要有请求头信息,比如token,user_id ...【遇到问题里面细讲】

使用步骤

1、引入openfeign依赖
c 复制代码
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
2、Feignclient远程接口
c 复制代码
package com.xx.xx.xx.feign.client;

import com.xx.xx.xx.api.R;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.http.HttpHeaders;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestHeader;
import org.springframework.web.bind.annotation.RequestParam;

/**
 * @author psd 
 *  xxx_manage_service 远程调用微服务的名字
 * 请求地址是全路径地址
 *
 */
@FeignClient(name = "xxx_manage_service")
public interface SmartGateWayClient {
  
       @GetMapping("/api/xx/portalMyConfig/queryAllPortalMyConfig")
       R<List<MyxxxConfigVo>> queryAllMyxxxConfigVo();

}
3、编写feignClient拦截器

每次远程调用前,设置请求头信息

c 复制代码
package com.xx.xx.xx.interceptor;

import feign.RequestInterceptor;
import feign.RequestTemplate;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;

import javax.servlet.http.HttpServletRequest;

/**
 * @author psd 远程调用拦截器设置头参数信息
 */
@Slf4j
@Component
public class FeignClientInterceptor implements RequestInterceptor {

    HttpServletRequest request;

    public FeignClientInterceptor(HttpServletRequest request) {
        this.request = request;
    }

    @Override
    public void apply(RequestTemplate requestTemplate) {
        // 设置请求头的数据
        requestTemplate.header("Authorization",request.getHeader("Authorization"));
        // TODO:有的还需要添加 user_id 信息 
        log.info("FeignClientInterceptor 拦截器中的请求头的信息 Authorization :{}",request.getHeader("Authorization"));
    }
}
4、主启动类添加@EnableFeignClients 注解
c 复制代码
package com.xx.xxx.platform;

import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import org.springframework.cloud.context.config.annotation.RefreshScope;
import org.springframework.cloud.openfeign.EnableFeignClients;
import org.springframework.scheduling.annotation.EnableScheduling;
import springfox.documentation.swagger2.annotations.EnableSwagger2;

/**
 * @author psd
 */

@RefreshScope
@EnableSwagger2
@EnableScheduling
@EnableFeignClients
@EnableDiscoveryClient
@MapperScan("xx.xx.xx.xx.mapper")
@SpringBootApplication
public class PortalPlatformApplication {
    public static void main(String[] args) {
        SpringApplication.run(PlatformApplication.class, args);
    }
}

遇到的问题

1、使用Feignclient 是从网关还是直接走指定微服务

网关现在理解就是所有的请求都走网关,就是负载均衡,路由转发作用... 看项目需求一般走指定微服务

2、编写Feignclient拦截器时候,有时需要添加user_id 信息,在系统管理服务里面有拦截,这个不一定,具体业务具体分析
3、有个远程调用返回MyxxxConfigVo 里面有个时间
c 复制代码
 /**
     * 创建时间
     */
    
    private LocalDateTime createTime;
    /**
     * 修改时间
     */
    private LocalDateTime updateTime;

在项目接收方也是这个数据类型,报以下异常

Caused by: org.springframework.web.client.RestClientException: Error while extracting response for type [com.pubinfo.smart.common.web.R<java.util.List<com.xx.xx.xx.feign.vo.MyxxxConfigVo >>] and content type [application/json;charset=UTF-8]; nested exception is org.springframework.http.converter.HttpMessageNotReadableException: JSON parse error: Cannot deserialize value of type java.time.LocalDateTime from String "2024-05-25T16:25:02": Failed to deserialize java.time.LocalDateTime: (java.time.format.DateTimeParseException) Text '2024-05-25T16:25:02' could not be parsed at index 10; nested exception is com.fasterxml.jackson.databind.exc.InvalidFormatException: Cannot deserialize value of type java.time.LocalDateTime from String "2024-05-25T16:25:02": Failed to deserialize java.time.LocalDateTime: (java.time.format.DateTimeParseException) Text '2024-05-25T16:25:02' could not be pars

大概意思是返回JSON String "2024-05-25T16:25:02": 不能转换为 LocalDateTime 类型的时间。

修改为以下问题解决。

c 复制代码
    /**
     * 创建时间
     */
    @JsonFormat(pattern = "yyyy-MM-dd'T'HH:mm:ss")
    private LocalDateTime createTime;

    /**
     * 修改时间
     */
    @JsonFormat(pattern = "yyyy-MM-dd'T'HH:mm:ss")
    private LocalDateTime updateTime;
4、自定义模版服务调用系统管理服务 在请求的时候报 用户不存在

详细描述:

但是添加了token的信息,且token不为空,这个后面猜测可能是在系统管理服务里面有个拦截器需要校验user_id 是否为空,为空就报异常。

后面在远程调用前添加 请求头信息user_id 的值。问题解决

喜欢我的文章的话,点个阅读或者点个点赞,是我编写博客的动力,持续更新中 ing...

相关推荐
消失的旧时光-19433 分钟前
第二十一课:系统是怎么一步步拆坏的?——单体到模块化实践(完整工程版)
java·spring boot·后端·架构
乐茵lin5 分钟前
github开源项目 “校园活动平台“ —— 报名活动二维码生成核销流程详解
计算机·微服务·golang·开源·github·大学生·zero
Coder_Boy_14 分钟前
Java高级_资深_架构岗 核心知识点(云原生)
java·云原生·架构
Coder_Boy_18 分钟前
Java高级_资深_架构岗 核心面试知识点(AI整合+混合部署)
java·人工智能·spring boot·后端·面试·架构
乘风gg22 分钟前
企业级 Prompt 工程实战指南(下):构建可复用 Prompt 架构平台
前端·面试·架构
X54先生(人文科技)27 分钟前
20260212_Meta-CreationPower_Development_Log(启蒙灯塔起源团队开发日志)
人工智能·机器学习·架构·团队开发·零知识证明
海山数据库32 分钟前
移动云大云海山数据库(He3DB)存算分离架构下Page页存储正确性校验框架介绍
数据库·架构·he3db·大云海山数据库·移动云数据库
AC赳赳老秦37 分钟前
云原生AI趋势:DeepSeek与云3.0架构协同,提升AI部署性能与可移植性
大数据·前端·人工智能·算法·云原生·架构·deepseek
Tadas-Gao37 分钟前
大模型实战装备全解析:从本地微调到移动算力的笔记本电脑选择指南
架构·系统架构·大模型·llm
GJGCY1 小时前
2026企业级RPA技术对比:架构与落地能力谁占优?
人工智能·ai·架构·rpa·智能体·数字员工