一、背景
最近工作中接触数据安全相关的内容,顺便接触一下现在最新的私有云相关的一些技术,下面是工作中的一个场景。为了保证数据的安全性,需要确保每个客户的数据我们保存在各自的一个存储中,用户之间数据是不可见的。这样有几种解决方法:
使用分布式文件存储,通过文件系统的权限管控来实现在应用层做一层权限管控使每个用户的数据使用各自的存储引擎。
我们的设计方案就是基于第三种方案实现的。
二、设计
用户在注册的时候,帮用户生成创建自己的docker容器,并安装好MinIO(MinIO是一个对象存储服务器,具体可以官网https://min.io/)。根据业务在MinIO中创建对象的bucket,并设置对bucket操作的监听,从而进行下一步操作。
三、实现
所用功能都是用Java实现。
用户注册成功时,会往消息队列发送消息;后台服务监听消息队列,接收到创建的指令,就创建MinIO的docker,并创建bucket,设置监听
//配置监听的哪一个队列,同时在没有queue和exchange的情况下会去创建并建立绑定关系
@RabbitListener(bindings = @QueueBinding(
value = @Queue(value = "test-container", durable = "true"),
exchange = @Exchange(value = ExchangeConstants.CONTAINER_EXCHANGE, durable = "true", type = "topic"),
key = "container.*"
)
)
// 创建docker,安装minio
@RabbitHandler
public void minIoContainer(@Payload String s, @Headers Map<String, Object> headers, Channel channel) throws IOException {
log.info("headers:{}", headers);
String routingKey = (String) headers.get(AmqpHeaders.RECEIVED_ROUTING_KEY);
log.info("routingKey:{}", routingKey);
/*
* Delivery Tag 用来标识信道中投递的消息。RabbitMQ 推送消息给 Consumer 时,会附带一个 Delivery Tag,
* 以便 Consumer 可以在消息确认时告诉 RabbitMQ 到底是哪条消息被确认了。
* RabbitMQ 保证在每个信道中,每条消息的 Delivery Tag 从 1 开始递增。
*/
Long deliveryTag = (Long) headers.get(AmqpHeaders.DELIVERY_TAG);
// 创建docker client
DockerClient client = DockerClientBuilder.