从零开始搭建一个dubbo框架及常见问题说明

1.      dubbo框架理解:

dubbo是一种分布式框架,最早应用于电商项目。它经历了如下几个发展阶段:

从单一应用框架(ORM):当网站流量很小时,只需一个应用,将所有功能都部署在一起以减少部署节点和成本;

垂直应用框架(MVC):当访问量逐渐增大,单一应用增加机器带来的加速度越来越小,将应用拆成互不相干的几个应用,以提升效率;

分布式应用架构(RPC):当垂直应用越来越多,应用之间交互不可避免,将核心业务抽取出来,作为独立的服务,逐渐形成稳定的服务中心,使前端应用能更快速的响应多变的市场需求;

流动计算架构(SOA):当服务越来越多,容量的评估,小服务资源的浪费等问题逐渐显现,此时需增加一个调度中心基于访问压力实时管理集群容量,提高集群利用率;

用图形表示为:

从零开始搭建一个dubbo框架及常见问题说明_第1张图片

而dubbo的工作图:

从零开始搭建一个dubbo框架及常见问题说明_第2张图片

其中:

0.服务容器负责启动,加载,运行服务提供者。

1.服务提供者在启动时,向注册中心注册自己提供的服务。

2.服务消费者在启动时,向注册中心订阅自己所需的服务。

3.注册中心返回服务提供者地址列表给消费者,如果有变更,注册中心将基于长连接推送变更数据给消费者。

4.服务消费者,从提供者地址列表中,基于软负载均衡算法,选一台提供者进行调用,如果调用失败,再选另一台调用。

5.服务消费者和提供者,在内存中累计调用次数和调用时间,定时每分钟发送一次统计数据到监控中心

详情参见http://blog.csdn.net/noaman_wgs/article/details/70214612。

 

2.dubbo项目搭建

在项目搭建之前,需要安装zookeeper与dubbo,具体过程请百度。这里是两个推荐地址:

Zookeeper:http://blog.csdn.net/tlk20071/article/details/52028945。

关于dubbo的安装,因为笔者参见网络搞了很久才出来,在这里我详细说下。

在启动zookepeer不报错以后,进行如下配置:

1) 配置一个独立的tomcat准备作为dubbo-admin启动的容器,下载dubbo-admin的war包发布到tomcat中(拷贝到tomcat的webapp下);

2) 启动tomcat,可以发现dubbo-admin.war被解压了。打开解压包中/WEB-INF/dubbo.properties文件,进行以下修改:

dubbo.registry.address=zookeeper://127.0.0.1:2181     //与你的zookeeper地址及端口一致

dubbo.admin.root.password=root  //dobbo-admin的登陆用户root 密码root

dubbo.admin.guest.password=guest      //dobbo-admin的登陆用户guest 密码suest

3) 重启tomcat,访问http://localhost:8088/+你的dubbo-admin文件夹名/

若报错Errorcreating bean with name 'uriBrokerService': Cannot create inner bean '(innerbean)' of type[com.alibaba.citrus.service.uribroker.impl.URIBrokerServiceImpl$URIBrokerInfo]while setting bean property 'brokers' with key [0]…

这多半是由于你下载的dubbo-admin版本与你的jdk不兼容引起的,如dubbo-admin2.5.4与jdk1.7以上版本都不兼容。

此时有两种方法,第一自不必说是替换低版本的jdk,可这样会影响到我们正在开发的项目配置,很麻烦;第二种就是重新编译打包dubbo-admin,下面简述一下:

1) 前往https://github.com/alibaba/dubbo,在master里点击2.5.x,将dubbo源码下载到本地;

2) 修改你的maven/conf/settings.xml,添加如下内容后,检查eclipse中是否将其配置到了maven中(preference-maven-userssting),若无则添加。



      alimaven

      aliyun maven

      http://maven.aliyun.com/nexus/content/groups/public/

     central       

3) 修改pom中的配置,参见http://blog.csdn.net/blue_dd/article/details/51298438。


