现在我们已经部署了hello microservice,让我们从另一个微服务中使用它。我们将在本节中部署的代码在Github的openshift/hello-microservice- customer -openshift目录中。
要消费微服务,我们首先要找到它。OpenShift提供了一个服务发现机制。可以使用环境变量、DNS或Vert.x服务查找,我们在这里使用的就是Vert.x的服务发现。项目的 pom.xml被配置为导入Vert.x服务发现、Kubernetes服务导入器和服务器端服务发现。您不必显式的在提供端注册service,因为Fabric8 Maven插件会为我们注册这些service。我们的消费者将会检索这个OpenShift的service而不是pod。
@Override
public void start() {
Router router = Router.router(vertx);
router.get("/").handler(this::invokeHelloMicroservice);
// Create the service discovery instance
ServiceDiscovery.create(vertx, discovery -> {
// Look for an HTTP endpoint named "hello-microservice"
// you can also filter on 'label'
Single<WebClient> single = HttpEndpoint.rxGetWebClient
(discovery, rec -> rec.getName().equals
("hello-microservice"),
new JsonObject().put("keepAlive", false));
single.subscribe(
client -> {
// the configured client to call the microservice
this.hello = client;
vertx.createHttpServer()
.requestHandler(router::accept)
.listen(8080);
},
err -> System.out.println("Oh no, no service")
);
});
}
在这个start方法中,我们使用服务发现来检索hello microservice.然后如果这个服务器可用的话,我们启动HTTP服务端,并将保持一个对我们检索得到的WebClient的引用。我们还向WebClient传递一个配置,并禁用keepalive设置(我们将在几分钟内看到这个原因)。在invokeHelloMicroservice中,我们不需要将端口和主机传递给rxSend方法(就像我们之前做的那样)。实际上,WebClient已经被配置了目标服务的地址信息:
HttpRequest<JsonObject> request1 = hello.get("/Luke")
.as(BodyCodec.jsonObject());
HttpRequest<JsonObject> request2 = hello.get("/Leia")
.as(BodyCodec.jsonObject());
Single<JsonObject> s1 = request1.rxSend()
.map(HttpResponse::body);
Single<JsonObject> s2 = request2.rxSend()
.map(HttpResponse::body);
// ...
在终端上,导航到openshift/hello-microservice-consumer-openshift文件夹下,以下面这样的方式构建和部署服务:
mvn fabric8:deploy -Popenshift
在OpenShift仪表板,您应该会看到第二个服务和路路由)。如果您打开与hello-consumer microservice相关的路由,您应该看到:
{
"luke" : "hello Luke hello-microservice-1-sa5pf",
"leia" : "hello Leia hello-microservice-1-sa5pf"
}
你可能会看到一个503页面,因为这个pod还没有启动。刷新就行。到目前为止,没有什么新鲜的事。展示的 served-by值总是指向同一个pod(因为我们只有一个)。