微服务通信:跨微服务校验实体存在性的实现问询
从单体到微服务:客户存在性校验的实现与问题解决
单体架构的常规实现
在单体应用里,我们可以直接在控制器中注入业务服务,通过调用服务方法就能完成客户存在性的校验,示例代码如下:
@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
相关产品推荐
相关产品推荐

