pulsar在docker-compose中运行及超级管理API使用.

pulsar的admin-api调用.
包含功能: 创建tenant,namespace,token,role,permission
见 https://github.com/windsome/ms-pulsar-admin

项目目标

  1. 创建租户, 及租户相关的namespace,role,token,permission
  2. 删除租户, 删除所有相关.
  3. tenant/namespace/topic组织结构
  • 消息由msgpush用户发出,此为系统用户,消息来源可能为电信平台,可能为yihong设备模拟器平台,此msgpush相当于超级用户,能向 msgpush/*/*发送消息.
  • 消费着监听 msgpush/<own_tenant>/<topic>下面的消息.

官网中以docker方式运行pulsar.

在 Docker 里配置单机 Pulsar
使用--mount模式连接配置文件及数据文件:
docker run -it --name=pulsar_standalone -p 6650:6650 -p 8080:8080 --mount source=pulsardata,target=/pulsar/data --mount source=pulsarconf,target=/pulsar/conf apachepulsar/pulsar:2.7.1 bin/pulsar standalone
运行docker inspect pulsar_standalone获取到docker容器详情,找到Mounts字段,如果是第一次运行,pulsarconf会自动生成,Source字段即为存放配置的目录,该例子为/var/lib/docker/volumes/pulsarconf/_data,见如下:

        "Mounts": [{"Type": "volume","Name": "pulsardata","Source": "/var/lib/docker/volumes/pulsardata/_data","Destination": "/pulsar/data","Driver": "local","Mode": "z","RW": true,"Propagation": ""},{"Type": "volume","Name": "pulsarconf","Source": "/var/lib/docker/volumes/pulsarconf/_data","Destination": "/pulsar/conf","Driver": "local","Mode": "z","RW": true,"Propagation": ""}],

为方便修改及保存配置,使用文件夹映射方式运行docker化pulsar

先建立pulsar工作目录./pulsar,在其下面建立data用来保存数据,conf保存配置. 将上面/var/lib/docker/volumes/pulsarconf/_data中内容拷贝进目录./pulsar/conf
-v目录映射模式运行docker, 命令:
docker run -it -p 6650:6650 -p 8080:8080 -v `pwd`/data:/pulsar/data -v `pwd`/conf:/pulsar/conf apachepulsar/pulsar:2.7.1 bin/pulsar standalone

pulsar-manager通过web界面对pulsar进行管理(不是必须)

pulsar-manager是一个pulsar的管理器,只能管理standalone型不需要认证的pulsar.他是一个web服务器,通过连接pulsar的admin-api进行管理.admin-api为一个urlhttp://localhost:8080,运行命令为:
docker run -it -p 9527:9527 -p 7750:7750 -e SPRING_CONFIGURATION_FILE=/pulsar-manager/pulsar-manager/application.properties apachepulsar/pulsar-manager:v0.2.0
初次启动此服务器后,需运行如下命令,生成管理员账号,然后访问http://localhost:9527,使用刚才创建的账号admin登录进行操作.

CSRF_TOKEN=$(curl http://localhost:7750/pulsar-manager/csrf-token)
curl \-H 'X-XSRF-TOKEN: $CSRF_TOKEN' \-H 'Cookie: XSRF-TOKEN=$CSRF_TOKEN;' \-H "Content-Type: application/json" \-X PUT http://localhost:7750/pulsar-manager/users/superuser \-d '{"name": "admin", "password": "apachepulsar", "description": "test", "email": "username@test.org"}'

真实运营部署环境介绍.

真实运营环境中,pulsar会部署成集群,这个暂不讨论. 还有一种准真实环境,即外部使用上与真实环境一样,但部署上使用standalone单机模式+jwt-token认证.即类似电信物联网平台中pulsar的使用模式.
电信物联网平台作为物联网设备管理平台,提供设备管理,命令转发,传感数据上报(即MQ消息推送)等功能, 其中MQ消息推送使用pulsar服务.
互联网设备厂商在电信物联网平台注册账号的同时, 在pulsar服务中创建了一个tenant及jwt-token及一个namespace为/aep-msgpush/<tenant-id>. tenant只在此namespace下具有consume权限.
厂商用户可以在该namespace下创建不超过10个topic用来接收数据.不同topic可以关联不同的产品.
厂商token可以在https://jwt.io/进行在线解析,查看里面内容.

从真实运营环境的需求可以看出有如下需求:

  1. 需要控制访问授权,可以用jwt-token这种最简单方式.
  2. 需要有个超级用户,可以朝所有的namespace/topic发送消息.
  3. 需要能动态创建厂商租户.可以用admin-api完成.
  4. 厂商租户能接收到发送给他的消息.

针对真实运营环境,我们做一个准真实环境部署.

  1. 首先根据原始环境制作一个pulsar的docker-compose.yml,如下:
version: '3.3'
services:pulsar:image: "apachepulsar/pulsar:2.7.1"command: bin/pulsar standalonerestart: alwaysports:- "6650:6650"- "8080:8080"volumes:- ./pulsar-cfg/data:/pulsar/data- ./pulsar-cfg/conf:/pulsar/confpulsar-manager:image: "apachepulsar/pulsar-manager:v0.2.0"restart: alwaysports:- "9527:9527"- "7750:7750"depends_on:- pulsarlinks:- pulsarenvironment:- SPRING_CONFIGURATION_FILE=/pulsar-manager/pulsar-manager/application.properties

直接运行docker-compose up即可运行测试环境.pulsar-manager用法见上面或官网.

  1. 根据上面所列真实环境需求,进行修改.
    主要处理jwt-token认证相关,创建secret-key,修改standalone.conf.
  • jwt-token相关
    运行docker exec -it ${pulsar容器id} /bin/sh进入容器命令行.运行如下命令:
# 得到base64编码的key
bin/pulsar tokens create-secret-key --output conf/auth/my-secret1-b64.key --base64
# 将base64编码的key转换成二进制.(这个命令在宿主机上运行,docker中可能没有此命令)
base64 -d conf/auth/my-secret1-b64.key > conf/auth/my-secret1.key
# 利用先前创建的key生成超级用户的jwt.(可以生成多个不同用户名的,这里生成了test-user)
bin/pulsar tokens create --secret-key conf/auth/my-secret1.key --subject test-user
# 得到的token是: `eyJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJ0ZXN0LXVzZXIifQ.KCepkApIwUV3rDgnI7hqKk6Xv3I3rRBZCwtKWkQSIGw`

这里有个注意事项,生成的my-secret1.key很重要,后续生成厂商的jwt也需要此key,做好保存工作.同时,不能让外部有机会获知此key. 否则, 该系统的认证机制等同透明, 任何人即可根据此key生成其他用户token,从而进行非法操作.
修改standalone.conf,找到如下键值,进行修改或添加

authenticateOriginalAuthData=true
authenticationEnabled=true
authenticationProviders=org.apache.pulsar.broker.authentication.AuthenticationProviderToken
authorizationEnabled=truesuperUserRoles=root,admin,test-user,msgpush
brokerClientAuthenticationPlugin=org.apache.pulsar.client.impl.auth.AuthenticationToken
brokerClientAuthenticationParameters=token:eyJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJ0ZXN0LXVzZXIifQ.KCepkApIwUV3rDgnI7hqKk6Xv3I3rRBZCwtKWkQSIGw
tokenSecretKey=data:;base64,4hVFTHInIEwS4b545UpVWghv6njne1FsqMJRo4FG5O8=
  1. 重新启动docker-compose up
    此时该pulsar即为需要jwt-token认证的broker. 管理操作需要使用admin-api进行.

为开发一个管理服务做准备工作(此服务将专门用于创建厂商用户tenant和jwt)

通过调用broker的admin-api进行管理, 即访问http://pulsar:8080进行. 注意在api调用的http头中需要填写Authorization字段, 内容为: 'Bearer ' + ${adminJwt}, 如: Authorization: Bearer eyJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJ0ZXN0LXVzZXIifQ.KCepkApIwUV3rDgnI7hqKk6Xv3I3rRBZCwtKWkQSIGw
api列表见https://pulsar.apache.org/admin-rest-api/?version=2.7.1&apiversion=v2#
目前主要用到的api为:

  1. 创建tenant
    接口:http://localhost:8080/admin/v2/tenants/{tenant},
    示例:
http://localhost:8080/admin/v2/tenants/<厂商tenant>
{"adminRoles": ["<厂商tenant>"],"allowedClusters": ["standalone"]
}

为简单起见,adminRoles和tenant为同一个值.
2. 创建namespace
接口:https://pulsar.incubator.apache.org/admin/v2/namespaces/{tenant}/{namespace}
电信物联网平台示例: http://localhost:8080/admin/v2/namespaces/aep-msgpush/2000016425,其中aep-msgpush为超级用户,可以向所有namespace/topic发送消息.2000016425为厂商tenant.
电信将向此namespaceaep-msgpush/2000016425发送设备变化等消息, 厂商消费此namespace下topic消息.

  1. 授权
    接口:http://pulsar.incubator.apache.org/admin/v2/namespaces/{tenant}/{namespace}/permissions/{role}
    示例:
POST http://localhost:8080/admin/v2/namespaces/aep-msgpush/2000016425/permissions/2000016425
[
"consume"
]

开发admin管理服务,使用jayson作为rpc服务协议.

封装admin-api调用的源码目录在src/mw/adminApi/,主要实现了tenant创建,namespace创建,授权. jwt生成接口是不需要连接broker的, 只需要使用Secret-key生成而已.

  • 目前对接的接口如下:
  1. 创建tenant, 参数为tenant, [clusters]. adminRoles与tenant相同, allowedClusters默认为standalone, 见tenant_create.js
  2. 创建namespace, 参数为tenant, namespace. 见namespace_create.js
  3. 授权, 参数为tenant, namespace, role, permissions. 见permission_grant.js.
  4. 生成jwt-token, 参数为subject, secret. 见jwt.js
  • 结合电信物联网应用需求,总结后,认为主要一个接口为创建tenant并同时创建namespace和jwt-token.见tenant.js,测试test_tenant.js.
  • 在源码根目录下执行./dockerpush.sh,生成docker,并推送到docker仓库.方便后续docker部署.

pytest目录有python测试代码

  1. 进入compose目录,执行docker-compose up启动服务. 注意启动过程中, 需要等一会儿, pulsar-admin服务器会访问pulsar创建msgpush这个tenant. 如果pulsar未启动成功, 则pulsar-admin会一直失败重启,直到成功. 这个部分可以优化, pulsar启动成功后8080访问成功才启动pulsar-admin.
  2. 运行 src/test/test_rpcs.js创建一个厂商tenant.得到jwt,填入pytest中文件中.这里创建了5ffd331a2222222222000003,得到jwt为eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiI1ZmZkMzMxYTIyMjIyMjIyMjIwMDAwMDMifQ.3kdXuhedpgdFjoFCmfnGhXlvKYfhDN_p0D6CeyCf0Es. 命令为: node src/test/test_rpcs.js
  3. 打开一个新终端,consume-token.py中token为厂商tenant对应的jwt-token,可以在自己有consume权限的namespace消费消息. 命令: python3 consume-token.py
  4. 打开一个新终端,produce-token.py中token可以为超级用户的jwt-token,即写在standalone.conf中的用户对应的token.可以往任意tenant/namespace/topic发送消息. 命令为: python3 produce-token.py
  5. 运行produce能在consume中看到消息.

pulsar在docker-compose中运行及超级管理API使用相关推荐

  1. 在Docker中运行ASP.NET Web API解决方案

    目录 介绍 先决条件 如何容器化现有项目 添加docker-compose项目 带有docker-compose的容器化解决方案 添加环境变量 后端 前端 不使用Visual Studio运行您的应用 ...

  2. 如何在Docker容器中运行GUI程序

    如何在Docker容器中运行GUI程序 各位,今天我们将学习如何在Docker之中运行GUI程序.我们可以轻易地在Docker容器中运行大多数GUI程序且不出错.Docker是一个开源项目,提供了一个 ...

  3. vs附加其它计算机应用到进程,如何将VS代码附加到在docker容器中运行的节点进程...

    我试图将Visual Studio代码调试程序附加到在Docker容器中运行的node.js应用程序. 我启动应用程序,如: node --debug-brk app.js 我在docker-comp ...

  4. 如何在Docker容器中运行Docker [3种方法]

    在本博客中,我将向您介绍在docker中运行docker所需的三种不同方法. Docker In Docker的用处 dockerIndocker的一个潜在用处是CI管道,在代码成功构建后,您需要在其 ...

  5. Docker 容器中运行 Docker 命令

    Docker 容器中运行 Docker 命令 在使用 GitLab/Jenkins 等 CI 软件的时候需要使用 Docker 命令来构建镜像,需要在容器中使用 Docker 命令:通过将宿主机的 D ...

  6. 【Rust日报】 2019-05-27:toast - 支持在docker容器中运行任务的工具

    Rust中文社区翻译小组招募 #activity #RustChina 首批任务:Rust官网翻译 这里有详细说明 https://github.com/rust-lang/www.rust-lang ...

  7. 在Linux和Windows的Docker容器中运行ASP.NET Core

    译者序:其实过去这周我都在研究这方面的内容,结果周末有事没有来得及总结为文章,Scott Hanselman就捷足先登了.那么我就来翻译一下这篇文章,让更多的中文读者看到.当然Scott遇到的坑我也遇 ...

  8. Beats:如何在 Docker 容器中运行 Filebeat

    今天在这篇博客中,我们将学习如何在容器环境中运行 Filebeat. 为了快速了解 Filebeat 是做什么用的: Filebeat用于转发和集中日志数据 它重量轻,小型化,使用的资源更少 它作为代 ...

  9. linux 安装simg2img,linux可执行文件执行时提示No such file or directory(docker环境中运行的ubuntu镜像)...

    linux下在转换system.img文件类型时,提示 首先进入到了可执行文件所在目录下,并将system.img也放在同一目录下: 查看文件信息,可以看到文件是存在的,并且是可以执行的. 于是执行如 ...

最新文章

  1. java后端 返回json_Java后端返回Json数据
  2. 【转】Android 之最新最全的Intent传递数据方法
  3. Oracle 原理: JAVA连接Oracle数据库 (JDBC)
  4. boost::mp11::mp_plus相关用法的测试程序
  5. SpringCloud微服务架构,Config 分布式配置中心,Bus 消息总线, Stream 消息驱动,Sleuth+Zipkin 链路追踪
  6. TextBox控件怎样赋值化学符号
  7. excel打开2个独立窗口_谢楠称女性独立的不是钱是心 谢楠与吴京婚后生育2个儿子...
  8. python移动平均线绘图_对python pandas 画移动平均线的方法详解
  9. sqllite事务和MySQL事务_Android学习---SQLite数据库的增删改查和事务(transaction)调用...
  10. 挺过最艰难的2018,我终将长大
  11. 【华为云技术分享】基于Atlas 200 DK的原版YOLOv3(基于Darknet-53)实现(Python版本)
  12. 【转】高并发情况下的单例模式
  13. matlab全局变量_MATLAB笔记(一):工具箱的卸载、阻尼振动波形图程序
  14. keil5破解失败【经验分享】
  15. 计算机启动方式如何选择USB启动,如何设置电脑从usb启动详细方法
  16. Linux unison 效率,Linux下inotify+unison双向同步环境部署
  17. DSP与广告位之间的关系
  18. Win10强制更新怎么关闭 彻底禁止Windows自动更新方
  19. 有限元方法求解二维矩形区域椭圆方程
  20. PHP开发环境配置指南

热门文章

  1. python决策树结果图_Python决策树图形输出
  2. docker容器介绍(3)
  3. EMC现场测试-EFT、ESD、Surge和场辐射
  4. android手机使用ipods2,airpods2 安卓使用体验
  5. 孙鑫VC++LESSON3:MFC框架程序剖析
  6. Python正则去除中英文标点的操作手法
  7. 教学|大神建模师提供建模思路,建模步骤详细
  8. 《欧美剧集观看最佳索引》【2006-9-24更新】
  9. 用python给老师排课表_用自动排课表软件生成课程表 从此告别排课烦恼
  10. Android 泽宇GC垃圾回收机制算法