You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

微服务通信:跨微服务校验实体存在性的实现问询

从单体到微服务:客户存在性校验的实现与问题解决

单体架构的常规实现

在单体应用里,我们可以直接在控制器中注入业务服务,通过调用服务方法就能完成客户存在性的校验,示例代码如下:

@RequestMapping( value = "api/loanapplications/customers/{customerId}", produces = MediaType.APPLICATION_JSON_VALUE, method = RequestMethod.GET)
public ResponseEntity<List<LoanDto>> getLoansByCustomerId(@PathVariable String customerId) {
    if(/* 调用customerService.findCustomerById()校验客户不存在的条件 */){
        throw new CustomerNotFoundException(String.format("Customer with id %s doesn't exist!", customerId));
    }
}

这种方式无需跨服务通信,直接在应用内部就能完成校验逻辑。

微服务架构下的踩坑经历

迁移到微服务架构后,我需要调用客户服务的接口来完成客户存在性校验,于是尝试用RestTemplate直接调用:

Customer customer = restTemplate.getForObject("http://localhost:9080/api/customers/" + customerId, Customer.class);

结果却遇到了org.springframework.web.client.HttpClientErrorException$Unauthorized: 401 Unauthorized错误,甚至返回500内部服务器状态码。

我明明已经按照非跨服务接口(比如POST /api/customers)的方式,在请求头里传入了JWT访问令牌,而且那些接口都能正常工作,所以我推测是跨服务调用时请求头丢失,导致JWT令牌没有传递到客户服务端。

问题解决:通过网关发起跨服务调用

经过排查,发现问题的核心原因是跨微服务调用时没有使用网关API。在微服务架构中,服务间的调用应该统一通过网关来转发:

  • 网关会自动处理请求头的传递,包括JWT令牌的转发,避免手动传递时出现丢失的情况;
  • 网关还能统一处理认证、限流、路由等通用逻辑,让服务间的调用更规范、更可靠。

把调用地址改成网关的地址后,跨服务调用的认证问题就解决了,客户存在性的校验也能正常完成。

内容的提问来源于stack exchange,提问作者Schroedinger

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.14 06:46:58