本文介绍了zookeeper的下载安装以及用xml配置服务消费者和提供者的例子。
1. zookeeper下载安装
本文的例子使用zookeeper作为注册中心。
首先,从官网下载zookeeper,我选择的是Apache ZooKeeper 3.6.3版本。下载完成后,解压到自己的目录。https://zookeeper.apache.org/releases.html
然后,从conf文件夹找到zoo_sample.cfg配置文件,复制一份副本,重命名为zoo.cfg。重命名后打开,找到dataDir=/tmp/zookeeper这一行,可修改为自定义的文件夹: dataDir=../data。然后返回根目录,建一个data文件夹即可。
最后,启动bin目录下的zkServer.cmd,即可启动zookeeper。注意输出内容可能会有端口信息,默认2181。
2021-05-12 22:54:09,460 [myid:] - INFO [main:NIOServerCnxnFactory@674] - binding to port 0.0.0.0/0.0.0.0:2181
2.dubbo例子
1)新建项目
新建两个项目,服务消费consumer模块和服务提供provider模块 。添加对应的maven支持和spring支持。
项目结构如下:
2)服务提供provider
- 在pom.xml中添加dubbo相关的依赖。
<dependencies><!-- https://mvnrepository.com/artifact/com.alibaba/dubbo --><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></dependencies>
- 定义接口Animal。
/*** 动物接口*/
public interface Animal {/*** 描述: 返回动物的叫声*/String sound();
}
- 定义具体类Cat实现Animal接口
public class Cat implements Animal {public String sound() {return "喵";}
}
- 在resources 下新建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.xsdhttp://code.alibabatech.com/schema/dubbo http://code.alibabatech.com/schema/dubbo/dubbo.xsd"><!--整个dubbo应用的名称和所属者--><dubbo:application name="myApp" owner="yt"/><!-- 监控中心配置 --><dubbo:monitor protocol="registry"/><!--dubbo这个服务所要暴露的服务地址所对应的注册中心--><!--<dubbo:registry address="N/A"/>--><dubbo:registry address="zookeeper://localhost:2181" check="false"/><!--当前服务发布所依赖的协议;webserovice、Thrift、Hessain、http--><dubbo:protocol name="dubbo" port="20880"/><!--服务发布的配置,需要暴露的服务接口--><dubbo:service interface="com.yt.provider.Animal" ref="cat"/><!--Bean bean定义--><bean id="cat" class="com.yt.provider.Cat"/>
</beans>
- 新建一个Provider类,用来启动项目
public class Provider {public static void main(String[] args) throws IOException {// xml配置文件的路径ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("META-INF/spring/provider.xml");context.start();// 任意键退出System.in.read();}
}
项目结构:
至此整个服务端就启动完成了。
3)服务消费consumer
- 在pom.xml中添加dubbo相关的依赖。这一步和provider的依赖类似,只是多了要导入provider的依赖这一块。
<dependencies><!-- 依赖于服务提供者的包 --><dependency><groupId>com.yt</groupId><artifactId>provider</artifactId><version>1.0-SNAPSHOT</version></dependency>...<!-- 其他的就是provider的依赖,就省略了-->....</dependencies>
- 在resources 下新建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.xsdhttp://code.alibabatech.com/schema/dubbo http://code.alibabatech.com/schema/dubbo/dubbo.xsd"><!-- 应用配置 --><dubbo:application name="myApp" owner="yt"/><!-- 监控中心配置 --><dubbo:monitor protocol="registry"/><!--dubbo这个服务所要暴露的服务地址所对应的注册中心--><!-- <dubbo:registry address="N/A"/> --><dubbo:registry address="zookeeper://localhost:2181" check="false" /><!-- 引用配置 --><dubbo:reference id="animal" interface="com.yt.provider.Animal"/>
</beans>
- 新建Consumer类,用来调用provider提供的接口
package com.yt.consumer;import com.yt.provider.Animal;
import org.springframework.context.support.ClassPathXmlApplicationContext;/*** 消费consumer*/
public class Consumer {public static void main(String[] args) {// 配置文件路径ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("/spring/consumer.xml");context.start();// 暴露的是接口Animal,多态。Animal animal = (Animal) context.getBean("animal");System.out.println(animal.sound());}
}
- 输出结果:
喵
项目结构:
至此,一个简单的dubbo例子就完成了。
当然,一个提供者可以供多个消费者消费。所以将consumer拷一份命名为consumer2,依然可以同时获取到provider暴露出的接口。