一、dubbo的实现原理
dubbo是阿里巴巴公司开源的一个高性能优秀的服务框架,使得应用可通过高性能的RPC实现服务的输出和输入功能,可以和Spring框架无缝集成。
dubbo框架是基于Spring容器运行的。
RPC远程过程调用
远程过程调用协议是一种通过网络从远程计算机程序上请求服务,而不需要了解网络底层技术的协议。
RPC协议假定某些传输协议的存在,如TCP或者UDP,为通信程序之间携带信息数据。
在OSI网络通信模型中,RPC跨越了传输层和应用层。
RPC的优点:使得开发包括网络分布式多程序在内的应用程序更加容易。
二、架构图
注册中心(registry):生产者在此注册并发布内容,消费者在此订阅并接收发布的内容。
消费者(consumer):客户端,从注册中心获取到方法,可以调用生产者中的方法。
生产者(provider):服务端,生产内容,生产前需要依赖容器(先启动容器)。
容器(container):生产者在启动执行的时候,必须依赖容器才能正常启动(默认依赖的是spring容器),dubbo技术不能脱离spring框架。2.5.3版本的dubbo默认依赖spring2.5版本,可以选用spring4.5以下的版本 。2.5.7版本的dubbo默认依赖spring4.3.10版本,可以选择任意的spring版本。
监控中心(monitor):是dubbo提供的一个jar工程。主要功能是监控服务端和消费端的使用数据。如:服务端是什么,有多少接口,多少方法,调用次数,压力信息等,客户端有多少,调用过哪些服务端,调用了多少次等。
三、简单的demo案例
1、代码架构
2、pom依赖
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.zhouzy.dubbo</groupId>
<artifactId>zhouzyDubbo</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>zhouzyDubbo</name>
<!-- FIXME change it to the project's website -->
<url>http://www.example.com</url>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.source>1.7</maven.compiler.source>
<maven.compiler.target>1.7</maven.compiler.target>
</properties>
<dependencies>
<!-- https://mvnrepository.com/artifact/com.alibaba/dubbo -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>dubbo</artifactId>
<version>2.5.3</version>
</dependency>
<dependency>
<groupId>com.101tec</groupId>
<artifactId>zkclient</artifactId>
<version>0.10</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>4.0.5.RELEASE</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.11</version>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
3、生产者接口
UserService.java
package com.zhouzy.dubbo.service.provider;
public interface UserService {
public String sayHello(String name);
}
4、生产者实现类
UserServiceImpl.java
package com.zhouzy.dubbo.service.provider;
public class UserServiceImpl implements UserService{
@Override
public String sayHello(String name) {
System.out.println("hello:"+name);
return "hello:"+name;
}
}
5、生产者dubbo文件
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="zhouzyProvider" owner="zzy" organization="dubbox"/>
<!--使用 zookeeper 注册中心暴露服务,注意要先开启 zookeeper-->
<dubbo:registry address="zookeeper://localhost:2181"/>
<!-- 用dubbo协议在20880端口暴露服务 -->
<dubbo:protocol name="dubbo" port="20880" />
<!--使用 dubbo 协议实现定义好的 api.PermissionService 接口-->
<dubbo:service interface="com.zhouzy.dubbo.service.provider.UserService" ref="userService" protocol="dubbo" />
<!--具体实现该接口的 bean-->
<bean id="userService" class="com.zhouzy.dubbo.service.provider.UserServiceImpl"/>
</beans>
6、启动生产者
ProviderTest.java
package com.zhouzy.dubbo;
import org.springframework.context.support.ClassPathXmlApplicationContext;
/**
* Unit test for simple App.
*/
public class ProviderTest {
public static void main(String[] args) {
ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("provider.xml");
context.start();
System.out.println("dubbo服务提供端已启动....");
try {
System.in.read();
} catch (Exception e) {
e.printStackTrace();
}
}
}
7、配置消费者dubbo文件
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:application name="zhouzyConsumer" owner="zzy" organization="dubbox"/>
<!--向 zookeeper 订阅 provider 的地址,由 zookeeper 定时推送-->
<dubbo:registry address="zookeeper://localhost:2181"/>
<!--使用 dubbo 协议调用定义好的 api.PermissionService 接口-->
<dubbo:reference id="userService" interface="com.zhouzy.dubbo.service.provider.UserService"/>
</beans>
8、测试消费者调用生产者
ConsumerTest.java
package com.zhouzy.dubbo;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import com.zhouzy.dubbo.service.provider.UserService;
public class ConsumerTest{
public static void main(String[] args) {
ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext( "consumer.xml" );
context.start();
System.out.println("dubbo服务消费端已启动...");
UserService userService = (UserService)context.getBean( "userService" );// 获取远程服务代理
String hello = userService.sayHello( "张三" );//执行远程方法
System.out.println(hello);//显示调用结果
try {
System.in.read();
} catch (Exception e) {
e.printStackTrace();
}
}
}
四、测试
1、启动zookeeper
windows目录:D:\SOFT\zookeeper\bin,双击zkServer.cmd启动
2、部署dubboAdmin管理后台
下载地址:
3、运行生产者ProviderTest
dubbo-admin后台管理页面:
4、运行消费者ConsumerTest
dubbo-admin后台管理页面: