基于docker的zookeeper+dubbo入门案例

作者:神秘网友 发布时间:2021-02-28 13:50:03

基于docker的zookeeper+dubbo入门案例

目录
  • 环境
  • 创建容器myzookeeper并运行
    • 步骤
    • 查看容器运行情况
    • 查看zookeeper内部信息
  • Dubbo管理平台dubbo-admin的安装
    • dubbo-admin
    • 前置条件
    • 步骤
      • 创建并运行容器dubbo-admin
      • 设置注册中心地址
    • 运行结果
      • 容器运行状况
      • 访问dubbo-admin
    • 补充说明
      • 关于dubbo-admin的安装
      • 关于注册中心地址的配置
  • Demo
    • 新建mavne项目DubboDemo
    • 新建Module
    • DubboDemo的pom.xml中导入zk客户端依赖和dubbo依赖
    • 在dubbo-interface中编写IDemoService
    • 在dubbo-provider中实现IDemoService
    • 在dubbo-consumer中调用IDemoService
    • 运行

环境

  • 虚拟机:Ubuntu 16.04

  • docker版本

创建容器myzookeeper并运行

步骤

docker run --name myzookeeper -d -p 2181:2181 zookeeper
  • docker run 创建一个新的容器并运行一个命令

  • --name 后接容器名称

  • -d 后台运行容器,并返回容器ID

  • -p 指定端口映射,格式为虚拟机端口:docker容器端口

  • 最后接镜像名称。

    • 直接写镜像名称默认当前使用镜像为zookeeper:latest,若docker中没有此镜像,则会自动下载。

      使用docker images查看镜像,会发现新增了一个latest的zookeeper。

    • 若需要指定版本,则可表示为zookeeper:版本号(tag)

查看容器运行情况

docker ps

(这里换行有点难受...然后就是前面讲解了创建容器时带版本与不带版本的区别,所以这里有两个zookeeper容器在运行,觉得别扭的话可以使用docker stop 容器名/容器id关闭其中一个容器。)

查看zookeeper内部信息

这个步骤做拓展使用,下面介绍的内容仅仅在查看zookeeper信息,并未作任何配置。

进入zookeeper容器,并进入其bin目录

docker exec -it 容器名/容器id bash

关于docker exec命令的使用,可以参考菜鸟教程:Docker exec命令

  1. 查看zookeeper当前的状态

    ./zkServer.sh status
    
    • Mode:standalone 单机模式
    • 在启动容器时,docker帮我们进行了zookeeper的启动,如果没有借用docker,在zookeeper安装完成后,可以使用./zkServer.sh start启动zookeeper。
  2. 启动zk客户端,查看信息。

    ./zkCli.sh
    
    • 与mysql、redis等软件一样,zookeeper也提供了客户端程序,用于对服务器上的数据进行操作。zkCli.sh是zookeeper为我们提供的客户端脚本程序。

    • 查看zookeeper的根节点信息

      ls /
      

      此处列出了/节点下的全部子节点信息,由于我们还没有创建任何节点,所以只有一个zookeeper节点(由zk自己默认创建)存在。

    • 后续使用dubbo-admin管理服务并完成demo发布服务后,这里会多出一个节点dubbo。继续深入节点,会发现zookeeper内部是以树状结构存储数据的,表现为/→zookeeper,dubbo→(dubbo节点)service1,servicec2.....→(service1节点)consumers、configurators、providers、routes

      (这里提供者的信息存在乱码...)

  3. 退出容器

    • ctrl+D:退出容器并停止容器的运行

    • ctrl+P+D:退出容器且不停止容器

Dubbo管理平台dubbo-admin的安装

dubbo-admin

图形化的服务管理页面(实际就是一个web项目,项目地址:apache/dubbo-admin),部署时需要指定注册中心地址,即可从注册中心中获取到所有的提供者 / 消费者进行配置管理。

前置条件

  • 我的dubbo-admin管控台的安装是基于zookeeper注册中心,安装前请确保已成功安装zookeeper。

