内部微服务通信是否应该通过 zuul 网关?



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

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

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

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

是的,您可以使用微服务 A 调用微服务 B,而无需通过 Zull。可能您正在使用尤里卡服务器/客户端,那么您可以使用@LoadBalanced注释来利用它。假设您将使用 RestTemplate 来执行此操作:

在配置类中创建 Bean:

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

然后,当你想使用微服务 A 调用微服务 B 时,你只需要将名称放在 http 请求中(假设微服务的 application.name 是"microserviceb":

@Autowired
RestTemplate restTemplate;

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

如果要在此申请中继续传递令牌,可以在 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 安全性(

最新更新