环境部署

Zookeeper安装

下载apach-zookeeper压缩包,解压到目标文件夹即可,复制conf中的zoo_sample.cfg为zoo.cfg,在解压的根目录下新建data文件夹和logs文件夹,修改其中配置:

dataDir=E:\Program\apache-zookeeper-3.5.5\data
dataLogDir=E:\Program\apache-zookeeper-3.5.5\logs

zookeepr默认端口为2181,安装完成后双击bin下的zkServer.cmd即可启动服务(若启动闪退,应该是版本的问题,可选择低版本的安装包)

dubbo-admin部署

下载可用的dubbo-admin.war包,或者下载git上的dubbo源码,maven编译打包后将target中的dubbo-admin文件夹复制到tomcat的webapps下,开启tomcat,浏览器输入http://localhost:8080/dubbo-admin/ 用户名密码:root/root登录即可看到zookeeper中管理的dubbo服务发布和消费的情况。

项目结构

首先,我们最基础的分布式架构项目应该由服务提供者、消费者、公用的服务api标准,这三部分组成,所以我们新建三个项目模块,dubbo-provider、dubbo-consumer、service-api;项目结构如下图:

服务接口模块

我们在service-api中定义好通用服务的接口和一些公共操作类(工具类,实体类,传输模型等),然后在pom中将该模块配置安装成本地jar包,供其它两个模块调用;需要注意的是dubbo的对象传输需要实现序列化接口。

服务提供方

provider需要的依赖

dubbo-provider中主要是对刚刚定义的服务接口的实现,提供者由于只需要Spring接管service和repository,不用关注controller层控制视图,所以不需要spring-mvc相关依赖,pom文件中除了spring等相关依赖还需要引入dubbo最新的依赖包、netty-all包、curator-framework包、zookeeper的依赖包和刚刚安装的service-api依赖:

 <dependency><groupId>com.legolas</groupId><artifactId>service-api</artifactId><version>0.0.1-SNAPSHOT</version></dependency><dependency><groupId>com.alibaba</groupId><artifactId>dubbo</artifactId><version>2.6.6</version></dependency><dependency><groupId>io.netty</groupId><artifactId>netty-all</artifactId><version>4.1.32.Final</version></dependency><dependency><groupId>org.apache.curator</groupId><artifactId>curator-framework</artifactId><version>4.0.1</version></dependency><dependency><groupId>org.apache.zookeeper</groupId><artifactId>zookeeper</artifactId><version>3.4.8</version></dependency><dependency><groupId>com.github.sgroschupf</groupId><artifactId>zkclient</artifactId><version>0.1</version></dependency>

provider的业务实现和发布

添加好依赖以后,我们新建dao包完成数据库相关业务,然后新建api包,在api包里完成服务接口的业务实现:

api包里的实现类必须实现service-api中定义好的接口,这样在消费方才能通过service-api中的接口去发现并使用提供者发布的服务,这里因为我使用了多数据源切换服务(似乎自定义的@TargetDataSource与dubbo的注解存在扫描顺序的冲突),所以我新增了serviceImpl包,在serviceImpl包中完成了所有的业务实现,然后在api层直接调用业务实现类。最后在所有需要发布服务的api前添加dubbo的@Service注解,就可以成功发布dubbo服务。

provider的spring和dubbo配置

最后,在provider项目中由spring接管的配置文件application-context中我们先对spring的注解进行扫描,然后扫描dubbo的注解(消费方的扫描顺序相反)

    <aop:aspectj-autoproxy/><!--spring注解扫描--><context:component-scan base-package="com.legolas.provider.config"/><context:component-scan base-package="com.legolas.provider.dao"/><context:component-scan base-package="com.legolas.provider.serviceImpl"/><import resource="spring-mybatis.xml"/><!--dubbo注解扫描--><dubbo:annotation package="com.legolas.provider.api"/><import resource="dubbo.xml"/>

provider的web.xml配置

在配置web.xml时我们将所有业务交给spring容器接管,不需要做spring-mvc的配置,这里我们可以使用com.alibaba.dubbo.remoting.http.servlet.DispatcherServlet类替代spring的DispatcherServlet;(查阅资料了解如果项目使用外部服务器部署,必须将dubbo的BootstrapListener和DispatherServlet添加到web.xml,以完成dubbo的REST功能与外部servlet容器的集成)

  <context-param><param-name>contextConfigLocation</param-name><param-value>classpath:application-context.xml</param-value></context-param><!-- <listener><listener-class>com.alibaba.dubbo.remoting.http.servlet.BootstrapListener</listener-class></listener>--><listener><listener-class>org.springframework.web.context.ContextLoaderListener</listener-class></listener><servlet><servlet-name>dispatcher</servlet-name><servlet-class>com.alibaba.dubbo.remoting.http.servlet.DispatcherServlet</servlet-class><load-on-startup>1</load-on-startup></servlet><servlet-mapping><servlet-name>dispatcher</servlet-name><url-pattern>/</url-pattern></servlet-mapping>

