Back
Featured image of post Dubbo + ZooKeeper 基础入门

Dubbo + ZooKeeper 基础入门

简介

Dubbo原本是阿里的开源框架,有很多著名厂商都在用。但在14年停更,之后Spring Cloud大红大紫,Dubbo终于在17年再度更新,并在18年合并当当网的基于它开发出的DubboX推出了2.6版本。之后在18年除夕夜,阿里正式将Dubbo捐献给了著名开源组织Apache,成为Apache众多开源项目之一。

Apache Dubbo

ZooKeeper 也是 Apache 软件基金会的一个软件项目,它为大型分布式计算提供开源的分布式配置服务、同步服务和命名注册。

ZooKeeper 的架构通过冗余服务实现高可用性。

Zookeeper 的设计目标是将那些复杂且容易出错的分布式一致性服务封装起来,构成一个高效可靠的原语集,并以一系列简单易用的接口提供给用户使用。

一个典型的分布式数据一致性的解决方案,分布式应用程序可以基于它实现诸如数据发布/订阅、负载均衡、命名服务、分布式协调/通知、集群管理、Master 选举、分布式锁和分布式队列等功能。

Apache ZooKeeper

安装

使用Dubbo引入相关依赖即可,下面具体实践会涉及。

ZooKeeper可以去官网下载安装,这里我还是用docker在Linux服务器上安装。

# 拉取镜像
docker pull zookeeper

# 启动
docker run -d \
-p 2181:2181 \
-v /home/zookeeper/data/:/data/ \
--name=zookeeper  \
--privileged zookeeper

# 如果想运行自带的客户端可以:
docker exec -it zookeeper bash
cd bin
./zkCli.sh
# 之后就可以使用相关命令了

安装ZooInspector来可视化查看zookeeper

# 下载后进入build目录运行jar包,输入zookeeper的地址即可连接
java -jar zookeeper-dev-ZooInspector.jar

使用dubbo-admin可视化监控服务

dubbo-admin是一个Springboot项目,可以监控我们注册到注册中心到服务。

到github上下载

apache/dubbo-admin

解压后在application.properties中修改zookeeper地址

dubbo.registry.address=zookeeper://[ip]:2181

之后用mvn命令打包再运行jar包即可,也可以直接在idea里打包

运行后浏览器 打开localhost:7001 ,输入账号密码默认都为root,来到主页

中间的搜索框可以搜索服务、应用、ip,菜单栏上也有各种监控服务的方式。

SpringBoot Demo

用idea建立一个空项目,然后添加两个Modules,都为Springboot项目。

一个作为服务提供者provider,一个作为服务消费者consumer

两者都添加以下maven依赖

<!-- https://mvnrepository.com/artifact/org.apache.dubbo/dubbo-spring-boot-starter -->
<dependency>
    <groupId>org.apache.dubbo</groupId>
    <artifactId>dubbo-spring-boot-starter</artifactId>
    <version>2.7.8</version>
</dependency>

<!-- https://mvnrepository.com/artifact/com.github.sgroschupf/zkclient -->
<dependency>
    <groupId>com.github.sgroschupf</groupId>
    <artifactId>zkclient</artifactId>
    <version>0.1</version>
    <exclusions>
        <exclusion>
            <artifactId>zookeeper</artifactId>
            <groupId>org.apache.zookeeper</groupId>
        </exclusion>
    </exclusions>
</dependency>

<!-- https://mvnrepository.com/artifact/org.apache.curator/curator-framework -->
<dependency>
    <groupId>org.apache.curator</groupId>
    <artifactId>curator-framework</artifactId>
    <version>2.12.0</version>
    <exclusions>
        <exclusion>
            <artifactId>zookeeper</artifactId>
            <groupId>org.apache.zookeeper</groupId>
        </exclusion>
    </exclusions>
</dependency>

<!-- https://mvnrepository.com/artifact/org.apache.curator/curator-recipes -->
<dependency>
    <groupId>org.apache.curator</groupId>
    <artifactId>curator-recipes</artifactId>
    <version>2.12.0</version>
</dependency>

<!-- https://mvnrepository.com/artifact/org.apache.zookeeper/zookeeper -->
<dependency>
    <groupId>org.apache.zookeeper</groupId>
    <artifactId>zookeeper</artifactId>
    <version>3.6.2</version>
    <exclusions>
        <exclusion>
            <artifactId>log4j</artifactId>
            <groupId>log4j</groupId>
        </exclusion>
        <exclusion>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-log4j12</artifactId>
        </exclusion>
    </exclusions>
</dependency>

其中Curator是zookeeper分布式协调服务的java客户端库,它包装了一系列操作zk的高级API和实用库,是的操作zk变得更加容易和可靠。

在provider项目中创建并注册服务

包目录都是就直接com.xxx,不要多一级,然后在provider项目的com.xxx路径下创建一个service目录,写一个简单的服务接口

package com.ccqstark.service;

public interface TicketService {
    String getTicket();
}

然后是其实现

import com.ccqstark.service.TicketService;
import org.apache.dubbo.config.annotation.DubboService;
import org.springframework.stereotype.Component;

@DubboService // 服务注册注解
@Component
public class TicketServiceImpl implements TicketService {

    @Override
    public String getTicket(){
        return "dubbo+zookeeper!";
    }

}

其中注解@DubboService 用来把该服务注册到zookeeper中

修改provider项目的application.properties

# 服务应用名称
dubbo.application.name=provider-server
# 注册中心地址
dubbo.registry.address=zookeeper://[ip]:2181
# 被注册的服务
dubbo.scan.base-packages=com.ccqstark.service

然后启动项目,就可以在之前安装的dubbo中发现该服务了

在consumer项目中调用服务

配置文件中增加配置

# 消费者暴露的服务应用名称
dubbo.application.name=consumer-server
# 注册中心地址
dubbo.registry.address=zookeeper://[ip]:2181

同样创建com.xxx.service包,把provider里的TicketService的接口文件复制过来

创建一个调用此服务的例子

import org.apache.dubbo.config.annotation.DubboReference;
import org.springframework.stereotype.Service;

@Service
public class UserService {

    @DubboReference // 获取注册中心中的服务
    TicketService ticketService;

    public void buyTicket() {
        String ticket = ticketService.getTicket();
        System.out.println("调用provider的服务:" + ticket);
    }
    
}

注解@DubboReference 用于获取注册中心的服务

写个单元测试

@SpringBootTest
class ConsumerServerApplicationTests {

    @Autowired
    UserService userService;

    @Test
    void contextLoads() {
        userService.buyTicket();
    }

}

运行之后就可以发现consumer项目调用provider的服务成功!

最基本的服务注册发现与rpc调用大概是demo这样。

参考自: bilibili

comments powered by Disqus
一辈子热爱技术
Built with Hugo
Theme Stack designed by Jimmy
gopher