dubbo注册到zookeeper,并实现一个简单的消费者和生产者之间的远程调用

1. 安装zookeeper: 官网下载最新的zk, 我这里安装的是apache-zookeeper-3.9.2-bin.tar.gz

Apache ZooKeeper

很简单,上传到指定目录,解压(tar -zxvf apache-zookeeper-3.9.2-bin.tar.gz),到bin目录下执行启动命令

#启动
./zkServer.sh start 
#查看状态
./zkServer.sh status
#重启
./zkServer.sh restart
#停止
./zkServer.sh stop

看到日志

Starting zookeeper ... STARTED说明zk启动了,查看进程netstat -apn| grep 2181

或者在logs目录下查看相关日志

2. 新建工程,dubbo2为base工程(定义rpc接口),下面分别新建module,provider(实现dubbo2接口)和consumer(调用rpc接口)

1)引入maven依赖(生产者和消费者依赖一样,需要引入dubbo2的依赖)

        <dependency>
            <groupId>com.example</groupId>
            <artifactId>dubbo2</artifactId>
            <version>0.0.1-SNAPSHOT</version>
        </dependency>
        
        <dependency>
            <groupId>org.apache.dubbo</groupId>
            <artifactId>dubbo</artifactId>
            <version>3.0.2.1</version>
        </dependency>
        <dependency>
            <groupId>org.apache.curator</groupId>
            <artifactId>curator-framework</artifactId>
            <version>5.6.0</version>
        </dependency>
        <dependency>
            <groupId>org.apache.curator</groupId>
            <artifactId>curator-recipes</artifactId>
            <version>5.6.0</version>
        </dependency>
        <dependency>
            <groupId>org.apache.curator</groupId>
            <artifactId>curator-x-discovery</artifactId>
            <version>5.6.0</version>
        </dependency>

2)base包定义的接口

package com.example.service;

public interface ProviderService {
    String sayHello();
}

3)生产者配置

dubbo:
  application:
    name: dubbo-provider-demo # 应用名称
  registry:
    id: default-registry
    address: zookeeper://127.0.0.1:2181 # 注册中心地址
    timeout: 6000
  protocol:
    id: default-protocol
    name: dubbo # 协议名称
    port: -1 # 协议端口
  config-center:
    timeout: 60000
  metadata-report:
    timeout: 60000
server:
  port: 9090

实现接口

package com.example.provider.service;

import com.example.service.ProviderService;
import org.apache.dubbo.config.annotation.DubboService;

@DubboService
public class ProviderServiceImpl implements ProviderService {
    @Override
    public String sayHello() {
        return "hello world";
    }
}

启动类增加

@DubboComponentScan(basePackages = "com.example.provider.service")

4)消费者配置

server.port: 9091

dubbo:
  application:
    name: dubbo-consumer-demo # 应用名称
    qos-port: 22229
  registry:
    id: default-registry
    address: zookeeper://127.0.0.1:2181 # 注册中心地址
    timeout: 60000
  consumer:
    check: false # 关闭启动时检查
    timeout: 60000
  protocol:
    id: default-protocol
    name: dubbo # 协议名称
    port: -1 # 协议端口
  config-center:
    timeout: 60000
  metadata-report:
    timeout: 60000




调用接口类

package com.example.consumer.service;

import com.example.service.ProviderService;
import org.apache.dubbo.config.annotation.DubboReference;
import org.springframework.stereotype.Service;

@Service
public class TestDubboService {
    @DubboReference
    private ProviderService providerService;


    public String test() {
        return providerService.sayHello();
    }
}

上面配置中的端口是个坑,建议都写成-1,自动分配端口,本地运行的话会出现端口占用导致注册失败问题,后面的问题会记录

3. 下载zk客户端查看注册到zk的生产者和消费者,注册成功后可看到地址和相关的远程接口信息

解压ZooInspector.zip的build目录下的zookeeper-dev-ZooInspector.jar,使用java -jar zookeeper-dev-ZooInspector.jar 运行即可

4. 遇到的问题记录

1. ClassNotFoundException: org.apache.curator.framework.CuratorFrameworkFactory


  <dependency>
            <groupId>org.apache.curator</groupId>
            <artifactId>curator-framework</artifactId>
            <version>5.6.0</version>
        </dependency>
		

2. NoClassDefFoundError: org/apache/curator/framework/recipes/cache/NodeCacheListener 

  <dependency>
            <groupId>org.apache.curator</groupId>
            <artifactId>curator-recipes</artifactId>
            <version>5.6.0</version>
        </dependency>
		
3. java.lang.ClassNotFoundException: org.apache.curator.x.discovery.ServiceDiscoveryBuilder
        <dependency>
            <groupId>org.apache.curator</groupId>
            <artifactId>curator-x-discovery</artifactId>
            <version>5.6.0</version>
        </dependency>

		
4. Create zookeeper service discovery failed. Expected state [STARTED] was [STOPPED]
This may be caused by , go to https://dubbo.apache.org/faq/5/14 to find instructions. 
还是网络策略不通 放到和zk一台主机上时就可以正常访问了
./zkCli.sh -server 127.0.0.1:2181

后面将配置服务端口设置为-1 含义为自动分配端口发现本地服务正常启动了

5. qos-server can not bind localhost:22222
netstat -aon|findstr 22222
发现是22222端口被占用了


6. 2024-05-13 14:41:30.123  WARN 5344 --- [           main] o.a.d.qos.protocol.QosProtocolWrapper    :  [DUBBO] Fail to start qos server: , dubbo version: 3.2.12, current host: 127.0.0.1, error code: 7-4. This may be caused by , go to https://dubbo.apache.org/faq/7/4 to find instructions.
这一点是想说看到异常日志点进去查看提示,能帮忙快速定位和解决问题

7. 如果出现服务启动未加载到dubbo配置的情况,就在启动类中增加@EnableDubbo 

8. zookeeper not connected
增加注册超时时间
dubbo:
  registry:
    id: default-registry
    address: zookeeper://127.0.0.1:2181 # 注册中心地址
    timeout: 600000
9. the metadata report was not inited. 不影响服务启动

最重要的一点:开始使用dubbo的最新版本一直报错java.lang.RuntimeException: java.lang.IllegalStateException: failed to connect to zookeeper server,本地无法连接到zk所在服务器上的zk,只能将服务部署到zk一台主机上才能正常

      <dependency>
            <groupId>org.apache.dubbo</groupId>
            <artifactId>dubbo</artifactId>
            <version>3.2.12</version>
        </dependency>

但是网络策略一直都是通的,查找了好半天才发现是版本问题,后面降低版本后本地也能连上zk了

      <dependency>
            <groupId>org.apache.dubbo</groupId>
            <artifactId>dubbo</artifactId>
            <version>3.0.2.1</version>
        </dependency>

但是报错了the metadata report was not inited. 不影响服务启动,在git看说是升级dubbo3.0之后有这个问题,不影响启动这里就忽略了

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值