在dubbo-admin中可以查看发布的服务:

服务消费方

dubbo-consumer需要的相关依赖与provider相同。

consumer调用服务

consumer调用服务非常简单,在controller层使用dubbo的@Reference注解就可以实现对提供者服务的调用:

@Controller
@RequestMapping("/article")
public class ArticleController {@ReferenceArticleService articleService;@RequestMapping("/getAllArticle")@ResponseBodypublic List getAllArticle(){return articleService.getAllArticle();}
}

对服务进行分组

此外我们可以在服务提供方对发布的服务进行分组指定组名,消费方通过组名区分相同类型接口的服务。

provider:

@Service(group = "group1")
public class TestService1API implements TestService {@Overridepublic String test(String name) {return "(我是group1)test :"+name;}
}@Service(group = "group2")
public class TestService2API implements TestService {@Overridepublic String test(String name) {return "(我是group2)test :"+name;}
}

consumer:

@RequestMapping("/test")
public class TestController {@Reference(group = "group1")private TestService testService1;@Reference(group = "group2")private TestService testService2;...}

consumer的spring和dubbo配置

在消费方,我们需要先完成对dubbo的扫描,然后再进行spring的扫描,否则@Reference注解注入的对象会报空指针异常,所以application-context.xml中需要如下配置:

  <dubbo:annotation package="com.legolas.consumer.web.controller" /><context:component-scan base-package="com.legolas.consumer.web"/><import resource="spring-mvc.xml" /><import resource="dubbo.xml" />

dubbo.xml

  <!-- 提供方应用信息,用于计算依赖关系,名称无所谓 --><dubbo:application name="dubbo_constumer" /><!-- 使用zookeeper注册中心暴露服务地址 --><dubbo:registry address="zookeeper://127.0.0.1:2181" check="false" file="dubbo-consumer-registry.properties"/>

consumer的web.xml配置
consumer的web.xml配置中spring-mvc也可以架空,控制层的配置可以在java代码中实现。需要注意的是如果要配置静态资源的视图解析,需要开启<mvc:default-servlet-handler/>,相同效果的配置代码如下:

@Override
public void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) {
configurer.enable();
}

在dubbo-admin中可以查看服务的消费方:

排错问题记录

1.provider与consumer中的dubbo与spring的扫描顺序:provider中先spring后dubbo,consumer中相反。
2.Dubbo消费者在使用@Reference注解时报空指针异常的原因:
由于在web.xml中配置application-context.xml的初始化完controller类之后,同时将dubbo的reference的实例已经交给了controller,而后配置的spring-mvc.xml在进行servlet的初始化的时候再一次对controller进行了初始化,但是它与spring顶级容器不同的是,没有加载dubbo实现的DubboNamespaceHandler,就是说reference实例化的过程都没有进行,因此在mvc容器中的controller是没有注入reference标注的实例的,因此出现NULL的情况。 解决办法是避免在spring-mvc.xml中扫描dubbo的注解。
3.保证dubbo和spring的版本为比较新的版本,在实际使用中各个版本的dubbo所需要的依赖不尽相同(如dubbo2.3.8就不需要netty-all与curator-framework依赖包)对spring的版本也有不同要求,实际运行中出现ClassNotFound等错误时可根据实际情况添加或排除依赖、更换版本等操作进行调整。
4.这点在所有springmvc项目中都需要注意的是,项目需要在controller层实现视图自动匹配控制转向时,需要配置<mvc:default-servlet-handler/>,该标签作用是 Spring MVC在上下文中定义一个org.springframework.web.servlet.resource.DefaultServletHttpRequestHandler,对进入 DispatcherServlet 的 URL 进行筛查,静态资源由 Web 服务器默认的Servlet处理,非静态资源的请求,由spring的DispatcherServlet处理。

项目示例源码
https://gitee.com/legolaseee/DubboDemo
个站链接:http://www.legolas94.top

dubbo+zookeper实现分布式服务部署实例相关推荐

  1. 基于Dubbo框架构建分布式服务(三)

    我们将上面开发的服务提供方服务,部署到2个独立的节点上(192.168.14.1和10.10.4.125),然后可以通过Dubbo管理中心查看对应服务的状况,如图所示: 上图中可以看出,该服务有两个独 ...

  2. dubbo(开源分布式服务框架)1---------Dubbo需要四大基本组件

    Dubbo需要四大基本组件:Registry.Monitor.Provider.Consumer.  Provider:提供者 Consumer:消费者 registry:注册中心(相当于中介) mo ...

  3. SpringCloud工作笔记045---SpringCloud分布式服务部署常用端口

    JAVA技术交流QQ群:170933152 数据库,rabbitmq,还有为服务端口,申请服务器端口 3306,5671,5672,15672, 8000-8050这个区间段吧 3316,2032

  4. dubbo 分布式服务框架 介绍

    Dubbo是阿里巴巴内部的SOA服务化治理方案的核心框架,每天为2000+ 个服务提供3,000,000,000+ 次访问量支持,并被广泛应用于阿里巴巴集团的各成员站点.Dubbo自2011年开源后, ...

  5. 阿里巴巴分布式服务框架 Dubbo 团队成员梁飞专访

    专家访谈 目录(?)[-] 先来个自我介绍吧! Dubbo是什么?能做什么? Dubbo适用于哪些场景? Dubbo的设计思路是什么? Dubbo的需求和依赖情况? Dubbo的性能如何? 和淘宝HS ...

  6. java分布式服务框架Dubbo的介绍与使用

    1. Dubbo是什么? Dubbo是一个分布式服务框架,致力于提供高性能和透明化的RPC远程服务调用方案,以及SOA服务治理方案.简单的说,dubbo就是个服务框架,如果没有分布式的需求,其实是不需 ...

  7. (转)阿里巴巴分布式服务框架 Dubbo 团队成员梁飞专访

    Dubbo是阿里巴巴内部的SOA服务化治理方案的核心框架,每天为2000+ 个服务提供3,000,000,000+ 次访问量支持,并被广泛应用于阿里巴巴集团的各成员站点.Dubbo自2011年开源后, ...

  8. Dubbo分布式服务框架入门(附工程)

    要想了解Dubbo是什么,我们不防先了解它有什么用. 使用场景:比如我想开发一个网上商城项目,这个网上商城呢,比较复杂,分为pc端web管理后台,微信端销售公众号,那么我们分成四个项目,pc端网站,微 ...

  9. 团队成员梁飞专访:阿里巴巴分布式服务框架Dubbo

    Dubbo是阿里巴巴内部的SOA服务化治理方案的核心框架,每天为2000+ 个服务提供3,000,000,000+ 次访问量支持,并被广泛应用于阿里巴巴集团的各成员站点.Dubbo自2011年开源后, ...

最新文章

  1. 超长的十六进制数转换为八进制
  2. 把angular(vue等)项目部署在局域网上
  3. Cocos2d-x 3.2:通过ClippingNode实现一个功能完善的跑马灯公告(1)
  4. 如何使用多个端口访问tomcat
  5. OpenSUSE11实现pam_mysql对FTP认证管理
  6. Maven学习总结(21)——Maven常用的几个核心概念
  7. 如何运用所掌握的技术构建一个完整的业务架构
  8. SDR与DDR的区别
  9. 宣布正式发布 Azure 媒体服务内容保护服务
  10. 密码生成器c语言程序,C++全密码生成的实现代码
  11. 微信 小程序弹框 简单实现
  12. 旋风加速安卓Android官网,旋风加速官网版最新版
  13. Shadowing Japanese Unit 4
  14. 关于背包问题的递归解法
  15. 漫画:大鱼吃小鱼,小鱼吃虾米。小鱼为什么不能躲起来?
  16. Chrome安装插件SwitchyOmega
  17. Windows Embedded CE 6.0 and R2 下载地址
  18. 记录一下网络爬虫实战scrapy---某蜜蜂网站
  19. MATLAB运动车辆检测系统
  20. CSS水平垂直居中的几种实现方式

热门文章

  1. 用Python让蔡徐坤在我的命令行里打篮球!| 附完整代码
  2. 2021年金属非金属矿山(露天矿山)安全管理人员考试题及金属非金属矿山(露天矿山)安全管理人员考试技巧
  3. 六大维度层层剖析,一篇文章带你快速读懂信息无障碍
  4. python将图像变成灰度图像_如何在Python中将RGB图像转换为灰度?
  5. ubuntu server 14.04 编译安装xen4.4.2配置vtpm(二)——Dom0内核编译
  6. iOS偏好设置的存储注意事项
  7. 数据保护:UPS不间断电源初步使用
  8. Hadoop的NameNode在启动时都做了哪些事情?源码解析
  9. 做一名优秀的软件开发qa_如何成为一名优秀的开发人员
  10. AU变声功能音频调节