2017-07-25 131 views
1

我打算创建一个微服务应用程序,并提供处理数据的专用服务(主要是基于Mongodb的服务)。我想知道是否有一种方法可以让我的其他微服务能够与此服务通信以利用共享数据。 JHipster API网关有可能吗? 如果不是我怎么能做到这一点。我不想在每个微服务中保留相同数据的多个副本。微服务如何可以与JHipster中的其他微服务对话

+0

微服务之间的依赖关系应尽可能避免,它只会让您的整体解决方案变得更慢更弱,这可能表明您的域边界是错误的(请参阅DDD)。您的问题缺乏详细信息,但网关将JWT令牌传递给可将其转发给其他服务的服务 –

+0

不要执行专用数据存储。每个MS应该有自己的持久性。 –

回答

1

您可以将所有微服务注册到相同的注册表,然后他们可以互相调用。

UPDATE:这是我如何使它工作。 在微服务消费的数据之一,使用RestTemplate与当前用户JWT令牌授权的头,使API调用:使用ClientHttpRequestInterceptor在头部添加标记

@Component 
public class AuthenticateClientHttpRequestInterceptor implements ClientHttpRequestInterceptor { 

    @Override 
    public ClientHttpResponse intercept(HttpRequest httpRequest, byte[] bytes, ClientHttpRequestExecution clientHttpRequestExecution) throws IOException { 
     String token = SecurityUtils.getCurrentUserJWT(); 
     httpRequest.getHeaders().add("Authorization","Bearer "+token); 
     return clientHttpRequestExecution.execute(httpRequest, bytes); 
    } 
} 

我定制restTemplate。

@Configuration 
public class CustomBean { 
    @Autowired 
    AuthenticateClientHttpRequestInterceptor interceptor; 
    @Bean 
    @LoadBalanced 
    public RestTemplate restTemplate() { 
     RestTemplate restTemplate = new RestTemplate(); 
     restTemplate.setInterceptors(Collections.singletonList(interceptor)); 
     return restTemplate; 
    } 
} 

而且在你正在进行的呼叫数据资源控制器:

@RestController 
@RequestMapping("/api") 
public class DataResource {  
    @Autowired 
    RestTemplate restTemplate; 

      @PostMapping("/hello") 
      @Timed 
      public ResponseEntity<Hello> createHello(@RequestBody Hello Hello) throws URISyntaxException { 

    //The name your data micro service registrated in the Jhipster Registry 
       String dataServiceName = "data_micro_service"; 

       URI uri = UriComponentsBuilder.fromUriString("//" + dataServiceName + "/api/datas") 
        .build() 
        .toUri(); 

       //call the data microservice apis 
       List<Data> result = restTemplate.getForObject(uri, Data[].class); 


      return ResponseEntity.created(new URI("/api/hellos/" + result.getId())) 
        .headers(HeaderUtil.createEntityCreationAlert(ENTITY_NAME, result.getId().toString())) 
        .body(result); 

     } 

} 
+0

救命!我一直试图弄清楚这几个星期了... –

+0

不客气! – freemanpolys

0

典型的微服务相互交谈。这就是整个问题。在发现Eureka的情况下,您只需通过名称而不是通常在没有微服务的情况下使用的FQDN来调用微服务。

例如,您book-service将调用author-service这样 http://author-service/authors

这里充分例如https://spring.io/blog/2015/01/20/microservice-registration-and-discovery-with-spring-cloud-and-netflix-s-eureka

请不要忘记,JHipster是基于关春云的自以为是的框架,这样你就可以通过搜索春天文档发现大多数的这些东西。