美文网首页
单节点rabbitmq的k8s配置(二)

单节点rabbitmq的k8s配置(二)

作者: Charles_linzc | 来源:发表于2021-04-27 11:01 被阅读0次

    通过编写secret, service, deployment 的k8s文件,我们成功将rabbitmq部署到了win10 dockerdesktop的k8s中,接着我们需要创建必要的初始化信息,以方便应用程序能够连接到rabbitmq上。
    一, exchange的创建
    以下是rabbitmq的通信模型:

    image.png
    所有的消息并不是直接发送到队列里,在消息消费者能收到消息前,我们首先需要为消息生产者创建exchange.
    exchange 可以通过管理端创建,也可以通过命令工具创建。
    1.1 通过管理端创建:
    使用http://localhost:32001 (参考单节点rabbitmq的k8s配置一)及admin账户我们登录到rabbitmq管理端:
    image.png
    点击 “Exchange”, 我们可以看到系统中创建的所有的exchange。展开"add a new exchange", 新增一个exchange.
    image.png
    在列表中点击新增的exchange,可以查看详情:
    image.png
    1.2 使用rabbitmqadmin 命令创建:
    使用kubectl exec 命令登入rabbitmq的pod, 命令格式如下:
    kubectl exec -it rabbitmq-xxxxx sh
    登入后,输入rabbitmqadmin --help,可以查看所有支持的子命令, 输入创建命令:
    rabbitmqadmin -V / -u xxxx -p xxx declare exchange name=ImgReporting_Exchange_rogen type=direct
    我们将使用admin账户,在 ‘/' 下声明一个direct类型的exchange,如图:
    image.png
    从管理界面,也可以看到新建的exchange.
    二,队列的创建
    生产者发送的消息,根据规则(rountingkey)会存放到指定的队列,这个队列对应的是消费者。生成队列有两种方式,一种是有消费者初次连接时自动生命,一种是管理端创建,分别应用于不同的场景。在微服务群环境中,我们希望所有的微服务只有生产和消费权力,所以我们手动创建微服务使用的队列。同样使用rabbitmqadmin 来创建队列。
    2.1 创建队列
    使用rabbitmqadmin的子命令delare queue,我们可以创建一个新队列:
    rabbitmqadmin -V / -u admin -p xxxxx declare queue name=createCase
    image.png
    登录管理端我们可以查看新创建的队列,默认新创建的队列类型是classic, durable为True。
    image.png

    2.2 将对列bind到exchange上
    根据通信模型,创建完模型后我们需要将队列bind到exchange上,并指明binding key(direct,topic等类型需要),我们同样使用rabbitmqadmin类型来完成。


    image.png

    如上图(引用来自网上其它blog),其实bindingkey的作用就是过滤routingkey, 让满足条件的消息进入队列。
    rabbitmqadmin -V / -u admin -p xxxxx declare binding source=ImgReporting_Exchange destination=createCase routing_key=createCase


    image.png
    我们登录管理,在exchange里可以看到新创将的binding:
    image.png

    2.3 做个测试验证
    完成消息的线路规划后,我们做个测试,来看看消息是否正常收发:
    rabbitmqadmin -V / -u admin -p xxxx publish routing_key=createCase exchange=ImgReporting_Exchange payload="this is a testing"


    image.png

    发送消息时需要指定routingkey 和exchange, 如果不指定exchange,消息将发送到默认exchange中. 登录管理端界面,进入我们创建好的队列,这时候后,我们可以看到有一条消息还没有消息。


    image.png
    现在我们继续用命令行来消费这条消息:
    rabbitmqadmin -V / -u admin -p Admin123 get queue=createCase
    image.png
    现在我们可以看到已经发送来的消息“this is a test”.

    五, 权限设置
    直接使用admin(默认账户)给微服务时不合适的,我们需要创建新的账户,并设置相应的权限。
    5.1 创建用户
    我们使用rabbitmqctl 俩创建user,语法如下:


    image.png

    这里我们添加一个lifeccp的用户:rabbitmqctl add_user lifeccp lifeccpTest


    image.png
    添加成功后,可以在管理端看到新的用户:
    image.png

    5.2 设置用户访问virtual host的权限
    创建完用户后,我们需要给这个用户设置权限,rabbitmq的用户权限分为多个层面,首先可以限制用户可以访问的virtual host, 我们设置刚刚新建的用户只能访问 “/”:
    我们使用 rabbitmqctl setpermissions来设置用户权限, 主要是需要设置conf, write, read的权限。

    image.png
    命令如下:
    rabbitmqctl set_permissions -p "/" "lifeccp" "queue." "." "."
    我们允许lifeccp用户有声明使用queue开头的队列。
    image.png
    rabbitmq官网列出了可以使用的资源:
    第一列表示rabbitmq(AMQP规范)支持的操作。
    第一行 congure wirte read 表示三个权限。
    操作与权限的交叉数据格如果有值,表示AMPQ操作对该资源起作用需要具有的权限。 例如exchange.declare对exchange起作用需要具有config权限。exchange的值是一个正则表达式。"queue.
    "表示以queue开头的资源。
    image.png
    queue.declare (passive=false) 表示在客户端生命时,如果设置passive=false(declareQueuePassive()),则需要对queue进行configure权限验证。
    queue.declare (passive=true) 三列都为空,表示没有任何方式进行queue declare操作, 事实上,它是客户端用来测试对应的queue是否存在,如果存在返回成功,如果不存在返回失败,不会创建新queue.
    Rabbitmq的权限设置有一个问题,没办法对资源类型起作用。列入下面的权限设置,
    rabbitmqctl set_permissions -p "/" "lifeccp" "queue." "." ".*", 虽然可以限定只对queue开头的资源起作用,但是并不能直接限定类型。
    现实场景中,我们希望某个用户有自己声明队列并binding到exchange的权限,可以收,发消息。收发消息,和bind权限使用write和read就可以,但是声明队列需要config权限。这时候由于不能限定资源类型,所以仍旧可以声明以queue开头的exchange(实际上我们并不希望用户有能力声明exchange)。

    相关文章

      网友评论

          本文标题:单节点rabbitmq的k8s配置(二)

          本文链接:https://www.haomeiwen.com/subject/eoldrltx.html