ZooKeeper是一个分布式的,开放源码的分布式应用程序协调服务,是Google的Chubby一个开源的实现,是Hadoop和Hbase的重要组件。它是一个为分布式应用提供一致性服务的软件,提供的功能包括:配置维护、域名服务、分布式同步、组服务等。

ZooKeeper的目标就是封装好复杂易出错的关键服务,将简单易用的接口和性能高效、功能稳定的系统提供给用户。

1. 下载ZooKeeper并安装

ZooKeeper3.5.5
将下载文件解压

打开conf目录进行配置

新建zoo.cfg文件添加如下配置内容

启动ZooKeeper
打开bin目录,在windows下启动点击
zkServer.cmd
若在Linux下启动点击zkServer.sh

启动成功为

2181为服务器端口

2. 简单的构建使用

1.新建一个SpringBoot工程作为服务端业务层
2.pom文件<dependencies>中添加

<!-- 远程注册调用 -->
        <dependency>
            <groupId>com.alibaba.spring.boot</groupId>
            <artifactId>dubbo-spring-boot-starter</artifactId>
            <version>2.0.0</version>
        </dependency>

        <dependency>
            <groupId>com.101tec</groupId>
            <artifactId>zkclient</artifactId>
            <version>0.10</version>
        </dependency>

第一个为Dubbo,第二个为ZooKeeper的Maven依赖

Dubbo是阿里巴巴公司开源的一个高性能优秀的服务框架,使得应用可通过高性能的 RPC 实现服务的输出和输入功能,可以和Spring框架无缝集成。是一款高性能、轻量级的开源Java RPC框架,它提供了三大核心能力:面向接口的远程方法调用,智能容错和负载均衡,以及服务自动注册和发现。

RPC(Remote Procedure Call)—远程过程调用,它是一种通过网络从远程计算机程序上请求服务,而不需要了解底层网络技术的协议。RPC使得开发包括网络分布式多程序在内的应用程序更加容易。

3.配置application.properties文件

spring.dubbo.application.name=server
spring.dubbo.registry.address=zookeeper://127.0.0.1:2181
spring.dubbo.protocol.name=dubbo
spring.dubbo.protocol.port=20880
server.port=7070
spring.dubbo.server=true
spring.dubbo.scan=com.service

spring.dubbo.application.name=server 为Dubbo配置的名称
spring.dubbo.registry.address=zookeeper://127.0.0.1:2181 为注册中心地址
spring.dubbo.protocol.name=dubbo 为服务协议
spring.dubbo.protocol.port=20880 服务端口
server.port=7070 设置SpringBoot自带Tomcat的端口号

其他Dubbo的配置如下可按需添加,暂时可以忽略跳过


//Dubbo 配置 //扫描包路径 <br>spring.dubbo.scan=org.<br>spring.<br>springboot.dubbo //Dubbo 应用配置 // 应用名称 <br>spring.dubbo.application.name=xxx // 模块版本 <br>spring.dubbo.application.version=xxx // 应用负责人 <br>spring.dubbo.application.owner=xxx // 组织名(BU或部门) <br>spring.dubbo.application.organization=xxx // 分层 <br>spring.dubbo.application.architecture=xxx // 环境,如:dev/test/run <br>spring.dubbo.application.environment=xxx // Java代码编译器 <br>spring.dubbo.application.compiler=xxx // 日志输出方式 <br>spring.dubbo.application.logger=xxx // 注册中心 0 <br>spring.dubbo.application.registries[0].address=zookeeper://127.0.0.1:2181=xxx // 注册中心 1 <br>spring.dubbo.application.registries[1].address=zookeeper://127.0.0.1:2181=xxx // 服务监控 <br>spring.dubbo.application.monitor.address=xxx Dubbo 注册中心配置类 // 注册中心地址 <br>spring.dubbo.application.registries.address=xxx // 注册中心登录用户名 <br>spring.dubbo.application.registries.username=xxx // 注册中心登录密码 <br>spring.dubbo.application.registries.password=xxx // 注册中心缺省端口 <br>spring.dubbo.application.registries.port=xxx // 注册中心协议 <br>spring.dubbo.application.registries.protocol=xxx // ================客户端实现========================== <br>spring.dubbo.application.registries.transporter=xxx <br>spring.dubbo.application.registries.server=xxx <br>spring.dubbo.application.registries.client=xxx <br>spring.dubbo.application.registries.cluster=xxx <br>spring.dubbo.application.registries.group=xxx <br>spring.dubbo.application.registries.version=xxx // 注册中心请求超时时间(毫秒) <br>spring.dubbo.application.registries.timeout=xxx // 注册中心会话超时时间(毫秒) <br>spring.dubbo.application.registries.session=xxx // 动态注册中心列表存储文件 <br>spring.dubbo.application.registries.file=xxx // 停止时等候完成通知时间 <br>spring.dubbo.application.registries.wait=xxx // 启动时检查注册中心是否存在 <br>spring.dubbo.application.registries.check=xxx // 在该注册中心上注册是动态的还是静态的服务 <br>spring.dubbo.application.registries.dynamic=xxx // 在该注册中心上服务是否暴露 <br>spring.dubbo.application.registries.register=xxx // 在该注册中心上服务是否引用 <br>spring.dubbo.application.registries.subscribe=xxx //Dubbo 服务协议配置 // 服务协议 <br>spring.dubbo.application.protocol.name=xxx // 服务IP地址(多网卡时使用) <br>spring.dubbo.application.protocol.host=xxx // 服务端口 <br>spring.dubbo.application.protocol.port=xxx // 上下文路径 <br>spring.dubbo.application.protocol.contextpath=xxx // 线程池类型 <br>spring.dubbo.application.protocol.threadpool=xxx // 线程池大小(固定大小) <br>spring.dubbo.application.protocol.threads=xxx // IO线程池大小(固定大小) <br>spring.dubbo.application.protocol.iothreads=xxx // 线程池队列大小 <br>spring.dubbo.application.protocol.queues=xxx // 最大接收连接数 <br>spring.dubbo.application.protocol.accepts=xxx // 协议编码 <br>spring.dubbo.application.protocol.codec=xxx // 序列化方式 <br>spring.dubbo.application.protocol.serialization=xxx // 字符集 <br>spring.dubbo.application.protocol.charset=xxx // 最大请求数据长度 <br>spring.dubbo.application.protocol.payload=xxx // 缓存区大小 <br>spring.dubbo.application.protocol.buffer=xxx // 心跳间隔 <br>spring.dubbo.application.protocol.heartbeat=xxx // 访问日志 <br>spring.dubbo.application.protocol.accesslog=xxx // 网络传输方式 <br>spring.dubbo.application.protocol.transporter=xxx // 信息交换方式 <br>spring.dubbo.application.protocol.exchanger=xxx // 信息线程模型派发方式 <br>spring.dubbo.application.protocol.dispatcher=xxx // 对称网络组网方式 <br>spring.dubbo.application.protocol.networker=xxx // 服务器端实现 <br>spring.dubbo.application.protocol.server=xxx // 客户端实现 <br>spring.dubbo.application.protocol.client=xxx // 支持的telnet命令,多个命令用逗号分隔 <br>spring.dubbo.application.protocol.telnet=xxx // 命令行提示符 <br>spring.dubbo.application.protocol.prompt=xxx // status检查 <br>spring.dubbo.application.protocol.status=xxx // 是否注册 <br>spring.dubbo.application.protocol.status=xxx

