您的位置:

Dubbo注册中心配置及性能调优技巧

一、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集群体系让整个系统具备高可用性。