让我们实现 microservice,然后在开发机上测试它。
前端服务封装在 MicroServiceVerticle
类中。
该服务将使用服务地址请求 Kubernetes 集群中的另一个 Pod。microservice Verticle 创建一个配置了负载均衡器和解析器的 HttpClient
。
Java src/main/java/io/vertx/howtos/clientsidelb/MicroServiceVerticle.java
client = vertx
.httpClientBuilder()
.withLoadBalancer(loadBalancer)
.withAddressResolver(resolver)
.build();
为此,我们创建一个地址解析器,它将逻辑 ServiceAddress
作为输入,并返回 HTTP 客户端在实践中可以使用的地址列表。
KubeResolver
是在 Kubernetes 中部署时首选的解析器。请注意,解析器是使用 new KubeResolverOptions()
创建的,并根据 Kubernetes 设置的 Pod 环境变量进行配置。
Java src/main/java/io/vertx/howtos/clientsidelb/MicroServiceVerticle.java
AddressResolver resolver = KubeResolver.create(new KubeResolverOptions());
Java src/main/java/io/vertx/howtos/clientsidelb/MicroServiceVerticle.java
LoadBalancer loadBalancer = LoadBalancer.ROUND_ROBIN;
我们还需要为我们的服务创建并绑定一个 Web 服务器,这非常简单
Java src/main/java/io/vertx/howtos/clientsidelb/MicroServiceVerticle.java
return vertx.createHttpServer()
.requestHandler(request -> handleRequest(request))
.listen(8080);
首先,我们创建一个到后端服务器的 HTTP 服务器请求。我们没有传递后端服务器的套接字地址,而是使用逻辑服务地址,即 Kubernetes 中服务的名称 (hello-node
)。
Java src/main/java/io/vertx/howtos/clientsidelb/MicroServiceVerticle.java
ServiceAddress serviceAddress = ServiceAddress.of("hello-node");
Future<HttpClientRequest> fut = client.request(new RequestOptions()
.setMethod(HttpMethod.GET)
.setServer(serviceAddress)
.setURI("/"));
然后我们实现后端服务器响应处理。我们将原始响应作为我们响应的一部分发送回去,并用响应套接字地址进行修饰,以便我们能够确定服务与哪个服务器进行了交互。
Java src/main/java/io/vertx/howtos/clientsidelb/MicroServiceVerticle.java
fut.compose(r -> r.send()
.expecting(HttpResponseExpectation.SC_OK)
.compose(resp -> resp.body())
.map(body -> "Response of pod " + r.connection().remoteAddress() + ": " + body + "\n"))
.onSuccess(res -> {
request.response()
.putHeader("content-type", "text/plain")
.end(res);
})
.onFailure(cause -> {
request.response()
.setStatusCode(500)
.putHeader("content-type", "text/plain")
.end("Error: " + cause.getMessage());
});