【问题标题】:How to manually call a microservice from a JHIPSTER gateway repository or service如何从 JHIPSTER 网关存储库或服务手动调用微服务
【发布时间】:2016-09-30 12:55:57
【问题描述】:

我是 Jhipster 的新手,想知道是否可以使用 RestTemplate 或其他方式从网关代码手动调用微服务。

我的第一个想法是调用网关本身......但我不确定这是一个好主意。 我的第二个想法是尝试通过它的 URL 调用该服务。我担心的是我不想硬编码给定节点的端口。相反,我想使用适当的负载平衡。

我看过这篇文章https://dzone.com/articles/spring-cloud-rest-client-with-netflix-ribbon-basic,但是注入失败了。

我在其他地方读到您现在需要手动添加 bean 声明

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

但现在我正在为实际的 URI 苦苦挣扎:我应该把什么作为根? (xxxxx)

final HcpVersionedhcp hcpVersionedhcp = 
            restTemplate.exchange("http://xxxxx/api/user-data/byLogin/", UserData.class);

我在网关 application.yml 中的唯一配置是

ribbon:
eureka:
    enabled: true

【问题讨论】:

    标签: spring jhipster resttemplate netflix-ribbon


    【解决方案1】:

    “xxxxx”必须替换为您的服务名称。如果你的服务是“foo”,你应该写http://foo/api/user...。

    如果您使用 JWT 作为身份验证,则需要在 JHipster 中使用用户 a 进行身份验证,或者尽可能从请求中传递 JWT 令牌。但是,这不是 JWT 身份验证的最佳实践,所以我建议采用 JHipster UAA 方式。 简而言之,您还有一项服务负责身份验证和授权。要从其他服务访问您的服务,您可以在接口上使用@AuthorizedFeignClient,类似于 JPA。

    所以你定义:

    @AuthorizedFeignClient(name = "xxxx")
    interface XxxClient {
    
       @RequestMapping(value = "/api/some-entities/{id}")
       SomeEntity getSomeEntityById(Long @Path("id") id);
    }
    

    并像这样将其注入任何 spring 服务/rest-controller 中:

    @Inject
    private XxxClient xxxClient;
    
    //...
    
    public void someAction() {
       //...
       xxxClient.getEntityById(id);
       //..
    }
    

    在内部实现客户端授权流程...

    【讨论】:

    • 好吧,它似乎工作。我还必须添加@EnableFeignClients,但其他一切都有效。
    猜你喜欢
    • 2018-12-10
    • 2020-06-05
    • 2019-06-07
    • 1970-01-01
    • 1970-01-01
    • 2019-09-18
    • 1970-01-01
    • 2020-11-12
    • 2021-08-26
    相关资源
    最近更新 更多