内部 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安全)
我正在使用 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安全)