微服务如何与JHipster中的其他微服务进行通信

时间:2017-07-25 18:41:32

标签: jhipster microservices

我计划创建一个微服务应用程序,其中包含用于处理数据的专用服务(主要是基于Mongodb的服务)。我想知道是否有一种方法可以使用我的其他微服务与该服务进行通信以利用共享数据。是否可以使用JHipster API Gateway? 如果不是,我怎么能实现这一点。我不想在每个微服务中保留相同数据的多个副本。

4 个答案:

答案 0 :(得分:2)

您可以将所有微服务注册到同一个注册表,然后他们可以互相呼叫。

更新:以下是我的工作原理。 在使用数据的微服务中,使用RestTemplate与标头中的当前用户jwt令牌授权进行api调用:

@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使用ClientHttpRequestInterceptor在标题中添加标记。

@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);

        }

}

答案 1 :(得分:2)

您还可以将Feign客户端与JHipster一起使用。

SpringBootApplication注释您的@EnableFeignClients

...
import org.springframework.cloud.openfeign.EnableFeignClients;
...
@SpringBootApplication
@EnableConfigurationProperties({LiquibaseProperties.class, ApplicationProperties.class})
@EnableDiscoveryClient
@EnableFeignClients
public class MyApp {
    ...
}

在微服务中创建Feign客户端

...
import org.springframework.cloud.openfeign.FeignClient;
...
@FeignClient("another-service")
public interface AnotherClient {

    @RequestMapping(method = RequestMethod.GET, value = "/api/another")
    List<AnotherDTO> getAll();
}

向Feign客户端注入@Autowired并调用它。应该可以使用了。

@RestController
@RequestMapping("/api")
public class MyResource {
    ...
    @Autowired
    private AnotherClient anotherClient;
    ...
    @GetMapping("/another")
    @Timed
    public List<AnotherDTO> getAll() {
        log.debug("REST request to get all");
        return anotherClient.getAll();
    }
}

对我们来说,它无需实现ClientHttpRequestInterceptor和设置JWT令牌即可工作。

答案 2 :(得分: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是一个基于Spring Cloud的固定框架,因此您可以通过搜索Spring文档找到大部分内容。

答案 3 :(得分:0)

您可以使用以下解决方案: 微服务 A(即 UAA-SERVICE)和微服务 B 微服务 B 想要连接微服务 A 并使用 Feign 客户端调用服务。

1)微服务B的这段代码 客户端代理 :- @AuthorizedFeignClient(name = "UAA-SERVICE")

@AuthorizedFeignClient(name = "UAA-SERVICE")

公共接口 UaaServiceClient {

@RequestMapping(method = RequestMethod.GET, path = "api/users")
public List<UserDTO> getUserList();

@RequestMapping(method = RequestMethod.PUT, path = "api/user-info")
public String updateUserInfo(@RequestBody UserDTO userDTO);

}

UAA-SERVICE :通过注册表运行应用程序实例找到此名称。

2) 在微服务 B (application.yml) 增加假客户端连接超时: 假装: 客户: 配置: 默认:
连接超时:10000 读取超时:50000

增加 hystrix 线程超时:-

hystrix: 命令: 默认: 执行: 隔离: 线: timeoutInMilliseconds: 60000 shareSecurityContext: 真

3) 在主 @SpringBootApplication 类中添加 @EnableFeignClients。 这个解决方案对我来说效果很好。