目录
1. Dubbo
1.1 Dubbo简介
1.2 Dubbo架构
2. 服务注册中心Zookeeper
2.1 Zookeeper简介
2.1.1 Zookeeper简介
2.1.2 Zookeeper安装与启动
3. 简单案例
3.1 服务提供者
3.2 服务消费者
3.3 Dubbo相关配置说明
4. Dubbo管理控制台
4.1 安装
4.2 使用
Apache Dubbo是一款高性能的Java RPC框架。其前身是阿里巴巴公司开源的一个高性能、轻量级的开源Java RPC框架,可以和Spring框架无缝集成。
什么是RPC?
RPC全称为remote procedure call,即远程过程调用。比如两台服务器A和B,A服务器上部署一个应用,B服务器上部署一个应用,A服务器上的应用想调用B服务器上的应用提供的方法,由于两个应用不在一个内存空间,不能直接调用,所以需要通过网络来表达调用的语义和传达调用的数据。
需要注意的是RPC并不是一个具体的技术,而是指整个网络远程调用过程。
RPC是一个泛化的概念,严格来说一切远程过程调用手段都属于RPC范畴。各种开发语言都有自己的RPC框架。Java中的RPC框架比较多,广泛使用的有RMI、Hessian、Dubbo等。
Dubbo官网地址:http://dubbo.apache.org
Dubbo提供了三大核心能力:面向接口的远程方法调用,智能容错和负载均衡,以及服务自动注册和发现。
节点角色说明
节点 | 角色说明 |
---|---|
Provider |
暴露服务的服务提供方 |
Consumer |
调用远程服务的服务消费方 |
Registry |
服务注册与发现的注册中心 |
Monitor |
统计服务的调用次数和调用时间的监控中心 |
Container |
服务运行容器 |
调用关系说明
Dubbo 架构具有以下几个特点,分别是连通性、健壮性、伸缩性、以及向未来架构的升级性。
1. 连通性
2. 健壮性
3. 伸缩性
4. 升级性
当服务集群规模进一步扩大,带动IT治理结构进一步升级,需要实现动态部署,进行流动计算,现有分布式服务架构不会带来阻力。下图是未来可能的一种架构:
节点角色说明
节点 | 角色说明 |
---|---|
Deployer |
自动部署服务的本地代理 |
Repository |
仓库用于存储服务应用发布包 |
Scheduler |
调度中心基于访问压力自动增减服务提供者 |
Admin |
统一管理控制台 |
Registry |
服务注册与发现的注册中心 |
Monitor |
统计服务的调用次数和调用时间的监控中心 |
Zookeeper 是 Apache Hadoop 的子项目,是一个树型的目录服务,支持变更推送,适合作为 Dubbo 服务的注册中心,工业强度较高,可用于生产环境,并推荐使用 。
为了便于理解Zookeeper的树型目录服务,我们先来看一下我们电脑的文件系统(也是一个树型目录结构):
Zookeeper树型目录服务:
流程说明:
服务提供者(Provider)启动时: 向 /dubbo/com.foo.BarService/providers
目录下写入自己的 URL 地址
服务消费者(Consumer)启动时: 订阅 /dubbo/com.foo.BarService/providers
目录下的提供者 URL 地址。并向 /dubbo/com.foo.BarService/consumers
目录下写入自己的 URL 地址
监控中心(Monitor)启动时: 订阅 /dubbo/com.foo.BarService
目录下的所有提供者和消费者 URL 地址
使用资料中提供的windows版本zookeeper服务器进行安装即可
进入安装路径的bin目录,双击zkServer.cmd即可启动zookeeper服务
Dubbo作为一个RPC框架,其最核心的功能就是要实现跨网络的远程调用。现在要创建两个应用,一个作为服务的提供者,一个作为服务的消费者。通过Dubbo来实现服务消费者远程调用服务提供者的方法。
项目目录结构如图
1. 创建一个空工程,并创建maven工程(打包方式为war)dubbodemo_provider模块,在pom.xml文件中导入如下坐标
UTF-8
1.8
1.8
5.0.2.RELEASE
org.springframework
spring-context
${spring.version}
org.springframework
spring-beans
${spring.version}
org.springframework
spring-webmvc
${spring.version}
org.springframework
spring-jdbc
${spring.version}
org.springframework
spring-aspects
${spring.version}
org.springframework
spring-jms
${spring.version}
org.springframework
spring-context-support
${spring.version}
com.alibaba
dubbo
2.6.0
org.apache.zookeeper
zookeeper
3.4.7
com.github.sgroschupf
zkclient
0.1
javassist
javassist
3.12.1.GA
com.alibaba
fastjson
1.2.47
2. 编写spring与dubbo整合的服务提供者spring配置文件applicationContext-dubboprovider.xml
3. 在web.xml中配置项目加载监听器,并指定spring配置文件的路径
contextConfigLocation
classpath*:applicationContext-*.xml
org.springframework.web.context.ContextLoaderListener
4. 编写service的接口和实现类
Service接口代码
public interface HelloService {
public String sayHello(String name);
}
Service实现类代码
import com.alibaba.dubbo.config.annotation.Service;
import com.alibaba.service.provider.HelloService;
//此注解使用的阿里巴巴的dubbo注解
@Service
public class HelloServiceImpl implements HelloService {
@Override
public String sayHello(String name) {
return "hello@@"+name;
}
}
1. 导入坐标
UTF-8
1.8
1.8
5.0.2.RELEASE
org.springframework
spring-context
${spring.version}
org.springframework
spring-beans
${spring.version}
org.springframework
spring-webmvc
${spring.version}
org.springframework
spring-jdbc
${spring.version}
org.springframework
spring-aspects
${spring.version}
org.springframework
spring-jms
${spring.version}
org.springframework
spring-context-support
${spring.version}
com.alibaba
dubbo
2.6.0
org.apache.zookeeper
zookeeper
3.4.7
com.github.sgroschupf
zkclient
0.1
javassist
javassist
3.12.1.GA
com.alibaba
fastjson
1.2.47
2. 配置服务消费者的Spring配置文件applicationContext-consumer.xml
3. 在web.xml配置前端控制器,加载spring的配置信息
springmvc
org.springframework.web.servlet.DispatcherServlet
contextConfigLocation
classpath*:applicationContext-*.xml
1
springmvc
*.do
4. 编写控制器
import com.alibaba.dubbo.config.annotation.Reference;
import com.alibaba.provider.HelloService;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
@Controller
public class HelloController {
//此处使用阿里巴巴的注解进行注入
@Reference
HelloService helloService;
@RequestMapping("/hello")
public void hello(String name) {
String result = helloService.sayHello(name);
System.out.println(result);
}
}
注意:服务提供者的接口必须存在于服务消费者的目录中,并且该接口的路径与服务提供者的路径必须保持一致,一模一样。
1. 包扫描:
服务提供者和服务消费者都需要配置,表示包扫描,作用是扫描指定包(包括子包)下的类
如果不使用包扫描,也可以通过如下配置的方式来发布服务
作为服务消费者,可以通过如下配置来引用服务:
上面这种方式发布和引用服务,一个配置项(dubbo:service、dubbo:reference)只能发布或者引用一个服务,如果有多个服务,这种方式就比较繁琐了。推荐使用包扫描方式。
2. 协议:
一般在服务提供者一方配置,可以指定使用的协议名称和端口号。
其中Dubbo支持的协议有:dubbo、rmi、hessian、http、webservice、rest、redis等。
推荐使用的是dubbo协议。
dubbo 协议采用单一长连接和 NIO 异步通讯,适合于小数据量大并发的服务调用,以及服务消费者机器数远大于服务提供者机器数的情况。不适合传送大数据量的服务,比如传文件,传视频等,除非请求量很低。
也可以在同一个工程中配置多个协议,不同服务可以使用不同的协议
3. 启动时检查
上面这个配置需要配置在服务消费者一方,如果不配置默认check值为true。Dubbo 缺省会在启动时检查依赖的服务是否可用,不可用时会抛出异常,阻止 Spring 初始化完成,以便上线时,能及早发现问题。可以通过将check值改为false来关闭检查。
建议在开发阶段将check值设置为false,在生产环境下改为true。
我们在开发时,需要知道Zookeeper注册中心都注册了哪些服务,有哪些消费者来消费这些服务。我们可以通过部署一个管理中心来实现。其实管理中心就是一个web应用,部署到tomcat即可
安装步骤:
(1)将资料中的dubbo-admin-2.6.0.war文件复制到tomcat的webapps目录下
(2)启动tomcat,此war文件会自动解压
(3)修改WEB-INF下的dubbo.properties文件,注意dubbo.registry.address对应的值需要对应当前使用的Zookeeper的ip地址和端口号
dubbo.registry.address=zookeeper://Ip:2181
dubbo.admin.root.password=root
dubbo.admin.guest.password=guest
(4)重启tomcat
操作步骤:
访问http://localhost:8080/dubbo-admin-2.6.0/,输入用户名(root)和密码(root)