先看下Dubbo和zookeeper的定义:
ZooKeeper是一个分布式的,开放源码的分布式应用程序协调服务,是Google的Chubby一个开源的实现,是Hadoop和Hbase的重要组件。它是一个为分布式应用提供一致性服务的软件,提供的功能包括:配置维护、域名服务、分布式同步、组服务等。
ZooKeeper的目标就是封装好复杂易出错的关键服务,将简单易用的接口和性能高效、功能稳定的系统提供给用户。
Dubbo是阿里巴巴公司开源的一个高性能优秀的服务框架,使得应用可通过高性能的 RPC 实现服务的输出和输入功能,Dubbo是一款高性能、轻量级的开源Java RPC框架,它提供了三大核心能力:面向接口的远程方法调用,智能容错和负载均衡,以及服务自动注册和发现。
Dubbo和zookeeper同属apache软件基金会下的项目,虽然阿里内部Dubbo并没有使用zookeeper注册中心,但是目前很大一部分开发者都使用Dubbo+zookeeper(我感觉很多人,哈哈),虽然Dubbo与spring 配置文件搞起来方便,但是dubbo API配置方式也有存在的必要,毕竟不是100%的人都在用spring。
1.搭建zookeeper注册中心:
zookeeper注册中心搭建很简单(我是在本机window上搭建的),首先在:https://www.apache.org/dyn/closer.cgi/zookeeper/ 镜像下载需要的程序,解压后修改zoo_sample.cfg 文件名(D:\software\work\zookeeper\conf) 为 zoo.cfg
更改配置文件里面的日志目录,如下:
dataDir=D:\zookeeper\data
dataLogDir=D:\zookeeper\log
进入到bin目录,并且启动zkServer.cmd,启动成功后zookeeper注册中心就算搭建完毕。
2.Dubbo maven(服务提供质和消费者都要依赖):
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>dubbo</artifactId>
<version>2.6.1</version>
<exclusions>
<exclusion>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.javassist</groupId>
<artifactId>javassist</artifactId>
<version>3.20.0-GA</version>
</dependency>
<dependency>
<groupId>io.netty</groupId>
<artifactId>netty</artifactId>
<version>3.6.10.Final</version>
</dependency>
<dependency>
<groupId>org.apache.curator</groupId>
<artifactId>curator-framework</artifactId>
<version>2.9.1</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>1.7.22</version>
</dependency>
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
<version>1.1.3</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.slf4j/slf4j-log4j12 -->
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
<version>1.7.22</version>
</dependency>
3.服务提供者主要代码:
public static void main(String[] args) {
UndertowServer.start(DemoConfig.class, 8081, true);
if(!running.get()){
// 服务实现
TestService testService = new TestServiceImpl();
// 当前应用配置
ApplicationConfig application = new ApplicationConfig();
application.setName("dubbo-api-test");
// 连接注册中心配置
RegistryConfig registry = new RegistryConfig();
registry.setProtocol("zookeeper");
registry.setAddress("127.0.0.1:2181");
// 服务提供者协议配置
ProtocolConfig protocol = new ProtocolConfig();
protocol.setName("dubbo");
protocol.setPort(12345);
protocol.setThreads(100);
// 注意:ServiceConfig为重对象,内部封装了与注册中心的连接,以及开启服务端口
// 服务提供者暴露服务配置
ServiceConfig<TestService> service = new ServiceConfig<TestService>(); // 此实例很重,封装了与注册中心的连接,请自行缓存,否则可能造成内存和连接泄漏
service.setApplication(application);
service.setRegistry(registry); // 多个注册中心可以用setRegistries()
service.setProtocol(protocol); // 多个协议可以用setProtocols()
service.setInterface(TestService.class);
service.setRef(testService);
service.setVersion("1.0.0");
// 暴露及注册服务
service.export();
running.set(true);
}
LogUtil.printList(new ArrayList<Object>());
}
4.服务消费者主要代码:
public static void main(String[] args) {
UndertowServer.start(DemoConfig.class, 8082, true);
//当前应用配置
ApplicationConfig application = new ApplicationConfig();
application.setName("TestServiceUser");
//连接注册中心配置
RegistryConfig registry = new RegistryConfig();
registry.setAddress("zookeeper://127.0.0.1:2181");
//注意:ReferenceConfig为重对象,内部封装了与注册中心的连接,以及与服务提供方的连接
//引用远程服务
ReferenceConfig<TestService> reference = new ReferenceConfig<TestService>();
reference.setApplication(application);
reference.setRegistry(registry);
reference.setInterface(TestService.class);
reference.setVersion("1.0.0");
//和本地Bean一样使用Service
TestService sortService = reference.get(); // 获取远程服务代理
int [] arrays = {234,1,45,22,123};
System.out.println("排序前:");
for (int i = 0; i < arrays.length; i++) {
System.out.println("arrays["+i+"]="+arrays[i]);
}
arrays = sortService.ascendingSort(arrays); // 执行远程方法
//显示调用结果
System.out.println("排序后:");
for (int i = 0; i < arrays.length; i++) {
System.out.println("arrays["+i+"]="+arrays[i]);
}
5.实现接口:
public interface TestService {
//升序排序
int[] ascendingSort(int[] arrays);
}
@Service(version="1.0.0")
public class TestServiceImpl implements TestService{
public int[] ascendingSort(int[] arrays) {
int temp=0;
//冒泡升序排序
for (int i = 0; i < arrays.length-1; i++) {
for (int j = i+1; j < arrays.length; j++) {
if(arrays[i]>arrays[j]){
temp=arrays[i];
arrays[i]=arrays[j];
arrays[j]=temp;
}
}
}
return arrays;
}
}
6. dubbo-admin
dubbo-admin已近分开成子项目,在dubbo下载页面即可找到