dubbo入门简单学习
Dubbo简介
- Apache Dubbo是一款高性能的java RPC框架,其前身是阿里巴巴公司开源的一个高性能,轻量级的开源java RPC框架,可以和Spring框架无缝集成。
RPC简介
- RPC全称为remote procedure call,即远程过程调用,比如两台服务器A和B,A服务器上部署一个应用,B服务器上部署一个应用,A服务器上的应用想要调用B服务器上的应用提供的方法,由于两个应用不在一个内存空间,不能直接调用,所以需要通过网络来表达调用的语义和传达调用的数据。需要注意的是RPC并不是一个具体的技术,而是指整个网络远程调用的过程。各种开发语言都有自己的RPC框架,java中的RPC框架等比较多,广泛使用的有RMI、Hessian、Dubbo等。Dubbo提供了三大核心能力:面向接口的远程方法调用,智能容错和负载均衡,以及服务自动注册和发现。
Dubbo组成
- 主要由一下几部分构成。暴露服务的服务提供方(Provider),调用远程服务的服务消费方(Consumer),服务注册与发现的注册中心(Registry),统计服务的调用次数和调用时间的监控中心(Monitor),服务运行容器(Container),服务提供方需要运行在容器中,提供方到注册中心注册,消费方到服务中心订阅,调用提供方提供的内容。下图中的虚线都是异步访问,实线都是同步访问,蓝色虚线表示在启动时完成的功能,红色线都是程序运行过程中执行的功能。

服务注册中心zookeeper在windows下的安装
- zookeeper是apache hadoop的子项目,是一个树形的目录服务,支持变更推送,适合作为dubbo服务的注册中心,工业强度较高,可用于生产环境。
- 到 https://zookeeper.apache.org/releases.html 下载安装包
- 解压到安装目录,进入解压的文件夹,新建一个data目录和log目录。进入conf目录找到zoo_sample.cfg文件,复制一份,重命名为zoo.cfg。将dataDir设置为新建的data目录的路径,新增一个dataLogDir设置为新建的log目录。



- 进入bin目录,点击zkServer.cmd运行,点击zkCli.cmd运行,出现如下界面即算成功

我在开始安装时,安装的是最新的3.6版本,无法运行窗口一闪而过,于是重新下载的3.5.8-bin就可以正常运行。
入门实操
- 需要导入spring及web框架的jar包,然后就是dubbo和zookeeper(服务注册中心)相关jar包
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>dubbo</artifactId>
<version>2.5.3</version>
</dependency>
<dependency>
<groupId>org.apache.zookeeper</groupId>
<artifactId>zookeeper</artifactId>
<version>3.4.6</version>
<type>pom</type>
</dependency>
<dependency>
<groupId>com.github.sgroschupf</groupId>
<artifactId>zkclient</artifactId>
<version>0.1</version>
</dependency>
- 导入tomcat插件
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>2.3.2</version>
<configuration>
<source>1.8</source>
<target>1.8</target>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.tomcat.maven</groupId>
<artifactId>tomcat7-maven-plugin</artifactId>
<version>2.2</version>
<configuration>
<!-- 指定端口-->
<port>8082</port>
<!-- 请求路径-->
<path>/</path>
</configuration>
</plugin>
- 注意:千万不要把该插件放在pluginManagement标签中,该标签负责管理插件,不会下载,只需要放在
下的 下就可以了 - 编辑配置,为每个模块配置tomcat



服务提供方编写
- 在建好的项目中编写一个service的接口与实现类,注意注解是dubbo的而不是spring提供的
- 配置应用相关的配置文件,新建一个applicationContext-service.xml文件
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:dubbo="http://code.alibabatech.com/schema/dubbo"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://code.alibabatech.com/schema/dubbo
http://code.alibabatech.com/schema/dubbo/dubbo.xsd">
<!-- 当前应用名称,用于注册中心计算应用间依赖关系,消费者与提供者应用名不要一样-->
<dubbo:application name="dubbodemo_provider"/>
<!-- 连接服务注册中心zookeeper,ip为zookeeper服务器所在ip地址-->
<dubbo:registry address="zookeeper://192.168.1.107:2181"/>
<!-- 注册协议和port 端口默认是20880-->
<dubbo:protocol name="dubbo" port="20880"/>
<!-- 扫描指定包,加入@Service注解的类会被发布为服务-->
<dubbo:annotation package="com.cdut.service.impl"/>
</beans>
- 配置web.xml文件,设置监听器,当服务器启动就读取配置文件并生成容器
<web-app>
<display-name>Archetype Created Web Application</display-name>
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:applicationContext-service.xml</param-value>
</context-param>
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
</web-app>
import com.alibaba.dubbo.config.annotation.Service;
import com.cdut.service.HelloService;

//发布为服务,必须使用dubbo的注解
@Service
public class HelloServiceImpl implements HelloService {
@Override
public String sayHello(String s) {
return "hello" + s;
}
}
消费方编写
- 在该项目下新建另一个模块,注意,新的模块路径应在该项目下,与前一个模块同级,创建时注意。

- 新建一个配置文件applicationContext-web.xml,配置消费方相关信息
<!-- 当前应用名称,用于注册中心计算应用间依赖关系,消费者与提供者应用名不要一样-->
<dubbo:application name="dubbodemo_consumer"/>
<!-- 连接服务注册中心zookeeper,ip为zookeeper服务器所在ip地址-->
<dubbo:registry address="zookeeper://192.168.1.107:2181"/>
<!-- 扫描指定包,加入@Service注解的类会被发布为服务-->
<dubbo:annotation package="com.cdut.controller"/>
- 配置web.xml文件,配置前端控制器,拦截web请求
<servlet>
<servlet-name>dispatcherServlet</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:applicationContext-web.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>dispatcherServlet</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
- 编写一个controller设置映射路径,设置注入注解,该注解也是dubbo提供的Reference。把提供方的service接口也复制到本模块下。
@Controller
@RequestMapping("/hello")
public class HelloController {
//该注解是com.alibaba.dubbo.config.annotation.Reference
@Reference
private HelloService helloService;
@RequestMapping("sayHello")
@ResponseBody
public String sayHello(String name){
return helloService.sayHello(name);
}
}
测试结果


浙公网安备 33010602011771号