步骤

创建并运行容器dubbo-admin

docker run --name dubbo-admin -d -p 9090:8080 chenchuxin/dubbo-admin:latest
  • 实验的时候我拉取apache/dubbo-admin一直失败,这里换用chenchuxin/dubbo-admin。关于apache/dubbo-admin的使用,可参考docker hub:apache/dubbo-admin

设置注册中心地址

  1. 进入容器内部

    docker exec -it dubbo-admin bash
    
    • 使用该命令进入容器内部

  2. 编辑dubbo-admin项目的dubbo.properties

    vi ROOT/WEB-INF/dubbo.properties
    
    • 将其中的dubbo.registry.address设置为自己的注册中心地址

      默认的地址为zookeeper://127.0.0.1:2181,虽然此时dubbo-admin与zookeeper的容器是位于同一台虚拟机中,ip地址为localhost理论上来说没有问题,但是经过验证,若不修改注册中心地址,dubbo-admin无法获取到注册中心中的信息。

  3. 重启容器

    docekr restart dubbo-admin
    

运行结果

容器运行状况

访问dubbo-admin

由于现在不存在任何消费者与提供者,所以列表中暂无信息。

补充说明

关于dubbo-admin的安装

如果不使用docker部署,在虚拟机或主机中直接部署的步骤大致为如下所示。

  1. dubbo2.5.x之前的版本

    1. 安装jdk。
    2. 安装tomcat。
    3. 下载dubbo-admin的war,并修改其配置文件application.properties中的dubbo.registry.address ,指定注册中心地址。
    4. 在tomcat上部署运行3中的项目。(期间可能存在端口冲突)
  2. dubbo2.6.0之后的版本

    在github上下载dubbo-admin的项目源码,使用maven将其打成jar包,通过java -jar xxx.jar命令启动

    (步骤可以参考github:apache/dubbo-amdin README_ZH.md 生产环境配置)

关于注册中心地址的配置

关于chenchuxin/dubbo-admin的使用,我认为docker hub:chenchuxin/dubbo-admin中介绍的关于注册中心地址的配置是存在问题的。在前面的链接中写道,要设置zookeeper地址,只需要在创建容器时使用-e设置环境变量即可。但是这个环境变量是针对容器的,而zookeeper地址的配置是位于dubbo-admin项目中的配置文件中的,环境变量的设置并不会对配置文件中的值产生影响,所以前文在容器创建并运行后,我们需要进入容器内部通过修改dubbo-admin的配置文件来设置注册中心地址。

下文来验证一下docker run中的-e选项所设置的环境变量。

  1. 首先创建一个测试容器并设置环境变量:dubbo-admin-test

    docker run --name dubbo-admin-test -d -p 8888:8080 -e dubbo.registry.address=zookeeper://192.168.218.128:2181 chenchuxin/dubbo-admin:latest
    
  2. 查看容器环境变量

    docker exec dubbo-admin-test env|grep zookeeper
    
    • 使用上述命令于容器外查看容器环境变量。

      通过结果可知环境变量设置成功,此时打开dubbo-admin的配置文件,会发现dubbo.registry.address的值还是默认的zookeeper://127.0.0.1:2181,说明使用-e设置的环境变量对项目是不起作用的。

    • 如何查看容器的环境变量。

      如何查看docker的环境变量

      • 位于容器外

        • 可以使用docker exec 容器名/容器id env查看,结合管道和grep查看(docker exec 容器名/容器id env|grep xxx)可以避免在一堆文本中肉眼搜索。
        • docker inspect 容器名/容器id|grep xxx
        • docker exec -it 容器名/容器id env|grep xxx
      • 位于容器内

        • 容器的环境变量就是容器中1号进程的环境变量,可以利用命令cat /proc/1/environ 查看,同样,容器中其他进程的环境变量也可以通过cat /proc/{pid}/environ 查看

Demo

新建mavne项目DubboDemo

新建Module