下面,我们从零开始来建立一个dubbo项目。

前期建设可参考https://www.cnblogs.com/blueness-sunshine/p/6015965.html,在此只做几点补充说明。

1.      关于Maven多模块创建dubb项目

为了便于理解和管理,博主使用了Maven多模块项目。主模块相当于一个容器,里面有很多子项目,它们很多地方类似,因此放在一起。其中,主模块是一个site-simple项目,其pom.xml中得package一定是pom,表示它是一个被继承的模块。子模块的package一定是jar。

去掉子模块的version,建立相互依赖时记得版本一定要和主模块的版本一致。

2.      只有web项目才能发布到tomcat中,而在这个项目中,student-test与student-web分别作为需要运行在tomcat里的消费者与提供者,故这两个在创建时选择web-app,同时要为它们配置完整的spring运行文件,如applicationContext.xml和dispatcherServlet.xml,以及web.xml。而web-api和web-service只是在student-web中被内置调用的,只需在student-web中配置好调用即可。

3.      Dubbo-provider/consumer.xml怎么被spring加载的问题:

这里,笔者考虑既然这也是哥xml文件,那它是否也和applicationContext.xml和dispatcherServlet.xml一样,在web.xml中进行配置在spring中读取。其实不然,spring中dubbo的启动机制如下:

dubbo是基于Spring进行开发的,而且扩展了Spring的XML schema和注解标签,其实这里也就是整个dubbo的切入点。dubbo除去依赖其他的第三方框架外,整个框架只有一个jar包,可谓是精致。在这个jar包的NET-INF目录下有两个文件:spring.handlers和spring.schemas。其中spring.schemas中定义的就是扩展的spring配置标签,而且spring.handlers中定义的就是这些schema的处理类,就是这个类将dubbo组件“插入”到spring这个平台里的。(关于如何自定义spring配置的schema,网上资料很多,这里只简单概括)Spring在启动的时候会扫描MET-INF下所有的spring.handlers等文件,找到其中的标签处理类,并运行其init方法。

详见http://blog.csdn.net/achilles12345/article/details/41789527。

4.      将student-test与student-web部署到tomcat上后,运行,报错” org.aspectj.lang.annotation.Around”.

要使用aspectj必须引入spring-aop和spring-aspects两个依赖。而因为博主在test项目中启用了aspectj,但在student-demo以及student-api中并没有创建这两个依赖。

此时,考虑到这只是一个dubbo例子,并无aspect调用,故去掉即可。

5.      student-web部署到tomcat上报错无法启动ContextLoaderListener与Log4jConfigListener。

这是因为tomcat在发布项目的时候没有同时发布maven依赖所添加的jar包。解决方法:项目 —>properties -> Deployment Assembly -> Add -> Java Build Path Entries-> 选择MavenDependencies -> Finish -> OK 把对应的Maven依赖包也发布到tomcat。

6.      同时发布时报错Webapp root system property already set to different value

因为是两个项目部署在统一个tomcat中,又都没有定义webAppRootKey,故需分别在它们的web.xml中配置一个自己的webAppRootKey。方法如下:

   webAppRootKey

   app1.root

7.      Student-test的controller中引入的productApi注解失败,即Noqualifying bean of type [com.product.api.ProductApi] found for dependency。

这是因为在dubbo远程服务代理中,dubbo的service、reference的加载机制决定的。reference标注的对象不会被spring容器管理,是无法通过factory.getBean获取的。

详见:http://blog.csdn.net/zhou_java_hui/article/details/53039491;http://blog.csdn.net/xiaoxiaoxuanao/article/details/54691641。


项目源码参见github:

提供者:https://github.com/Iwillloveyou/dubboSample-Provider.git

消费者:https://github.com/Iwillloveyou/dubboSample-Consumer.git

最后,感谢文中引用到的博文作者,谢谢你们的分享。文中可能部分内容有重复,还望别介意。

如有建议,欢迎留言。

你可能感兴趣的:(从零开始搭建一个dubbo框架及常见问题说明)