一、Zookeeper作為Dubbo註冊中心
1、Zookeeper概述
// Zookeeper客戶端代碼示例
public class ZookeeperClient {
public static void main(String[] args) throws IOException, InterruptedException, KeeperException {
ZooKeeper zooKeeper = new ZooKeeper("localhost:2181", 5000, new Watcher() {
@Override
public void process(WatchedEvent watchedEvent) {
System.out.println("Zookeeper連接狀態:"+watchedEvent.getState());
}
});
String path = "/dubbo/provider/demoService/user1";
// 查看節點數據
byte[] data = zooKeeper.getData(path, false, null);
System.out.println("節點數據:"+new String(data));
// 創建節點
String createPath = "/dubbo/provider/demoService/user2";
String createData = "user2-data";
Stat stat = zooKeeper.exists(createPath, false);
if (stat == null) {// 節點不存在
zooKeeper.create(createPath, createData.getBytes(), ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT);
}
// 查看節點下的子節點
List children = zooKeeper.getChildren("/dubbo/provider/demoService", false);
for (String child : children) {
System.out.println("子節點路徑:"+child);
}
// 更新節點數據
String updatePath = "/dubbo/provider/demoService/user2";
String updateData = "user2-data-update";
zooKeeper.setData(updatePath,updateData.getBytes(),-1);
zooKeeper.close();
}
}
(1)使用自己的Zookeeper或使用阿里雲等Zookeeper服務提供商都可以。
(2)建立Dubbo配置zookeeper.properties文件
假設你的Zookeeper地址是:127.0.0.1:2181(如果你在本地部署測試版本則不需要修改),加入如下配置:
dubbo.registry.address=zookeeper://127.0.0.1:2181
(3)注意,Dubbo啟動時需要讀取上述dubbo.properties文件。
(4)查看Dubbo是否能夠正常連上Zookeeper註冊中心。
package com.demo.provider;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class Provider {
public static void main(String[] args) throws Exception {
ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext(new String[]{"provider.xml"});
context.start();
System.in.read(); // 按任意鍵退出
}
}
(5)Dubbo控制日誌級別
控制Dubbo控制台日誌級別,比如輸出INFO級別日誌:
在logback.xml(日誌配置文件)中加入以下代碼(目標屬性是console ):
二、如何正確的指定Dubbo服務埠號
1、Dubbo服務埠號
Dubbo服務埠號默認是20880,但是實際用於生產的應用很難只使用一個埠號,因為它需要承載很多Dubbo服務,因此為了標識不同的服務,需要為每個服務指定獨立的埠號以便進行區分,配置方法如下:
(1)在Dubbo服務介面實現中指定服務埠號。
// demo服務提供者實現類
@Service(version = "1.0.0")
public class DemoServiceImpl implements DemoService {
@Override
@ServiceMethod(group = "user")
public String sayHello(String name) {
System.out.println("Dubbo 服務埠為:" + RpcContext.getContext().getLocalAddress().getPort());
return "Hello " + name;
}
}
//Dubbo 服務埠為:20882
從上述代碼中可以看出,在Dubbo服務實現類中指定服務介面方法的具體埠號。
(2)在Dubbo服務提供端xml文件中配置服務埠。
從上述xml文件中可以看出,在Dubbo服務提供端xml文件中指定服務協議及埠號。
三、Dubbo服務端性能調優的解決方案
1、選擇合適的序列化方案
在Dubbo遠程調用時,Java對象需要進行序列化和反序列化,從而進行網路傳輸。Dubbo支持多種不同的序列化方案,如Hessian、Kyro、Java自身的序列化等,選擇合適的序列化方案可以有效的提高Dubbo性能。
2、調整線程池大小
Dubbo提供了一組可配置的線程池來調整線程池大小,通常線程池中線程數需要根據CPU個數來進行設置。
3、自定義協議
在Dubbo的負載均衡中,每次進行網路傳輸時,會先序列化、反序列化,在進行心跳檢查等操作,這種額外的性能消耗可以通過自定義協議進行規避,Dubbo中以Fastjson作為默認序列化方案。
四、Dubbo註冊中心高可用方案
1、Zookeeper集群
Zookeeper集群是保證Dubbo註冊中心高可用的最常用方案。如果Dubbo註冊中心只依賴單一的Zookeeper節點,則會使得整個Dubbo系統服務掛掉,因此,建議搭建Zookeeper集群。
通過上述Zookeeper集群的配置,Dubbo可以進行輪詢來選擇其中一個Zookeeper節點進行註冊。
2、Redis集群
Dubbo可以將註冊中心作為緩存來使用,將所有已註冊的服務名及服務URL存入Redis中,在服務消費請求服務URL時,首先會在Redis緩存中尋找相應服務名稱,如果發現則直接返回對應的服務URL,否則從Zookeeper的服務發現中心中查找。此時,Redis集群體系可以讓整個Dubbo系統具備高可用性。
通過上述Redis集群的配置,Dubbo可以將Zookeeper作為服務發現到緩存中,通過Redis集群體系讓整個系統具備高可用性。
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/276003.html