在DubboDemo下新建三个maven module:dubbo-interface、dubbo-provider、dubbo-consumer

  • 注意此处parent可以选择DubboDemo。因为在dubbo-provider和dubbo-consumer中都需要导入zk客户端依赖和dubbo依赖,如果这里parent选择none,后面需要分别在providedr和consumer的pom.xml中导入依赖。如果选择DubboDemo,则只需要在DubboDemo的pom.xml中导入依赖,以DubboDemo为父项目的所有module就都导入了依赖。
  • idea中的Project相当于eclipse中的workspace,idea的Module相当于eclipse中的project

DubboDemo的pom.xml中导入zk客户端依赖和dubbo依赖

    dependencies
        !-- zk客户端 --
        dependency
            groupIdcom.github.sgroschupf/groupId
            artifactIdzkclient/artifactId
            version0.1/version
        /dependency
        !-- dubbo --
        dependency
            groupIdcom.alibaba/groupId
            artifactIddubbo/artifactId
            version2.5.10/version
        /dependency
    /dependencies

在dubbo-interface中编写IDemoService

public interface IDemoService {
    String helloDemo();
}

在dubbo-provider中实现IDemoService

  1. 在dubbo-provider的pom.xml中引入dubbo-interface

    dependencies
        dependency
            groupIdcn.cyt/groupId
            artifactIddubbo-interface/artifactId
            version1.0-SNAPSHOT/version
        /dependency
    /dependencies
    
  2. 编写DemoServiceImpl

    public class DemoServiceImpl implements IDemoService {
        public String helloDemo() {
            return "Hello,Duboo!";
        }
    }
    
  3. 在resources中新建spring配置文件dubbo-provider并写入相关信息

    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://192.168.218.128:2181"/
        !-- 用dubbo协议在20890端口暴露服务 --
        dubbo:protocol name="dubbo" port="20890"/
        !-- 声明需要暴露的服务接口 --
        dubbo:service interface="cn.cyt.service.IDemoService" ref="demoService" /
        !-- 声明Bean:demoService --
        bean id="demoService" class="cn.cyt.service.impl.DemoServiceImpl" /
    
    /beans
    
    • 这里我采用xml配置,也可以采用注解配置。注解配置的使用可以参考dubbo:注解配置
  4. 新建Provider.java,加载spring配置文件发布服务

    public class Provider {
        public static void main(String[] args) throws IOException {
            ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext(
                    new String[]{"classpath:dubbo-provider.xml"});
            context.start();
            System.out.println("发布服务成功!");
            System.in.read(); // 按任意键退出
        }
    }
    
  5. 最后看一下dubbo-provider这个module的整体文件结构

在dubbo-consumer中调用IDemoService

  1. 引入dubbo-interface

  2. 在resources中新建spring配置文件dubbo-consumer并写入相关信息

    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://192.168.218.128:2181"/
        !-- 引入服务 --
        dubbo:reference id="demoService" interface="cn.cyt.service.IDemoService"/
    /beans
    
  3. 新建Consumer.java,调用IDemoService

    public class Consumer {
        public static void main(String[] args) throws IOException {
            ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext(
                    new String[] {"classpath:dubbo-consumer.xml"});
            context.start();
            IDemoService demoService = (IDemoService)context.getBean("demoService"); // 获取远程服务代理
            String hello = demoService.helloDubbo(); // 执行远程方法
            System.out.println( hello ); // 显示调用结果
            System.in.read(); // 按任意键退出
        }
    
    }
    
    
  4. 最后看一下dubbo-consumer这个module的整体文件结构

运行

先运行dubbo-provider的Provider.java,再运行dubbo-consumer的Consumer.java,并在dubbo-admin中观察提供者消费者的情况。

