1. 程式人生 > >SOFARPC 整合 Zookeeper 註冊中心

SOFARPC 整合 Zookeeper 註冊中心

浪費了“黃金五年”的Java程式設計師,還有救嗎? >>>   

sofarpc 的使用感覺和dubbo差不多,這篇是轉別人的使用

SOFARPC 是近期螞蟻金服開源的一個高可擴充套件性、高效能、生產級的 Java RPC 框架。在螞蟻金服 SOFARPC 已經經歷了十多年及五代版本的發展。SOFARPC 致力於簡化應用之間的 RPC 呼叫,為應用提供方便透明、穩定高效的點對點遠端服務呼叫方案。為了使用者和開發者方便的進行功能擴充套件,SOFARPC 提供了豐富的模型抽象和可擴充套件介面,包括過濾器、路由、負載均衡等等。

SOFA RPC 可以整合多種註冊中心實現,其中一種就是常用的 ZooKeeper

ZooKeeper 作為一個開源的分散式應用協調系統,已經用到了許多分散式專案中,用來完成統一命名服務、狀態同步服務、叢集管理、分散式應用配置項的管理等工作。

本文將介紹 SOFARPC 是使用 ZooKeeper 作為註冊中心的用法。

1. ZooKeeper 註冊中心安裝

這裡介紹下 Zookeeper 單機模式兩種安裝方式,叢集模式請參考下其他文件。

1.1 基於壓縮包安裝

第一步:去官網下載 http://zookeeper.apache.org/releases.html#download


例如目前最新版是 v3.4.11,我們下載壓縮包zookeeper-3.4.11.tar.gz,然後解壓到資料夾下,例如 /home/admin/zookeeper-3.4.11

第二步:設定配置檔案,可以直接從樣例複製一份。

$ cd /home/admin/zookeeper-3.4.11
$ cp conf/zoo_sample.cfg conf/zoo.cfg

第三步:到 Zookeeper 安裝目錄下直接啟動Zookeeper。

$ cd /home/admin/zookeeper-3.4.11
$ sh bin/zkServer.sh start
ZooKeeper JMX enabled by default
Using config: /Users/zhanggeng/dev/zookeeper/bin/../conf/zoo.cfg
-n Starting zookeeper ...
STARTED

第四步:我們使用四字命令檢查下。

$ echo stat | nc 127.0.0.1 2181
Zookeeper version: 3.4.11-37e277162d567b55a07d1755f0b31c32e93c01a0, built on 11/01/2017 18:06 GMT
...

第五步:如果需要檢視資料,直接執行 zkCli.sh,連線後執行 ls /即可。

$ sh bin/zkCli.sh
Connecting to localhost:2181
......
WatchedEvent state:SyncConnected type:None path:null
[zk: localhost:2181(CONNECTED) 0] ls /
[zookeeper]

1.2 基於 Docker 安裝

如果您已安裝了 Docker,那麼可以選擇使用映象啟動 Zookeeper。

$ docker image pull zookeeper:3.4.11
$ docker run -i -t  --name my_zookeeper -p2181:2181 -d zookeeper:3.4.11

我們檢視下啟動日誌:

$ docker logs -f my_zookeeper
ZooKeeper JMX enabled by default
Using config: /conf/zoo.cfg
2018-04-16 07:38:59,373 [myid:] - INFO  [main:QuorumPeerConfig@136] - Reading configuration from: /conf/zoo.cfg
......
2018-04-16 07:23:41,187 [myid:] - INFO  [main:NIOServerCnxnFactory@89] - binding to port 0.0.0.0/0.0.0.0:2181

可以看到埠已經啟動併發布,我們使用四字命令檢查下。

$ echo stat | nc 127.0.0.1 2181
Zookeeper version: 3.4.11-37e277162d567b55a07d1755f0b31c32e93c01a0, built on 11/01/2017 18:06 GMT
...

我們可以檢視啟動的容器執行狀態、關閉、重啟,參考命令如下:

$ docker container ls
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                                        NAMES
30b13a744254        zookeeper:3.4.11    "/docker-entrypoin..."   23 hours ago        Up 42 seconds       2888/tcp, 0.0.0.0:2181->2181/tcp, 3888/tcp   my_zookeeper
## 關閉重啟的話
$ docker container stop 30b13a744254
$ docker container start 30b13a744254

如果需要使用 ZooKeeper 客戶端檢視檢視資料,參考命令如下:

$ docker exec -it 30b13a744254 zkCli.sh
Connecting to localhost:2181
......
WatchedEvent state:SyncConnected type:None path:null
[zk: localhost:2181(CONNECTED) 0] ls /
[zookeeper]

2. SOFARPC 整合 Zookeeper 註冊中心

Demo 工程參見: sofa-rpc-zookeeper-demo

2.1 新建工程

