1. Dubbo官网
1). 发展历史
随着互联网的不断发展,网站的应用规模越来越大,常规的垂直架构已经无法应对,尤其是类似电商的项目,所以分布式架构和流动计算架构已经势在必行。Dubbo就是资源调度和服务治理中心的管理工具。
① 单一应用架构(ORM)
当网站流量很小时,只需一个应用,将所有功能如下单支付等都部署在一起,以减少部署节点和成本。 缺点:单一的系统架构,使得在开发过程中,占用的资源越来越多,而且随着流量的增加越来越难以维护
② 垂直应用架构(MVC)
垂直应用架构解决了单一应用架构所面临的扩容问题,流量能够分散到各个子系统当中,且系统的体积可控,一定程度上降低了开发人员之间协同以及维护的成本,提升了开发效率。 缺点:但是在垂直架构中相同逻辑代码需要不断的复制,不能复用。
③ 分布式服务架构(RPC)
当垂直应用越来越多,有很多相同的业务逻辑,这样应用直接的交互不可避免,此时将核心业务抽取出来,作为独立的服务,逐 渐形成稳定的服务中心,以应对快速变化的外部市场环境。
④ 流动计算架构(SOA)
当服务越来越多,容量的评估,小服务资源浪费等问题逐渐暴露,此时需要一个服务治理工具来管理集群容量,提高利用率。
2). 为什么使用dubbo?
1.webservice:效率不高基于soap协议,项目中不建议使用,但它的优点在于跨语言通信,适用于不同公司相互调用接口。
2.使用restful形式服务:http+json。很多项目中的应用,如果服务太多,系统之间调用关系混乱,需要治疗服务。
3.使用dubbo。使用rpc协议进行远程调用,之间使用socket通信,传输效率高,并且可以统计出系统之间的调用关系、调用次数。
说白了dubbo就是一个服务治理工具,是一个服务的中间件,由于dubbo是通过java编写的,dubbo最大的缺点就出现了,它只适用于java系统间的通信。
3). Dubbo架构
角色说明:
- Provider:暴露服务的服务提供方
- Container:服务运行容器
- Consumer:调用服务的消费方
- Registry:注册服务与发现服务中心
-
Monitor:统计服务调用的监控中心(可有可无)
调用关系说明:
0:服务运行容器启动,加载服务提供者
1:在启动时告诉注册中心服务方有什么服务
2:消费者调用服务时,先到注册中心订阅所需要服务
3:注册中心返回结果即该服务的地址
4:消费者通过地址调用服务(此时注册中心没用了)
5:服务消费者和提供者,在内存中累计调用次数和调用时间,定时每分钟发送一次到监控中心
4). RPC(Remote Procedure Call Protocol)
远程过程调用: 两台服务器A、B,分别部署不同的应用a,b。当A服务器想要调用B服务器上应用b提供的函数或方法的时候,由于不在一个内存空间,不能直接调用,需要通过网络来表达调用的语义传达调用的数据。
RPC是一种通过网络从远程计算机程序上请求服务,而不需要了解底层网络技术的协议。RPC协议假定某些传输协议的存在,如TCP或UDP,为通信程序之间携带信息数据。在OSI网络通信模型中,RPC跨越了传输层和应用层。RPC使得开发包括网络分布式多程序在内的应用程序更加容易。 RPC采用客户机/服务器模式。请求程序就是一个客户机,而服务提供程序就是一个服务器。首先,客户机调用进程发送一个有进程参数的调用信息到服务进程,然后等待应答信息。在服务器端,进程保持睡眠状态直到调用信息到达为止。当一个调用信息到达,服务器获得进程参数,计算结果,发送答复信息,然后等待下一个调用信息,最后,客户端调用进程接收答复信息,获得进程结果,然后调用执行继续进行。
5). Dubbo的注册中心
- Multicast注册中心
- Zookeeper注册中心
- Redis注册中心
- Simple注册中心
6). Dubbo优缺点
- 优点:
- 透明化的远程方法调用:像调用本地方法一样调用远程方法;只需简单配置,没有任何API侵入。
- 软负载均衡及容错机制:可在内网替代nginx lvs等硬件负载均衡器。
- 服务注册中心自动注册 & 配置管理:不需要写死服务提供者地址,注册中心基于接口名自动查询提供者ip。使用类似zookeeper等分布式协调服务作为服务注册中心,可以将绝大部分项目配置移入zookeeper集群。
- 服务接口监控与治理 :Dubbo-admin与Dubbo-monitor提供了完善的服务接口管理与监控功能,针对不同应用的不同接口,可以进行 多版本,多协议,多注册中心管理。
- 缺点:只支持JAVA语言
2. Spring+Dubbo+ZooKeeper实例
1). 准备jar包(共16个)
- **Spring: ** commons-logging-1.2.jar、spring-aop-5.0.5.RELEASE.jar、spring-beans-5.0.5.RELEASE.jar、spring-context-5.0.5.RELEASE.jar、spring-core-5.0.5.RELEASE.jar、spring-expression-5.0.5.RELEASE.jar
- **Dubbo: ** dubbo-2.6.1.jar
- **ZooKeeper: ** log4j-1.2.16.jar、slf4j-api-1.6.1.jar、slf4j-log4j12-1.6.1.jar、netty-3.10.5.Final.jar、zookeeper-3.4.10.jar
- **Other: **curator-client-4.0.1.jar、curator-framework-4.0.1.jar、javassist-3.22.0-GA.jar、selenium-server-standalone-3.11.0.jar
2). 创建Dubbo-api Java项目
I. 引入jar包
右键项目 -> Build Path -> Configure Build Path... -> Libraries -> Add External JARs... 找到自己刚刚存放jar包的文件夹,我的是在E:\eclipse\libs\
文件夹中,全选(Ctrl+A)jar包,点击打开—> OK. 导包成功.
II. 将解压ZooKeeper后的文件夹中/conf/文件夹下的log4j.properties拷贝到工程的src目录下
III. 在src下创建ItemService接口
public interface ItemService {
List<String> getList(Long id);
}
IV. Dubbo-api 工程目录结构
3). 创建Dubbo-provider Java工程
I. 导包--方法同上
II. 依赖上一步完成的Dubbo-api Java工程
工程上右键 -> Build Path -> Configure Build Path... -> Project -> Add... ->选择Dubbo-api 点击OK -> OK
III. 创建ItemService的实现类ItemServiceImpl
public class ItemServiceImpl implements ItemService{
@Override
public List<String> getList(Long id) {
List<String> list = new ArrayList<>();
for (int i = 0; i < 20; i++) {
list.add("item" + i);
}
return list;
}
}
IV. 在src目录下创建provider.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-admin 或 dubbo-monitor 会显示这个名字,方便辨识 -->
<dubbo:application name="Dubbo-provider" owner="programmer" organization="mazaiting"/>
<!-- 使用ZooKeeper 注册中心暴露服务,注意要先开启ZooKeeper -->
<dubbo:registry address="zookeeper://127.0.0.1:2181"/>
<!-- 使用Dubbo协议在20880端口暴露服务 -->
<dubbo:protocol name="dubbo" port="20880"/>
<!-- 使用dubbo 协议实现定义好的服务接口 -->
<dubbo:service protocol="dubbo" ref="itemService" interface="com.mazaiting.service.ItemService"/>
<!-- 具体实现该接口的bean -->
<bean id="itemService" class="com.mazaiting.service.impl.ItemServiceImpl"/>
</beans>
如果遇到无法快捷提示dubbo标签的情况, 请参考此文--Dubbo 无法加载dubbo.xsd
V. 创建Provider类,此类中启动此工程
public class Provider {
public static void main(String[] args) throws IOException {
ClassPathXmlApplicationContext context =
new ClassPathXmlApplicationContext("provider.xml");
System.out.println(context.getDisplayName() + " : here");
context.start();
System.out.println("服务已经启动...");
System.in.read();
}
}
VI. Dubbo-provider 工程目录结构
4). 创建Dubbo-consumer Java工程
I. 导包 -- 方法同上
II. 在src下创建consumer.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-admin 或 dubbo-monitor 会显示这个名字,方便辨识 -->
<dubbo:application name="Dubbo-consumer" owner="programmer" organization="mazaiting"/>
<!-- 向ZooKeeper 订阅provider的地址, 由ZooKeeper定时推送 -->
<dubbo:registry address="zookeeper://127.0.0.1:2181"/>
<!-- 使用协议调用定义好的接口 -->
<dubbo:reference id="itemService" interface="com.mazaiting.service.ItemService"/>
</beans>
III. 创建Consumer类来启动当前工程
public class Consumer {
public static void main(String[] args) {
ClassPathXmlApplicationContext context =
new ClassPathXmlApplicationContext("consumer.xml");
context.start();
System.out.println("consumer start");
ItemService demoService = context.getBean(ItemService.class);
System.out.println("consumer");
List<String> list = demoService.getList(1L);
for (String string : list) {
System.out.println(string);
}
}
}
IV. Dubbo-consumer 工程目录结构
5). 测试
I. 开启ZooKeeper -- ZooKeeper安装及使用
II. 执行Dubbo-provider工程中的Provider类
III. 再启动Dubbo-consumer工程中的Consumer类
3. Dubbo 控制台安装
1). Dubbo-admin下载
2). 编译项目
编译项目需要使用到Maven命令, Linux 安装Maven 和Windows 安装Maven
下载之后解压,并进入incubator-dubbo-ops-master文件夹,在命令提示符窗口中输入
mvn clean package
编译成功如下图:
3). 安装Tomcat容器
这里我下载的是zip包,下载后并解压
4). 复制文件
将incubator-dubbo-ops-master\dubbo-admin\target\下的dubbo-admin-2.0.0.war复制到apache-tomcat-8.5.31\webapps\目录下
5). 解压
将dubbo-admin-2.0.0.war解压
在WEB-INF/dubbo.properties文件中可以配置ZooKeeper地址,管理员密码
4. 使用Dubbo-admin
1). 开启ZooKeeper
2). 开启Tomcat
-
双击startup.bat批处理开发
- 浏览器打开
http://localhost:8080/dubbo-admin-2.0.0
页面
用户名和密码默认的均为root,此时登录后数据为空。
3). 在Eclipse中运行Dubbo-provider项目
程序启动后刷新http://localhost:8080/dubbo-admin-2.0.0/governance/providers
此时提供者已有数据,再进入消费者页面
4). 在Eclipse中运行Dubbo-consumer项目
程序启动后,Eclipse控制台打印出数据,刷新http://localhost:8080/dubbo-admin-2.0.0/governance/consumers
页面
此时消费者页面也有数据了。