一、什么是dubbo?
简单的说dubbo是一个分布式服务框架。这里不多说了,详情请参考官方文档:Apache Dubbo Doc
二、为什么要用dubbo,它能做什么?
dubbo能优雅的将我们的系统切分成一个个模块来发布,像阿里的电商业务,服务器的压力有多大可想而知,试想如果整个系统都放在一个项目里面,那这台服务器分分秒就要冒烟!按业务模块分开来部署,将访问量平均的分发到各个模块的服务器,当然各个模块可能又有多个节点;这样能提高我们的系统的吞吐量,又能提高性能,还能将系统各个模块解耦,A模块的服务挂了,不至于B模块的功能也不能访问了;你可能会说,我不用dubbo也能将项目按模块分开来部署啊,但是将服务都分开并不代表他们之前就完全分开了,dubbo能帮我们实现多个服务之间进行通信,也就是远程服务调用;比如我们整个平台下可能会有个基础服务,专门提供一些基础性的服务,好多服务得用到吧,dubbo就能帮我们实现远程接口的暴露和调用。
三、dubbo的工作原理
上图主要有这么几个角色:注册中心(Registry)、服务者(Provider)、消费者(Consumer)、监控中心(Monitor);那么他们之间是怎么样一个关系呢?首先这个注册中心是比较独立的,可以是zookeeper、redis等等,你可以当它是个第三方的平台,这个托管平台准备就绪之后,我们通过编写代码和配置,将服务者实现出来,配置里面会指向我们的注册中心,我们要提供的服务都托管给注册中心,然后消费者通过配置告诉注册中心,需要调用什么服务,我们称为订阅;那监控中心呢?它是一个异步统计远程接口的调用次数和成功情况的,数据好像是存在硬盘上,有兴趣的同学可以去了解一下。说到这里是不是有点感觉了?下面我们就来看看具体要怎么用dubbo吧!
四、dubbo具体的使用步骤
1、准备好我们的注册中心,这里用zookeeper来做例子,我用linux系统搭建的,具体安装步骤不做赘述了,参考centos7搭建dubbo-admin中的zookeeper安装,安装好按帖子中的步骤配置好端口和防火墙启动服务即可
2、创建maven项目
项目结构我简单说明一下,dubbo-api-remote-service项目是一个jar,用来定义远程接口,然后dubbo-api-all是我的一个服务,这里它只充当一个服务提供者的角色,它就实现了我定义的一个接口,dubbo-app-web就是我们的消费者了,这里dubbo-app-web直接引用dubbo-api-remote-service,这样就可以随心所欲的调用接口了,具体看下面的配置和代码。
定义远程接口:
实现远程接口:
然后具体来看dubbo-api-all项目的构建了;
sping容器配置文件:
springmvc容器配置文件:
重点来了,服务提供者的配置:
配置web.xml:
服务提供者配置完毕,可以启动了,tomcat start.........
接下来我们配置消费者去调用我们的服务,
然后消费者的dubbo配置:
最后看下核心的jar包有哪些,上pom.xml
<properties>
<spring.version>4.2.8.RELEASE</spring.version>
<org.apache.logging.log4j.version>2.8.2</org.apache.logging.log4j.version>
</properties>
<dependencies>
<dependency>
<groupId>com.dubbo</groupId>
<artifactId>dubbo-api-remote-serivce</artifactId>
<version>${project.version}</version>
</dependency>
<!-- spring相关 -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-beans</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aop</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-tx</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-orm</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context-support</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>servlet-api</artifactId>
<version>2.5</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>dubbo</artifactId>
<version>2.5.3</version>
<exclusions>
<exclusion>
<groupId>org.springframework</groupId>
<artifactId>spring</artifactId>
</exclusion>
</exclusions>
</dependency>
<!-- https://mvnrepository.com/artifact/io.netty/netty <dependency> <groupId>io.netty</groupId>
<artifactId>netty</artifactId> <version>3.10.0.Final</version> </dependency> -->
<!-- https://mvnrepository.com/artifact/com.101tec/zkclient -->
<dependency>
<groupId>com.github.sgroschupf</groupId>
<artifactId>zkclient</artifactId>
<version>0.1</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.apache.zookeeper/zookeeper -->
<dependency>
<groupId>org.apache.zookeeper</groupId>
<artifactId>zookeeper</artifactId>
<version>3.4.5</version>
</dependency>
<!-- https://mvnrepository.com/artifact/log4j/log4j -->
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version>
</dependency>
<!-- json -->
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-core</artifactId>
<version>2.8.4</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.8.4</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-annotations</artifactId>
<version>2.8.4</version>
</dependency>
<!-- log -->
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-core</artifactId>
<version>${org.apache.logging.log4j.version}</version>
</dependency>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-api</artifactId>
<version>${org.apache.logging.log4j.version}</version>
</dependency>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-jcl</artifactId>
<version>${org.apache.logging.log4j.version}</version>
</dependency>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-slf4j-impl</artifactId>
<version>${org.apache.logging.log4j.version}</version>
</dependency>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-1.2-api</artifactId>
<version>${org.apache.logging.log4j.version}</version>
</dependency>
<dependency>
<groupId>com.lmax</groupId>
<artifactId>disruptor</artifactId>
<version>3.3.0</version>
</dependency>
</dependencies>
好了,把消费者也启动,访问一下:
看看结果:
好了,最后附上demo的下载地址:dubbo-demo,有问题欢迎指出或评论哦!