从零开始学Dubbo的历程

本文深入解析了Dubbo框架的运作机制,包括服务提供者、消费者、注册中心、监控中心和容器的角色。通过Zookeeper作为注册中心,详细介绍了服务的注册与发现过程。在实践中遇到的难点如Duplicate application configs问题和非法状态异常也进行了分析和解决,为初学者提供了宝贵的参考经验。

什么是dubbo:是一款高性能、轻量级的Java 远程过程调用(RPC)框架。

为什么要学dubbo:面向接口的远程方法调用,智能容错和负载均衡,服务自动注册和发现。

dubbo架构

 

架构中包括五大节点:
Provider         暴露服务的服务提供方
Consumer         调用远程服务的服务消费方
Registry         服务注册与发现的注册中心
Monitor         统计服务的调用次数和调用时间的监控中心
Container         服务运行容器

运作的过程:(java需要先添加Dubbo的相关依赖)

1、注册中心启动,(192.168.xx.xx:xxxx)

2、Provide节点通过注册中心主机ip和端口,暴露(提供)带有@Service的接口实现类并携带提供方的ip地址和给注册中心 (本机ip,provider_name,其他数据)

!!注意这里的@Service注解是阿里巴巴的Dubbo依赖,不是Spring框架的@Service

3、注册中心启动客户端 

4、注册中心发现provider提供方,并接收数据

5、Consumer节点消费方同样通过注册中心ip和端口找注册中心要数据,这个过程就与提供方相似,区别在于不需要向注册中心注册,并在java代码中获取接口实现类时只需要简单的@Reference注解对应实现类的接口便可用此接口调用远程提供方提供的实现类方法,如

        @Reference

        private UserService userService;

怎么使用Dobbo

首先我们需要有一个服务注册中心用于注册服务,这里官方推荐使用的是Zookeeper。

Zookeeper的安装,在Window环境或Linux都可以运行

1、window下安装

解压并在zookeeper-3.4.6文件夹中新建data空白文件夹用于存储数据,

复制conf文件夹底下zoo-sample.cfg为zoo.cfg,

并将zoo.cfg中的dataDir属性修改 dataDir=/usr/zookeeper-3.4.6/data,保存退出便可使用

/*

*window中启动,在/bin目录下双击zkService.cmd文件启动注册中心,java代码启动提供者节点,

*再在/bin目录下双击zkCli.cml启动客户端,若有welcome to Zookeeper字样代表客户端启动成功,

*此时输入ls / 显示的是[提供方注册的名称,Zookeeper]代表provider提供成功。并且你可以通过

* ls /提供方注册的名称/java中实现类的包如com.xxx.service.xxxService查看provider提供的数据

*/

2、Linux下安装

基本流程与上面一致,区别在于Linux在bin目录下启动的启动文件后缀为.sh

最后的最后分享几个在使用过程中,出现的我很难理解的问题

java.lang.IllegalStateException: Duplicate application configs:xxxxxxx[]xxxxx

这个是发生在我消费方用@Reference注解中发生的问题,查百度大致意思是我消费方从注册中心获取的是[]一个空字符串,我说比较难理解的原因是如果提供方提供的是空按道理来说不应该到消费方调用时候才报错,应该提供的时候就报错,然而并没有。然后我在注册中心查找对应提供方携带的数据时候注入了一个空字符串,最终报错java.lang.NullPointException,说我注入了空。我最后的解决办法是删了data文件夹里的数据,然后重新提供提供方和消费方重新调用远程服务。

java.lang.IllegalStateException: <dubbo:application name="dubbodemo_provider"  id="dubbodemo_provider"/> <dubbo:application name="dubbodemo_provider2"  id="dubbodemo_provider2"/>

他这很明显说的是找到了一个提供方两个名称,然而当时我只写了一个提供方并只写了一个名称如下 <dubbo:application name="dubbodemo_provider"  />:并没有两个名称甚至id也没写,但是他这错报的莫名其妙,网上找要么就说写了两个名称(但我确认了上百遍都没有写两次)要么就是说缺少id属性(我加上id依旧报同样的错)要么就是说没有写版本号version属性(然后我加上对应的如1.0.0或者0.1.0依旧报错),最后的最后我猜想他是不是因为通过项目名称自动给我提供方起了个名称?于是我把这行代码注释掉,发现代码莫名其妙的能跑起来了

本人总结自身学习经验,仅代表个人,如有错误(那我也没办法)找别人看去

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值