前言:
在我们开发过程中,很可能是项目是从0到1开发,或者在原有基础上做二次开发,这次是根据已有代码做二次开发,需要在我们微服务一【这里方便举例,我们后面叫模版微服务】调用微服务二【后面叫系统管理模块】
需求背景
1,模版服务需要给当前系统所有用户做默认的模版数据
2,用户数据在系统管理模块里面
3,需要将没有默认模板的用户的人查找出来,添加默认模板数据。
4,一般服务与服务之间调用要有请求头信息,比如token,user_id …【遇到问题里面细讲】
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
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();
}
每次远程调用前,设置请求头信息
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"));
}
}
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);
}
}
网关现在理解就是所有的请求都走网关,就是负载均衡,路由转发作用… 看项目需求一般走指定微服务
/**
* 创建时间
*/
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
大概意思是返回JSON String “2024-05-25T16:25:02”: 不能转换为 LocalDateTime 类型的时间。
修改为以下问题解决。
/**
* 创建时间
*/
@JsonFormat(pattern = "yyyy-MM-dd'T'HH:mm:ss")
private LocalDateTime createTime;
/**
* 修改时间
*/
@JsonFormat(pattern = "yyyy-MM-dd'T'HH:mm:ss")
private LocalDateTime updateTime;
详细描述:
但是添加了token的信息,且token不为空,这个后面猜测可能是在系统管理服务里面有个拦截器需要校验user_id 是否为空,为空就报异常。
后面在远程调用前添加 请求头信息user_id 的值。问题解决
喜欢我的文章的话,点个阅读或者点个点赞,是我编写博客的动力,持续更新中 ing…