今天学习Zookeeper和Dubbo,那我们先来了解这个到底是什么?简单了解下,
zookeerper是一个分布式应用程序协调服务软件,在RPC中充当注册中心,提供服务注册与发现的中心目录服务也就是注册中心,这里还有RPC是远程过程调用(Remote Procedure Call)概念,实现分布式系统服务。
dubbo是一个开源分布式服务框架,对zookeeper做出提供服务的协议,Dubbo是一款高性能、轻量级的开源Java RPC框架,它提供了三大核心能力:面向接口的远程方法调用,智能容错和负载均衡,以及服务自动注册和发现。
debbo官网:https://dubbo.apache.org/zh/
这里必须要上一张图,见图知意吧!
进入官网下载,我们下载最新版:https://zookeeper.apache.org/releases.html
下载到本地,解压
进入conf目录,我们做下配置,我们把这个zoo样例文件复制下,把改成zoo.cfg如果没有这个配置文件,启动的时候会报错;
进入bin目录输入zkServer.cmd启动,这里我报错了
提示:zookeeper默认也是走8080服务端口,这里我本地已经有进程占用8080端口,所以报错啦
最简单的方法,把那个进程关掉,cmd命令行netstat -ano | findstr 8080
找到8080端口的pid
打开任务管理器,找到对应pid关闭即可,或者taskkill /pid 28336 /f
再次启动,成功启动
我们可以回到bin目录,使用客户端连接测试下,zkCli.cmd测试连接,连接成功:
ls /
可以查看到,一个zookeeper节点:
我们还可以创建一个节点信息,可以存值取值,当然我们不这么用:
到这里就安装测试完毕了。
Dubbo-admin是一个可视化对zookeeper的一个可视化监控中心,这里可以有也可以没有,想要看可视化就下载使用,可有可无。
如果用以前的老版本,只是一个springboot项目使用起来挺方便的,以下是根据文章日期最新版,前后端分离,都要配置打包,挺麻烦的,使用老版本去找,这里网上都有,可以去使用旧的单纯spring boot项目版本,打包运行即可,如果想使用新版本,跟着博主一起来看看。
github地址:https://github.com/apache/dubbo-admin/tree/develop
我们把代码下载下来,这里我们选到主分支,然后下载:
解压,我们可以看到现在的dubbo-admin采用了前后端分离了,那我们就分别打包下,挺麻烦,但是我们还是使用下看看
进入,dubbo-admin-server目录,我们看到是一个springboot项目,我们打包下
mvn install -Dmaven.test.skip=true
build success 成功
我们把zookeeper启动起来,然后运行下我们target目录下面的jar包
我这里又报错了,8080端口冲突,因为zookeeper占用了8080端口,所以我们还得修改一下端口,application.properties加上这么一句,然后上面有个h2就是我们后面要登录的用户名和密码,重新打包
第二次打包就比第一次快很多了,40多s,重新运行jar包
启动成功:
我们再启动下前端,进入dubbo-admin-ui,我们还是命令行,以下命令,这里需要node环境,如果没有的可以去参考这个:https://blog.csdn.net/hello_list/article/details/123863949
npm install
npm run dev
这里发现报错,是因为后端端口我们改了,所以进入vue.config.js,修改下我们后端的端口
重新运行,成功
进入登录页,输入root,root上面的用户名和密码,可以登录进来:
兄弟们,我才反应过来,我们下载的这个是源码版本,又要自己编译又要打包,为什么我们不下载官网的releases版本呢,看着别人都下载什么打包啥的,我发现真的是,咱们直接下载打包好的不就可以了,哎呦
下载解压之后,跟上面一样,直接修改config文件,然后回到bin目录startup.cmd既可启动
不过你是不是看着我的教程下来的,哈哈哈,如果上面你没有安装成功,直接到这里这个release这里吧,不行,我这么坐下来的也要别人这么做下啦,我打包了下包,大家也都打下吧,吼吼吼~,使用release版本就好很多,不用又开后端然后又开全端,那么多命令行。
下面我们通过springboot去使用下zookeeper,我们首先创建一个springboot项目,这里就不说怎么创建了吧
1、首先导入依赖
<dependencies>
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-webartifactId>
dependency>
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-testartifactId>
<scope>testscope>
dependency>
<dependency>
<groupId>org.apache.dubbogroupId>
<artifactId>dubbo-spring-boot-starterartifactId>
<version>2.7.6version>
dependency>
<dependency>
<groupId>com.github.sgroschupfgroupId>
<artifactId>zkclientartifactId>
<version>0.1version>``
dependency>
<dependency>
<groupId>org.apache.curatorgroupId>
<artifactId>curator-frameworkartifactId>
<version>2.12.0version>
dependency>
<dependency>
<groupId>org.apache.curatorgroupId>
<artifactId>curator-recipesartifactId>
<version>2.12.0version>
dependency>
<dependency>
<groupId>org.apache.zookeepergroupId>
<artifactId>zookeeperartifactId>
<version>3.4.14version>
<exclusions>
<exclusion>
<groupId>org.slf4jgroupId>
<artifactId>slf4j-log4j12artifactId>
exclusion>
exclusions>
dependency>
dependencies>
2、编写服务,服务端
ResponesService接口
public interface ResponesService {
public String getRespones();
}
ResponesServiceImpl,注意这里,这里的service注解,是dubbo扫描服务的,使用了dubbo我们在服务层不要用spring的service了,都是用Component扫描
import org.apache.dubbo.config.annotation.Service;
@Service
public class ResponesServiceImpl implements ResponesService{
@Override
public String getRespones() {
return "hello,this is respones";
}
}
3、编写配置文件
server.port=8001
# 服务名
dubbo.application.name=provider-server
#注册中心地址
dubbo.registry.address=zookeeper://127.0.0.1:2181
#扫描服务
dubbo.scan.base-packages=com.xuexiriji.service
#因为dubbo-admin占用了默认的20880端口,所以这里需要修改下
dubbo.protocol.name=dubbo
dubbo.protocol.port=20881
启动项目,成功启动,我们来到dubbo-admin监控,看下我们的服务是否被注册,可以看到服务已经被注册了进来
我们再创建一个spring boot项目
1、导入依赖,跟上面的依赖一样
2、编写消费程序
package com.xuexiriji.service;
import org.apache.dubbo.config.annotation.Reference;
import org.springframework.stereotype.Component;
@Component //引用dubbo之后尽量使用Component扫描到spring容器中,因为可能会导入错误
public class RequestService {
//在这里会报错,两种方式,引入坐标,
// 或者直接创建一个相对应接口,但是是从zookeeper注册中心拿来的服务
@Reference
ResponesService responesService;
public void requset(){
System.out.println("发送请求");
String respones = responesService.getRespones();
System.out.println("收到注册中心响应:"+respones);
}
}
这里我直接把服务端接口复制了过来,同时编写了一个测试:
3、修改配置
server.port=8002
#消费者需要暴露自己的名字
dubbo.application.name=consumer
#注册中心地址
dubbo.registry.address=zookeeper://127.0.0.1:2181
运行测试,可以看到我们成功调用了服务端消费拿到了数据
最后有一个官方提示,推荐使用元数据:
如果有任何问题可以评论留言,我们一起讨论,当然了,都看到这里了还不点个关注,点个赞,bye~