java内部微服务通信应该通过zuul网关吗?
我正在使用Spring框架创建一个微服务项目,但我在内部微服务调用方面遇到了问题。 当用户调用微服务a的端点时,请求将通过zuul网关检查jwt令牌是否有效,以及用户的角色是否允许他访问该端点。。 如果一切都有效,用户将被重定向到微服务A的端点。。 到目前为止,一切都很清楚。但是当微服务A的端点调用微服务B的另一个端点时,问题就开始了。 通常情况下,我需要做的是将用户的jwt传递到请求头中的微服务B。。但是,如果用户的角色不允许他访问微服务B的端点,该怎么办? 我现在正在做的是在微服务a中生成一个新的jwt,并在调用微服务B时使用系统角色。。 但我认为这不是一个好的做法,因为: 生成一个新的jwt迫使我将私钥放入每个微服务中,这样每当我需要它时,它就可以创建一个有效的jwt。。我知道我只能让一个微服务这样做,并让其他微服务调用它来请求一个新的jwt。。但我有可能陷入更严重的安全漏洞,例如,如果用户查看其互联网流量,他将能够看到jwt,其角色是系统,并使用它来做他想做的事情
这一切都是因为微服务A通过zuul gateway调用微服务B
我的问题是:如果是内部通话,是否必须通过zuul?微服务A可以不通过zuul呼叫微服务B吗?在这种情况下,jwt的验证仅在用户调用微服务A时进行,一旦zuul验证了jwt,微服务就可以进行内部通信,而无需在每次内部调用中验证jwt?它还允许我避免为每个内部调用创建带有系统角色的jwt
这是个好习惯吗?这不会导致安全问题吗?这是否会导致其他问题,例如在部署期间?还有其他更好的解决方案吗
# 1 楼答案
是的,您可以使用microservice A调用microservice B,而无需通过Zull。您可能正在使用Eureka服务器/客户端,然后可以使用@LoadBalanced annotation利用它。假设您将使用RestTemplate完成此操作:
在配置类中创建Bean:
然后,当您想使用微服务A调用微服务B时,只需在http请求中输入名称(假设application.name of microservice be为“microservice B”:
如果你想继续在这个请求中传递令牌,你可以通过RestController方法获得他,比如:
我在微服务通信方面没有任何问题,唯一应该避免的是客户端直接调用某个微服务,而无需通过网关(在这种情况下,您可以使用一些防火墙配置或spring security)