通过编写secret, service, deployment 的k8s文件,我们成功将rabbitmq部署到了win10 dockerdesktop的k8s中,接着我们需要创建必要的初始化信息,以方便应用程序能够连接到rabbitmq上。
一, exchange的创建
以下是rabbitmq的通信模型:
所有的消息并不是直接发送到队列里,在消息消费者能收到消息前,我们首先需要为消息生产者创建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的权限。
命令如下:
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)。
网友评论