Dubbo是阿里的一个产品。是一个分布式、高性能、透明化的RPC服务框架,提供服务自动注册、自动发现等高效服务治理方案。
Dubbo是实现SOA架构时常用的服务之一,除了Dubbo外还有如下可供选择
制作兼容JDK1.8的dubbo-admin
实现SOA架构时常用的服务
- Dubbo作为服务
- WebService作为服务(比较老了)
- Dubbox作为服务(当当网开发的)
- 服务方就是web项目,调用web项目的控制器(HttpClient)
RPC(远程过程调用协议)
客户端通过互联网调用远程服务器,不知道远程服务器的具体代码实现,只知道远程服务器提供了什么功能。
优点:安全
Dubbo架构
首先来看一下架构图
架构图解析
- 虚线都是异步访问,实线都是同步访问
- 紫色虚线表示是在启动时完成的
- 绿色虚线(实线)都是程序运行过程中执行的功能
- 所有的角色都可以在部署在单独的服务器上,但是必须遵守特定的协议
节点说明
- Provider
服务提供者,发布方 - Consumer
服务消费者,调用方 - Container
Dubbo容器,依赖于Spring容器 - Registry
注册中心(当Container启动时会把当前服务中所有可以提供的服务列表拿到Registry中进行注册),主要作用就是告诉Consumer提供了什么服务和服务方在哪里,以及服务放放生变化后及时通知Consumer - Monitor
监听器,负责统计服务调用次数和调用时间等
除了Monitor之外,所有节点必不可少!
Dubbo支持的注册中心
- Zookeeper
1.1 优点:支持网络集群
1.2 缺点:稳定性受限于Zookeeper - Redis
2.1 优点:性能高.
2.2 缺点:对服务器环境要求较高. - Multicast
3.1 优点:面中心化,不需要额外安装软件.
3.2 缺点:建议同机房(局域网)内使用 - Simple
4.1 适用于测试环境.不支持集群
Dubbo支持的协议
- Dubbo
1.1 Dubbo官方推荐的协议.
1.2 本质:使用NIO和线程池进行处理.
1.3 缺点:大文件传输时可能出现文件传输失败问题. - RMI
2.1 JDK提供的协议,远程方法调用协议.
2.2 缺点:偶尔连接失败.
2.3 优点:JDK原生,不需要进行额外配置(导入jar) - Hession
3.1 优点:基于http协议,http请求支持.
3.2 缺点:需要额外导入jar,并在短连接时性能低
Dubbo开发步骤
配置Provider
引入dubbo依赖
注意去掉老版本spring的依赖,因为在Dubbo2.x以前Spring所有的jar包是一个,之后依赖zookeeper客户端工具zkClient
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>dubbo</artifactId>
<version>2.5.3</version>
<exclusions>
<exclusion>
<artifactId>spring</artifactId>
<groupId>org.springframework</groupId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>4.1.6.RELEASE</version>
</dependency>
<!-- 访问zookeeper的客户端jar -->
<dependency>
<groupId>com.101tec</groupId>
<artifactId>zkclient</artifactId>
<version>0.10</version>
</dependency>
开发Provider常用的配置标签
1.<dubbo:application/> :给provider起名
主要是为了在monitor或管理工具中区别是哪个服务提供者【provider】
2.<dubbo:registry/> :配置注册中心
- address:注册中心的ip和端口
- protocol:使用哪种注册中心
3.<dubbo:protocol/>:配置协议
- name:使用什么协议
- port:consumer invoke provider时的端口号
4.<dubbo:service/> 注册接口
- ref:引用接口实现类<bean>的id值
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:dubbo="http://code.alibabatech.com/schema/dubbo"
xmlns="http://www.springframework.org/schema/beans"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd
http://code.alibabatech.com/schema/dubbo
http://code.alibabatech.com/schema/dubbo/dubbo.xsd">
<!-- 给当前Provider自定义个名字 -->
<dubbo:application name="dubbo-service"/>
<!-- 配置注册中心 -->
<dubbo:registry address="192.168.154.128:2181" protocol="zookeeper"></dubbo:registry>
<!-- 配置端口,注意此标签表示,服务消费方和提供方连接采用dubbo协议 -->
<!--消费方访问提供方的请求端口是此配置的端口-->
<dubbo:protocol name="dubbo" port="20888"></dubbo:protocol>
<!-- 注册功能 -->
<dubbo:service interface="com.chenfu.dubbo.service.DemoService" ref="demoServiceImpl"></dubbo:service>
<bean id="demoServiceImpl" class="com.chenfu.dubbo.service.impl.DemoServiceImpl"></bean>
</beans>
启动容器
- 通过spring方式启动
ClassPathXmlApplicationContext ac = new ClassPathXmlApplicationContext("applicationContext-dubbo.xml");
ac.start();
System.out.println("启动成功");
System.in.read();
- 使用dubbo提供的方式启动
要求applicationContext-dubbo.xml必须放入类路径下/META-INF/spring/*.xml
Main.main(args);
Dubbo的Consumer配置
引入依赖
在pom.xml中添加dubbo相关3个依赖(接口,dubbo.jar,zkClient)
配置Consumer时常用的标签
<!-- 给当前Provider自定义个名字 -->
<dubbo:application name="dubbo-consumer"/>
<!-- 配置注册中心 -->
<dubbo:registry address="192.168.154.128:2181" protocol="zookeeper"></dubbo:registry>
<!-- 配置注解扫描 -->
<dubbo:annotation package="com.chenfu.service.impl"/>
Admin管理界面
其本质是一个web项目,主要作用就是获取注册中心内Provider注册的信息然后用页面呈现出来。
使用指南
- 把dubbo-admin-2.5.3.war上传到服务器tomcat中。
- 启动tomcat完成后关闭tomcat,删除上传的dubbo-admin-2.5.3.war
- 进入dubbo-admin-2.5.3/WEB-INF/dubbo.properties,修改第一行为zookeeper的ip和端口
- 修改管理界面的用户名和密码【第二行和第三行】
- 启动tomcat,在浏览器地址栏访问tomcat中dubbo项目
注意:dubbo-admin-2.5.3.war和jdk1.7兼容,但是与jdk1.8不兼容。网上有很多解决方案。可以直接百度参考。