在Lagom中使用外部REST服务的最简单方法是什么?

时间:2016-05-29 09:33:59

标签: java lagom

根据Lagom文档,我们可以定义外部服务URI(如下所示)并可以从ServiceLocator获取它。

lagomUnmanagedServices in ThisBuild := Map("weather" -> "http://localhost:3333")

http://www.lagomframework.com/documentation/1.0.x/ServiceLocator.html#Communicating-with-external-services

在Lagom中调用外部REST API的最简单方法是什么?

我考虑在Lagom中使用WsClient,但我没有选择它。 Lagom仅包含用于Scala的WsClient,因此它提供的结果值不是java.util.concurrent.CompletionStage,而是scala.concurrent.Future。 将其与其他Lagom API(如CompletionStage#doWithService)结合起来会很痛苦。

3 个答案:

答案 0 :(得分:1)

从lagom使用第三方REST服务的一种方法是使用Lagom Descriptor编写第三方的REST规范。

想象一下,您的代码想要与Slack的API进行交互,您可以在应用中创建一个slack-api项目并在那里创建Slack descriptor(您不需要创建slack-impl疗程)。

然后,在您的fancy-impl代码中,您将依赖于slack-api,并且在FancyServiceImpl实现中,您将在构造函数中注入SlackService

PS:要点是scala代码,但同样的想法适用于Lagom的Java DSL。

答案 1 :(得分:0)

在Lagom中,任何第三方应用程序/服务都可以作为非托管服务进行访问。您需要在application.conf中添加它,如此

#external-services lagom.services { 3rd-party-service-identifier = "http://3rd-party-service-url" ... } 并且还需要在pom.xml中添加第三方服务URL作为unmanagedService,如此

<plugin>
    <groupId>com.lightbend.lagom</groupId>
    <artifactId>lagom-maven-plugin</artifactId>
    <version>${lagom.version}</version>
    <configuration>
      <kafkaEnabled>false</kafkaEnabled>
      <cassandraEnabled>false</cassandraEnabled>
      <unmanagedServices>
        <3rd-party-service-identifier>${3rd-party-service-URL}</3rd-party-service-identifier>
      </unmanagedServices>
    </configuration>
  </plugin>

这就是你让Lagom了解第三方服务的方法,但要使用该服务,请访问以下链接。 https://www.lagomframework.com/documentation/1.4.x/java/IntegratingNonLagom.html

答案 2 :(得分:0)

由于先前的答案均未包含有关如何在Java中实现它的完整信息,因此我将按照以下方式进行操作:

  1. 创建Lagom API模块,例如external-service-api并将请求/响应DTO和Lagom服务放入其中,例如:

    public interface ExternalService extends Service {
    
        ServiceCall<ExternalServiceRequest, ExternalServicePostResponse> somePostMethod();
    
        ServiceCall<NotUsed, ExternalServiceGetResponse> someGetMethod();
    
        @Override
        default Descriptor descriptor(){
            return Service.named("external-service").withCalls(
                Service.pathCall("/post-endpoint", this::somePostMethod),
                Service.pathCall("/get-endpoint", this::someGetMethod)
            ).withAutoAcl(true);
        }
    }
    
  2. 在要使用它的impl模块中将依赖项添加到您的external-service-api。

  3. 在* Module.java中注册您的服务。使用:bindClient(ExternalService.class);

  4. 现在最棘手的部分是,我发现了一些教程/存储库,其中在实现模块的pom.xml中定义了非托管服务。它对我不起作用,我也不知道为什么(Lagom诉1.4.5,Scala二进制文件2.12)。我要做的是将unmanagedServices定义放在项目根目录pom.xml中。请注意,unmanagedService子元素的名称应与描述符中定义的名称相同。

        <plugin>
            <groupId>com.lightbend.lagom</groupId>
            <artifactId>lagom-maven-plugin</artifactId>
            <version>${lagom.version}</version>
            <configuration>
                <unmanagedServices>
                    <external-service>http://api.url.com/</external-service>
                </unmanagedServices>
            </configuration>
        </plugin>
    
  5. 注入您的服务:

    @Inject
    public SomeConstructor(ExternalService externalService){
        ...
    }
    
  6. 要使用它,请致电:externalService.somePostMethod().invoke(new ExternalServiceRequest(...))