基于docker的zookeeper+dubbo入门案例 相关文章

  1. 基于角色访问控制RBAC权限模型的动态资源访问权限管理实现

    RBAC权限模型(Role-Based Access Control) 前面主要介绍了元数据管理和业务数据的处理,通常一个系统都会有多个用户,不同用户具有不同的权限,本文主要介绍基于RBAC动态权限管理在crudapi中的实现。 概要 RBAC简介 RBAC权限模型(Role-Based Access Contr

  2. C++图像分割库

    基于LibTorch (Pytorch C++)的C++开源图像分割神经网络库. 分享一个C++的图像分割开源库libtorch segment,支持C++训练分割模型,可以训练自己的数据集。支持FPN,UNet,PAN,DeepLabV3和DeepLabV3+,支持ResNet系列和ResNext系列的编码器骨干网络。这个库具

  3. 基于注解@Aspect实现Spring AOP

    摘要 :基于注解@Aspect实现Spring AOP切面编程。 目录 基于注解@Aspect实现Spring AOP 小结 Reference 基于注解@Aspect实现Spring AOP ??Spring AOP使用的是动态代理,所谓的动态代理就是说AOP框架不会去修改字节码,而是在内存中临时为方法生成一个AOP对象

  4. 基于spider的全站数据爬取

    基于spider的全站数据爬取 基于spider的全站数据爬取 就是将网站中某板块下的全部页码对应的页面数据进行爬取 需求:爬取校花网中的照片名称 实现方式: 将所有页面的url添加到start_urls列表(不推荐) 自行手动进行请求发送(推荐) yield scrapy.Request(url,

  5. docker仓库之harbor高可用 (三)

    基于上一篇部署完成了企业级仓库harbor的部署,今天我们来聊聊什么是harbor的高可用 Harbor 支持基于策略的 Docker 镜像复制功能,这类似于 MySQL 的主从同步, 其可以实现不同的数据中心、不同的运行环境之间同步镜像,并提供友好的管理 界面,大大简化了实

  6. 极简操作RabbitMQ的Go客户端

    基于https://github.com/streadway/amqp封装了一个RabbitMQ Go客户端,使用起来更方便。 安装 go get github.com/itbsl/rabbitmq 使用 使用起来,rabbitmq只包含5个创建不同类型的RabbitMQ实例的方法,和一个关闭连接的方法,以及发送消息和获取消息的的两个

  7. docker容器权限设置--cap-add | --cap-drop | privileged

    docker 容器的权限设置 Dcoker容器在使用的过程中,默认的docker run时都是以普通方式启动的,有的时候是需要使用在容器中使用iptables进行启动的,没有使用iptables的权限,那么怎样才能在容器中使用iptables呢要如何开启权限呢 那么在docker进行run的时候

  8. 基于协程+socket的高效并发爬虫工具

    一、背景 因为经常有爬虫数据处理的需求,之前一直用的多线程+requests方式爬虫,但是这种方式有两个问题: 1、当请求很多,并发稍微多一点的时候电脑特别卡 2、每次变更请求包,比如post换get,需要用不同的方式解析出header等数据不是很方便 主要基于这两

  9. docker管理基础

    镜像的概念 镜像可以理解为应用程序的集装箱,而docker用来装卸集装箱。 docker镜像含有启动容器所需要的文件系统及其内容,因此,其用于创建并启动容器。 docker镜像采用分层构建机制,最底层为bootfs,其上为rootfs bootfs:用于系统引导的文件系统,包括b

  10. 14_基于Nacos实现高可用服务注册中心部署

    基于Nacos实现高可用服务注册中心部署 Nacos原理已经讲完了,如果说后续我们要做一个C2C二手电商平台的社会化治理系统的项目案例,以及落地后续的一系列的微服务架构,首先我们就知道,必须得有一个服务注册中心,技术选型和对比,以及nacos原理和讲解,已经

每天更新java,php,javaScript,go,python,nodejs,vue,android,mysql等相关技术教程,教程由网友分享而来,欢迎大家分享IT技术教程到本站,帮助自己同时也帮助他人!

Copyright 2020, All Rights Reserved. Powered by 跳墙网(www.tqwba.com)|网站地图|关键词