1. 安装zookeeper: 官网下载最新的zk, 我这里安装的是apache-zookeeper-3.9.2-bin.tar.gz
很简单,上传到指定目录,解压(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之后有这个问题,不影响启动这里就忽略了