让我们实现 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());
      });