一:dubbo简介
- Dubbo:一个分布式、高性能、透明化的RPC服务框架.
- 作用:提供服务自动注册、自动发现等高效服务治理方案.
- Dubbo架构图
3.1 Provider :提供者,服务发布方.
3.2 Consumer:消费者, 调用服务方
3.3 Container:Dubbo容器.依赖于Spring容器.
3.4 Registry: 注册中心.当Container启动时把所有可以提供的服务列表上Registry中进行注册.
3.4.1 作用:告诉Consumer提供了什么服务和服务方在哪里.
3.5 Monitor:监听器
3.6 虚线都是异步访问,实线都是同步访问
3.7 蓝色虚线:在启动时完成的功能
3.8 红色虚线(实线)都是程序运行过程中执行的功能
3.9 所有的角色都是可以在单独的服务器上.所以必须遵守特定的协议.
4,运行原理:
4.0 启动容器,相当于在启动Dubbo的Provider
4.1 启动后会去注册中心进行注册.注册所有可以提供的服务列表
4.2 在Consumer启动后会去Registry中获取服务列表和Provider的地址.进行订阅.
4.3 当Provider有修改后,注册中心会把消息推送给Consummer
4.3.1 使用了观察者设计模式(又叫发布/订阅设计模式)
4.4 根据获取到的Provider地址,真实调用Provider中功能.
4.4.1 在Consumer方使用了代理设计模式.创建一个Provider方类的一个代理对象.通过代理对象获取Provider中真实功能,起到保护Provider真实功能的作用.
4.5 Consumer和Provider每隔1分钟向Monitor发送统计信息,统计信息包含,访问次数,频率等.
二:Dubbo支持的注册中心
- Zookeeper
1.1 优点:支持网络集群
1.2 缺点:稳定性受限于Zookeeper
2,Redis
2.1 优点:性能高.
2.2 缺点:对服务器环境要求较高.
3,Multicast
3.1 优点:面中心化,不需要额外安装软件.
3.2 缺点:建议同机房(局域网)内使用
4,Simple
4.1 适用于测试环境.不支持集群.
三:Dubbo支持的协议
1, Dubbo
1.1 Dubbo官方推荐的协议.
1.2 本质:使用NIO和线程池进行处理.
1.3 缺点:大文件传输时可能出现文件传输失败问题.
2,RMI
2.1 JDK提供的协议,远程方法调用协议.
2.2 缺点:偶尔连接失败.
2.3 优点:JDK原生,不需要进行额外配置(导入jar)
3,Hession
3.1 优点:基于http协议,http请求支持.
3.2 缺点:需要额外导入jar,并在短连接时性能低
四:dubbo控制台安装
1,到地址 https://github.com/alibaba/dubbo 下载dubbo源码
2,找到对应的文件目录(../dubbo-admin)打包成war,上传至tomcat工作目录
3,解压:
unzip dubbo-admin-2.5.4.war -d dubbo
3,vim dubbo-admin/WEB-INF/dubbo.properties
修改zookeeper注册中心地址和root用户名和密码
dubbo.registry.address=zookeeper://192.168.2.107:2181?backup=192.168.2.108:2181,192.168.2.110:2181
dubbo.admin.root.password=root
dubbo.admin.guest.password=root
4,先启动zookeeper集群,再启动tomcat。
五:编码:
1,聚合分布式项目架构:
dubbo-demo-parent (父项目)
dubbo-demo-service (service接口)
dubbo-demo-provider (service实现:provider)
dubbo-demo-consumer (consumer)
provider和consumer都依赖与service,导入相关jar包:
2,dubbo-demo-service 只有一个接口: pom.xml什么jar也不依赖
public interface DemoService {
void sayHello(String name);
}
3,dubbo-demo-provider
<properties>
<spring-version>4.1.6.RELEASE</spring-version>
<dubbo-version>2.6.0</dubbo-version>
</properties>
<dependencies>
<!-- service -->
<dependency>
<groupId>com.reyco.dubbo</groupId>
<artifactId>dubbo-demo-service</artifactId>
<version>0.0.1-SNAPSHOT</version>
</dependency>
<!-- spring -->
<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-context</artifactId>
<version>${spring-version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context-support</artifactId>
<version>${spring-version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context-support</artifactId>
<version>${spring-version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-test</artifactId>
<version>${spring-version}</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>com.101tec</groupId>
<artifactId>zkclient</artifactId>
<version>0.10</version>
</dependency>
<!-- dubbo -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>dubbo</artifactId>
<version>${dubbo-version}</version>
</dependency>
</dependencies>
DemoServiceImpl.java
public class DemoServiceImpl implements DemoService {
@Override
public void sayHello(String name) {
System.out.println("hello,"+name);
}
}
applicationContext.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:p="http://www.springframework.org/schema/p"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:dubbo="http://code.alibabatech.com/schema/dubbo"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.1.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.1.xsd
http://code.alibabatech.com/schema/dubbo
http://code.alibabatech.com/schema/dubbo/dubbo.xsd">
<!-- 提供服务应用信息,用于计算依赖关系 -->
<dubbo:application name="demo-provider"/>
<!-- 使用zookeeper注册中心暴露服务 -->
<dubbo:registry address="zookeeper://192.168.2.107:2181?backup=192.168.2.108:2181,192.168.2.110:2181"/>
<!-- 用dubbo协议在20880端口暴露服务 -->
<dubbo:protocol name="dubbo" port="20880"/>
<!-- 具体的实现bean -->
<bean id="demoService" class="com.reyco.dubbo.service.impl.DemoServiceImpl"/>
<!-- 声明需要暴露的服务接口,写操作可以设置 retries="0",避免重复调用SOA服务 -->
<dubbo:service retries="0" interface="com.reyco.dubbo.service.DemoService" ref="demoService"/>
<!-- 在注解扫描 -->
<!-- <dubbo:annotation package="com.reyco.ddubbo.service"/> -->
</beans>
applicationContext.java
public class ApplicationContext {
public static void main(String[] args) throws IOException {
ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
context.start();
System.out.println("provider start...");
System.in.read();
}
}
4 dubbo-demo-consumer:
<properties>
<spring-version>4.1.6.RELEASE</spring-version>
<dubbo-version>2.6.0</dubbo-version>
</properties>
<dependencies>
<!-- entity -->
<dependency>
<groupId>com.reyco.dubbo</groupId>
<artifactId>dubbo-demo-service</artifactId>
<version>0.0.1-SNAPSHOT</version>
</dependency>
<!-- spring -->
<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-context</artifactId>
<version>${spring-version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context-support</artifactId>
<version>${spring-version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context-support</artifactId>
<version>${spring-version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-test</artifactId>
<version>${spring-version}</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>com.101tec</groupId>
<artifactId>zkclient</artifactId>
<version>0.10</version>
</dependency>
<!-- dubbo -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>dubbo</artifactId>
<version>${dubbo-version}</version>
</dependency>
</dependencies>
applicationContext.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:p="http://www.springframework.org/schema/p"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xmlns:dubbo="http://code.alibabatech.com/schema/dubbo"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.1.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.1.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc-4.0.xsd
http://code.alibabatech.com/schema/dubbo
http://code.alibabatech.com/schema/dubbo/dubbo.xsd">
<dubbo:application name="demo-consumer"/>
<dubbo:registry address="zookeeper://192.168.2.107:2181?backup=192.168.2.108:2181,192.168.2.110:2181"/>
<dubbo:reference id="demoService" interface="com.reyco.dubbo.service.DemoService"/>
<!-- <dubbo:annotation package="com.reyco.dubbo.controller"/> -->
</beans>
applicationContext.java
public class ApplicationContext {
public static void main(String[] args) throws IOException {
ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
context.start();
System.out.println("consumer start...");
DemoService demoService = (DemoService)context.getBean("demoService");
demoService.sayHello("张三");
}
}
注意: dubbo-demo-provider官方建议启动方式:
public class ApplicationContext {
public static void main(String[] args) throws IOException {
Main.main(args);
}
}
applicationContext.xml存放位置: