7

根据 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,因此它提供的结果值为 not java.util.concurrent.CompletionStagebut scala.concurrent.Future与CompletionStage#doWithService等其他 Lagom API 结合使用会很痛苦。

4

3 回答 3

2

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

想象一下您的代码想要与 Slack 的 API 交互,您将slack-api在您的应用程序中创建一个项目并在那里创建Slack 描述符(您当然不需要创建slack-impl)。

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

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

于 2017-01-19T22:53:10.220 回答
1

由于之前的答案都没有包含有关如何在 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 v. 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(...))
于 2019-01-16T01:47:19.300 回答
0

在 Lagom 中,任何第 3 方应用程序/服务都可以作为非托管服务访问。您需要像这样在 application.conf 中添加它

#external-services lagom.services { 3rd-party-service-identifier = "http://3rd-party-service-url" ... } 并且还需要像这样在 pom.xml 中添加 3rd 方服务 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 了解 3rd 方服务的方式,但要让 lagom 使用该服务,请转到下面的链接。 https://www.lagomframework.com/documentation/1.4.x/java/IntegratingNonLagom.html

于 2018-06-06T12:33:56.413 回答