4.创建Service层

创建类DubboService.java

package com.service;

import org.springframework.stereotype.Service;

@Service
@com.alibaba.dubbo.config.annotation.Service    //加入这个后才能调用远程注册方法
public class DubboService{
    public int add(int x,int y){
        return x+y;
    }

}

总共有两个Service功能各不相同,第一个用来同一工程下调用
第二个为远程调用

生成一个对应的接口


点击Refactor重构

package com.service;

import org.springframework.stereotype.Service;

@Service
@com.alibaba.dubbo.config.annotation.Service    //加入这个后才能调用远程注册方法
public class DubboService implements IDubboService {    //远程调用必须实现接口

    @Override
    public int add(int x, int y){
        return x+y;
    }

}

同时在Service包内多出一个刚刚创建的IDubboService接口

5.配置启动类

@ComponentScan("com.service") 表示扫描
@EnableDubboConfiguration 表示启动dubbo配置

package com.springboot.springboot02;

import com.alibaba.dubbo.spring.boot.annotation.EnableDubboConfiguration;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.ComponentScan;

@SpringBootApplication
@ComponentScan("com.service")
@EnableDubboConfiguration
public class Springboot02Application {

    public static void main(String[] args) {
        SpringApplication.run(Springboot02Application.class, args);
    }

}

6.新建另一个SpringBoot模块

远程调用业务层内的方法
重复之前的2步骤pom文件<dependencies>中添加远程调用的Maven依赖
配置application.properties文件
spring.dubbo.application.name=client
spring.dubbo.registry.address=zookeeper://127.0.0.1:2181
spring.dubbo.protocol.name=dubbo
spring.dubbo.protocol.port=20880
server.port=9090

需要注意Tomcat的端口号与Dubbo名必须不同

复制之前生成的接口IDubboService到当前模块并新建Action层

在DubboAction中远程调用add方法

package com.action;

import com.alibaba.dubbo.config.annotation.Reference;
import com.service.IDubboService;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class DubboAction {
    @Reference  //到注册中心中找实现类
    private IDubboService dubboService;
    @RequestMapping("/add")
    public String add(int x,int y){
        int z = dubboService.add(x,y);
        return z+"";
    }
}

@RestController是ResponseBody与Controller的结合
@Reference是到注册中心中找实现类DubboService
注意的是@Reference必须是com.alibaba.dubbo.config.annotation这个包下的Reference

为当前模块的启动类添加注解

package com.springboot.springboot03;

import com.alibaba.dubbo.spring.boot.annotation.EnableDubboConfiguration;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.ComponentScan;

@SpringBootApplication
@ComponentScan({"com.action","com.service"})    //添加扫描
@EnableDubboConfiguration
public class Springboot03Application {

    public static void main(String[] args) {
        SpringApplication.run(Springboot03Application.class, args);
    }

}

7.启动实现类进行测试

在启动Zookeeper的前提下,先启动Server模块的,再启动第二个模块client的

在浏览器中输入如下参数进行测试是否成功调用执行此方法

若出现错误报空指针异常请参考这篇文章中下面的解决方法
dubbo 使用zookeeper 出现 Dubbo客户端调用报错NullPointerException


今天你恰柠檬了咩