基于Dubbo和Zookeeper实现服务间通信DEMO
环境准备 * zookeeper单点或集群环境,演示使用集群 * 基于maven进行项目构建 * 必要jar包依赖无注册中心的dubbo协调通信 1,服务端整体结构 a,服务端项目框架 -- dubbo-server为服务端整体项目结构,其下分有两个子...
环境准备
* zookeeper单点或集群环境,演示使用集群
* 基于maven进行项目构建
* 必要jar包依赖
无注册中心的dubbo协调通信
1,服务端整体结构
a,服务端项目框架
-- dubbo-server为服务端整体项目结构,其下分有两个子模块,dubbo-api和dubbo-service
-- dubbo-api为服务端对外接口,依赖于dubbo-service
-- dubbo-service为依赖dubbo-api,为dubbo-api中接口的实现类,具体实现对外接口
-- 服务端对外接口提供只需提供dubbo-api,而具体实现的dubbo-service则对外隐藏
-- 如果包依赖后一直错误提示不存在,记得对server-api-service依次install
b,dubbo-api模块
* pom文件
dubbo-api只负责对外提供接口,无需依赖包结构,除非接口传参有特殊需求
* 接口文件
public interface IDubboDemoService {
String showMsg(String msg);
}
c,dubbo-service模块
* pom文件
-- 不依赖zookeeper注册中心的通信, 只需要依赖dubbo和接口包进行服务发布
<dependency>
<groupId>com.gupao.dubbo</groupId>
<artifactId>dubbo-api</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>dubbo</artifactId>
<version>2.5.3</version>
</dependency>
* 接口实现类
-- 对接口做一个简单实现
public class DubboDemoService implements IDubboDemoService {
@Override
public String showMsg(String msg) {
return "HELLO : " + msg;
}
}
* 配置文件 -- dubbo.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"
xmlns:bean="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="dubbo-server" owner="ZPJ"/>
<!-- DUBBO注册中心 -->
<dubbo:registry address="N/A"/>
<!-- 协议名称 -->
<dubbo:protocol name="dubbo" port="20880"/>
<!-- 接口地址 -->
<dubbo:service interface="com.gupao.dubbo.IDubboDemoService" ref="gupaoHello"/>
<!-- 引用服务 -->
<bean id="gupaoHello" class="com.gupao.dubbo.impl.DubboDemoService"/>
</beans>
* 配置文件 -- log4j.properties
### direct log messages to stdout ###
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.Target=System.out
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%d{ABSOLUTE} %5p %c{1}:%L - %m%n
### direct messages to file mylog.log ###
log4j.appender.file=org.apache.log4j.FileAppender
log4j.appender.file.File=c:/mylog.log
log4j.appender.file.layout=org.apache.log4j.PatternLayout
log4j.appender.file.layout.ConversionPattern=%d{ABSOLUTE} %5p %c{1}:%L - %m%n
### set log levels - for more verbose logging change 'info' to 'debug' ###
log4j.rootLogger=info, stdout
d,基本Spring发布服务(Spring为dubbo依赖包,无需刻意引入)
public class DubboDemoTest {
public static void main(String[] args) throws IOException {
// 加载配置文件
ClassPathXmlApplicationContext context =
new ClassPathXmlApplicationContext("dubbo-server.xml");
// 启动容器
context.start();
System.in.read();
}
}
e,服务端启动效果
-- 标注出来链接为无注册中心时,客户端需要引用的服务链接
2,客户端整体结构
a,pom文件
-- 引用必要的服务端对外接口jar包和dubbo包
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>dubbo</artifactId>
<version>2.5.3</version>
</dependency>
<dependency>
<groupId>com.gupao.dubbo</groupId>
<artifactId>dubbo-api</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
<dependency>
b,配置文件 -- dubbo.xml
-- 无注册中心时,dubbo引用服务需要添加url路径,路径为服务端启动日志中标注的内容
<?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"
xmlns:bean="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="dubbo-server" owner="ZPJ"/>
<!-- DUBBO注册中心 -->
<dubbo:registry address="N/A"/>
<!-- 协议名称 -->
<dubbo:protocol name="dubbo" port="20880"/>
<!-- 引用接口地址 -->
<dubbo:reference id="gupaoHello" interface="com.gupao.dubbo.IDubboDemoService"
url="dubbo://192.168.93.1:20880/com.gupao.dubbo.IDubboDemoService"/>
</beans>
c,客户端调用
public class demo {
public static void main(String[] args) throws InterruptedException {
ClassPathXmlApplicationContext context =
new ClassPathXmlApplicationContext("dubbo-master.xml");
for (int i = 0; i < 10; i++) {
IDubboDemoService service = (IDubboDemoService) context.getBean("gupaoHello");
System.out.println(service.showMsg("DUBBO连接成功"));
Thread.sleep(2000);
}
}
}
d,执行结果
3,无注册中心的dubbo协调通信完成,后续在此基础上扩展
有注册中心的dubbo协调通信
1,给服务端添加注册中心配置 -- 注册中心应用zookeeper注册中心
* 修改dubbo.xml文件,只需修改注册中心那一条配置,此处引用的是zookeeper集群
<!-- DUBBO注册中心 -->
<dubbo:registry protocol="zookeeper" address="192.168.91.128:2181,192.168.91.129:2181,192.168.91.130:2181"/>
* 服务启动
-- 通过日志可以看到,服务已经注册到zookeeper注册中心
* zookeeper客户端节点查看
2,客户端添加注册中心配置
a,配置文件 -- dubbo.xml
-- 添加zookeeper注册中心
<!-- DUBBO注册中心 -->
<dubbo:registry protocol="zookeeper" address="192.168.91.128:2181,192.168.91.129:2181,192.168.91.130:2181"/>
-- 接口引用取消URL属性,dubbo会自动从注册中心读取
<!-- 引用接口地址 -->
<dubbo:reference id="gupaoHello" interface="com.gupao.dubbo.IDubboDemoService"/>
b,客户端调用
public class demo {
public static void main(String[] args) throws InterruptedException {
ClassPathXmlApplicationContext context =
new ClassPathXmlApplicationContext("dubbo-master.xml");
for (int i = 0; i < 10; i++) {
IDubboDemoService service = (IDubboDemoService) context.getBean("gupaoHello");
System.out.println(service.showMsg("DUBBO连接成功"));
Thread.sleep(2000);
}
}
}
c,结果分析
* 从日志中可以看到客户端请求通过zookeeper和dubbo连接到服务端的全过程
服务端集群下的dubbo协调通信
1,服务端集群测试,是为了测试dubbo自身所提供的负载均衡机制;集群测试,只变更服务端服务为集群情况,客户端不变更
2,服务端变更集群
* 以多服务模拟集群下的多节点
public class DubboCluster1Service implements IDubboDemoService {
@Override
public String showMsg(String msg) {
return "I'm cluster_1 service : " + msg;
}
}
public class DubboCluster2Service implements IDubboDemoService {
@Override
public String showMsg(String msg) {
return "I'm cluster_2 service : " + msg;
}
}
* 配置文件配置不同的端口号模拟集群机器
-- dubbo-cluster_1.xml
<!-- 协议名称 -->
<dubbo:protocol name="dubbo" port="20880"/>
-- dubbo-cluster_2.xml
<!-- 协议名称 -->
<dubbo:protocol name="dubbo" port="20881"/>
* 分别启动两台服务
-- 启动第一台
public class DubboClusterTest_1 {
public static void main(String[] args) throws IOException {
ClassPathXmlApplicationContext context =
new ClassPathXmlApplicationContext("dubbo-cluster-1.xml");
context.start();
System.in.read();
}
}
-- 启动第二台
public class DubboClusterTest_2 {
public static void main(String[] args) throws IOException {
ClassPathXmlApplicationContext context =
new ClassPathXmlApplicationContext("dubbo-cluster-2.xml");
context.start();
System.in.read();
}
}
* 查看zookeeper节点
3,客户端代码不变,直接调用,查看结果
-- 十次循环,类似于之前写到的通过随机数实现负载均衡,服务1和服务2各有分配执行
更多推荐
所有评论(0)