SOA专题

使用zookeeper和curator实现微服务的负载平衡

  Apache ZooKeeper是一个可以注册 管理和服务发现工具,能够在不同服务器上发现可用的服务, Apache Curator 能够是对ZooKeeper封装,更加容易使用,只需要更少的代码。

We are accustomed to situation when there is a load balancer deployed in front of our application. Its role is to make sure that every single node gets more or less same amount of traffic.

微服务架构能让我们关注更小的模块,随着系统的复杂增加,将会拥有很多微服务,它们的调用需要负载平衡,现在我们使用ZooKeeper作为服务的指挥家和发现工具。

让我们从一个简单案例开始,监听一个端口然后返回一些结果,这里我们使用 Groovy, Undertow 和 ZooKeeper 以及 Curator.本案例的源码下载

假设已经有一个Restful微服务代码如下:

@Path("/")

class Main {

 

    @GET

    @Path("/work")

    public String work() {

        String response = "Work done by $workerName"

        println response

        return response

    }

 

}

这是一个简单的worker,直接响应一些字符串给客户端。下面我们将这个worker注册到ooKeeper中:

private static void registerInZookeeper(int port) {

    CuratorFramework curatorFramework =

      CuratorFrameworkFactory.newClient("localhost:2181",

      new RetryNTimes(5, 1000))

    curatorFramework.start()

    ServiceInstance<Void> serviceInstance = ServiceInstance.builder()

        .uriSpec(new UriSpec("{scheme}://{address}:{port}"))

        .address('localhost')

        .port(port)

        .name("worker")

        .build()

 

    ServiceDiscoveryBuilder.builder(Void)

        .basePath("load-balancing-example")

        .client(curatorFramework)

        .thisInstance(serviceInstance)

        .build()

        .start()

}

首先我们创建和启动 CuratorFramework 客户端包装我们所有想在Zookeeper上的操作,这里使用localhost作为缺省,通常应该是运行ZooKeeper的实例服务器的URL。

然后创建ServiceInstance代表我们的worker. 我们传递所有从其他微服务调用这个worker的合约细节。

最后将我们的实例注册到ZooKeeper,这是通过CuratorFramework client.

现在Worker已经准备完成,我们创建fat jar (使用 Gradle fatJar task),然后使用下面命令加载:

java -jar simple-worker/build/libs/simple-worker-1.0-shadow.jar Worker_1 18005

在启动worker之前,你必须有ZKr运行在2181上。

为了验证运行正常,在浏览器键入http://localhost:18005/work,应该看到响应:"Work done by Worker_1". 通过下面命令可以验证worker已经注册到ZK中:

cd <zk_root>/bin
./zkCli.sh</zk_root>

然后在 /load-balancing-example/worker 运行ls:

[zk: localhost:2181(CONNECTED) 1] ls /load-balancing-example/worker <enter>
[f69545e8-8466-40c0-93e9-f493eb7496b4]

通过下面命令可以加入更多worker:

java -jar simple-worker/build/libs/simple-worker-1.0-shadow.jar Worker_1 18005 &

java -jar simple-worker/build/libs/simple-worker-1.0-shadow.jar Worker_2 18006 &

java -jar simple-worker/build/libs/simple-worker-1.0-shadow.jar Worker_3 18007 &

java -jar simple-worker/build/libs/simple-worker-1.0-shadow.jar Worker_4 18008 &

通过ls可以查看:

[zk: localhost:2181(CONNECTED) 0] ls /load-balancing-example/worker <enter>
[d5bc4eb9-8ebb-4b7c-813e-966a25fdd843, 13de9196-bfeb-4c1a-b632-b8b9969b9c0b, 85cd1387-2be8-4c08-977a-0798017379b1, 9e07bd1d-c615-430c-8dcb-bf228e9b56fc]

 

Zookeeper使用

微服务

EDA