内部 micro-services 通信应该通过 zuul 网关吗?

Should internal micro-services communication goes through zuul gateway?

我正在使用 Spring 框架创建一个微服务项目,但我遇到了内部微服务调用的问题。 当用户调用 微服务 A 的端点时,请求通过 zuul 网关检查 jwt 令牌是否有效,以及用户的角色是否允许他访问该端点。 如果一切都有效,用户将被重定向到 微服务 A 的端点。 到目前为止一切都很清楚。但是当 微服务 A 的端点调用 微服务 B 的另一个端点时,问题就开始了。 通常,我要做的是在请求的 header 中将用户的 jwt 传递给 微服务 B.. 但是如果用户的角色不允许他怎么办访问 微服务 B 的端点? 我现在正在做的是在 微服务 A 中生成一个新的 jwt,它具有 SYSTEM 角色,以便在调用 微服务 B[ 时使用它=35=].. 但出于这个原因,我认为这不是一个好习惯: 生成一个新的 jwt 迫使我将我的私钥放入每个微服务中,以便它可以在我每次需要它时创建一个有效的 jwt ..我知道我只能让一个微服务这样做,并让其他微服务调用它来询问新的 jwt .. 但我冒着陷入更严重的安全漏洞的风险,例如,如果用户查看其互联网流量,他将能够看到角色为 SYSTEM 的 jwt 并将其用于做他想做的。

这一切都是因为微服务A通过zuul网关调用微服务B

我的问题是:如果调用是内部调用,是否必须通过 zuul? 微服务A可以不通过zuul调用微服务B吗?在这种情况下,jwt 的验证仅在用户调用 微服务 A 时完成,一旦通过 zuul 验证,微服务就可以在内部进行通信,而无需在每个内部验证 jwt称呼?它还允许我避免为每个内部调用创建一个具有 SYSTEM 角色的 jwt。

这是一个好习惯吗?这不会引起安全问题吗?这不会导致任何其他问题,例如在部署期间?还有其他更好的解决方案吗?

是的,您可以使用微服务A调用微服务B,而无需通过Zull。可能您正在使用 Eureka Server/Client 然后您可以使用 @LoadBalanced 注释来利用它。假设您将使用 RestTemplate 来完成它:

在配置中创建 Bean class:

@Bean
@LoadBalanced
public RestTemplate restTemplate() {
    RestTemplate restTemplate = new RestTemplate();
    return restTemplate;
}

那么当你想使用微服务A调用微服务B时,​​你只需要在http请求中输入名字即可(假设application.name微服务be是"microserviceb":

@Autowired
RestTemplate restTemplate;
        
    public Object getObject(String xyz) {
    Object result = restTemplate.getForObject("http://microserviceb/someresource/{xyz}", Object.class, xyz);        
    return result;
}

如果你想在这个申请中继续传递token,可以在RestController方法中获取他,点赞:

@GetMapping("/someMapping")
public String someMethod(@RequestHeader("Authorization") String accessToken) {
            
   HttpHeaders headers = new HttpHeaders();
   headers.setContentType(MediaType.APPLICATION_JSON);
   headers.set("Authorization", "Bearer "+accessToken);
            
   HttpEntity<String> entity = new HttpEntity<String>(requestJson,headers);
   String result = restTemplate.postForObject(http://microserviceb/someresource, entity, String.class);
   return result;           
}

我在微服务通信方面没有任何问题,唯一你应该避免的是客户端直接调用一些微服务而不通过网关(在这种情况下你可以使用一些防火墙配置或spring安全)