在上一篇中我们提到,dubbo官网上推荐使用ZooKeeper作为注册中心。那么今天我们就通过代码来实践一番,看看一个dubbo的服务消费者如果找到通过ZooKeeper暴露自己的dubbo服务提供者,并成功完成交互。
首先创建一个dubbo-test工程,并添加相关的依赖:
<dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>3.8.1</version> <scope>test</scope> </dependency> <dependency> <groupId>com.alibaba</groupId> <artifactId>dubbo</artifactId> <version>2.6.6</version> </dependency> <dependency> <groupId>org.apache.zookeeper</groupId> <artifactId>zookeeper</artifactId> <version>3.4.10</version> </dependency> <dependency> <groupId>com.101tec</groupId> <artifactId>zkclient</artifactId> <version>0.5</version> </dependency> <dependency> <groupId>io.netty</groupId> <artifactId>netty-all</artifactId> <version>4.1.32.Final</version> </dependency> <dependency> <groupId>org.apache.curator</groupId> <artifactId>curator-framework</artifactId> <version>2.8.0</version> </dependency> <dependency> <groupId>org.apache.curator</groupId> <artifactId>curator-recipes</artifactId> <version>2.8.0</version> </dependency>
从依赖中也可以看到,dubbo的底层通信实际上是借助netty实现的。接下来我们在dubbo-test工程中创建一个名为dubbo-test-provider的module,并编写需要暴露的服务接口。
首先创建一个接口,ProviderService:
package provider.service; public interface ProviderService {
String helloService(String name); }
接下来对这个接口进行实现:
package provider.impl; import provider.service.ProviderService; public class ProviderServiceImpl implements ProviderService { public String helloService(String name) { return "Hello " + name + "!"; } }
开始构建服务者使用的dubbo配置文件:
<?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 = "dubbo_provider" /> <!--注册中心 --> <dubbo:registry address = "zookeeper://127.0.0.1:2181" /> <!-- 用dubbo协议在20880端口暴露服务 --> <dubbo:protocol name = "dubbo" port = "20880" /> <!--服务发布的配置,需要暴露的服务接口--> <dubbo:service interface = "provider.service.ProviderService" ref = "providerService" /> <!--Bean--> <bean id = "providerService" class = "provider.impl.ProviderServiceImpl"/> </beans>
这里补充说明一下,如果需要对接的是一个ZooKeeper集群的话,可以采用下方的写法:
<dubbo:registry protocol = "zookeeper" address = "192.168.11.129:2181,192.168.11.130:2181"/>
启动类中自然需要加载dubbo的配置文件:
public class DubboProvider { public static void main( String[] args ) throws IOException { ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("provider.xml"); context.start(); System.in.read(); } }
此时的目录结构如下:
接下来继续添加一个module,起名为dubbo-test-consumer。需要注意的是,除非两个module加载同一份接口类,否则消费者项目中也需要有路径相同的接口声明,如下图所示:
由于我们的消费者仅仅用于调用服务提供者暴露的接口,无需暴露自己本身,因此dubbo配置文件会简单一些,如下所示:
<?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 = "dubbo_consumer" /> <!--注册中心 --> <dubbo:registry address = "zookeeper://127.0.0.1:2181" /> <dubbo:reference id = "providerService" interface = "provider.service.ProviderService"/> </beans>
启动类中进行服务的调用并打印返回结果:
public class DubboConsumer { public static void main( String[] args ) throws IOException { ClassPathXmlApplicationContext context=new ClassPathXmlApplicationContext("consumer.xml"); context.start(); ProviderService providerService = (ProviderService) context.getBean("providerService"); String s = providerService.helloService("eddy"); System.out.println(s); System.in.read(); } }
依次启动ZooKeeper、服务端以及消费端,效果如下:
参考资料:
https://blog.csdn.net/liyintaoliuyun/article/details/80066269
https://segmentfault.com/a/1190000019896723
https://blog.csdn.net/hjiacheng/article/details/55000570