執行需要 JDK 6 及以上、 Maven 3.2.5 以上。

首先我們在 IDE 裡新建一個普通 Maven 工程,然後在 pom.xml 中引入如下 RPC 和 Zookeeper 相關依賴:

<dependencies>
    <dependency>
        <groupId>com.alipay.sofa</groupId>
        <artifactId>sofa-rpc-all</artifactId>
        <version>5.3.1</version>
    <dependency>
    <dependency>
        <groupId>org.apache.curator</groupId>
        <artifactId>curator-recipes</artifactId>
        <version>2.9.1</version>
    </dependency>
</dependencies>

2.2 編寫服務提供端

第一步:建立介面

package org.howtimeflies.sofa.rpc;
public interface HelloService {
    public String sayHello(String name);
}

第二步:建立介面實現

package org.howtimeflies.sofa.rpc;
public class HelloServiceImpl implements HelloService {
    public String sayHello(String name) {
        return "hello " + name;
    }
}

第三步:編寫服務端程式碼

package org.howtimeflies.sofa.rpc;

import com.alipay.sofa.rpc.config.ProviderConfig;
import com.alipay.sofa.rpc.config.RegistryConfig;
import com.alipay.sofa.rpc.config.ServerConfig;

public class ServerMain {
    public static void main(String[] args) {
        // 指定註冊中心
        RegistryConfig registryConfig = new RegistryConfig()
                .setProtocol("zookeeper")
                .setAddress("127.0.0.1:2181");
        // 指定服務端協議和地址
        ServerConfig serverConfig = new ServerConfig()
                .setProtocol("bolt")
                .setPort(12345)
                .setDaemon(false);
        // 釋出一個服務
        ProviderConfig<HelloService> providerConfig = new ProviderConfig<HelloService>()
                .setInterfaceId(HelloService.class.getName())
                .setRef(new HelloServiceImpl())
                .setRegistry(registryConfig)
                .setServer(serverConfig);
        providerConfig.export();
    }
}

2.3 編寫服務呼叫端

我們拿到了服務端的介面,就可以編寫服務端呼叫端程式碼

package org.howtimeflies.sofa.rpc;

import com.alipay.sofa.rpc.config.ConsumerConfig;
import com.alipay.sofa.rpc.config.RegistryConfig;

public class ClientMain {

    public static void main(String[] args) {
        // 指定註冊中心
        RegistryConfig registryConfig = new RegistryConfig()
                .setProtocol("zookeeper")
                .setAddress("127.0.0.1:2181");
        // 引用一個服務
        ConsumerConfig<HelloService> consumerConfig = new ConsumerConfig<HelloService>()
                .setInterfaceId(HelloService.class.getName())
                .setProtocol("bolt")
                .setRegistry(registryConfig);
        // 拿到代理類
        HelloService service = consumerConfig.refer();
        
        // 發起呼叫
        while (true) {
            System.out.println(service.sayHello("world"));
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
            }
        }
    }
}

2.4 執行

我們先執行服務提供端程式 ServerMain,然後去 ZooKeeper上看下服務訂閱情況。

$ sh bin/zkCli.sh
Connecting to localhost:2181
......
WatchedEvent state:SyncConnected type:None path:null
[zk: localhost:2181(CONNECTED) 4] ls /sofa-rpc/org.howtimeflies.sofa.rpc.HelloService/providers
[bolt%3A%2F%2F10.15.232.61%3A12345%3FuniqueId%3D%26version%3D1.0%26timeout%3D0%26delay%3D-1%26id%3Drpc-cfg-0%26dynamic%3Dtrue%26weight%3D100%26accepts%3D100000%26startTime%3D1523967648457%26pid%3D17664%26language%3Djava%26rpcVer%3D50301]

然後在執行服務端呼叫端 ClientMain

執行結果如下:

hello world
hello world
hello world
hello world

我們也可以去 ZooKeeper上看下服務訂閱情況,

sh bin/zkCli.sh
Connecting to localhost:2181
......
WatchedEvent state:SyncConnected type:None path:null
[zk: localhost:2181(CONNECTED) 5] ls /sofa-rpc/org.howtimeflies.sofa.rpc.HelloService/consumers
[bolt%3A%2F%2F10.15.232.61%2Forg.howtimeflies.sofa.rpc.HelloService%3FuniqueId%3D%26version%3D1.0%26pid%3D17921%26timeout%3D3000%26id%3Drpc-cfg-0%26generic%3Dfalse%26serialization%3Dhessian2%26startTime%3D1523968102764%26pid%3D17921%26language%3Djava%26rpcVer%3D50301]

至此,使用 ZooKeeper 作為 SOFARPC 的註冊中心介紹完了。


作者:khotyn
連結:https://www.jianshu.com/p/97323e1057e3
來源:簡書
簡書著作權歸作者所有,任何形式的轉載都請聯絡作者獲得授