Spring/SpringBoot与RabbitMQ整合

news2024/11/24 19:45:33

 具体代码 

依赖:

 <dependencies>
        <!-- https://mvnrepository.com/artifact/com.rabbitmq/amqp-client -->
        <dependency>
            <groupId>com.rabbitmq</groupId>
            <artifactId>amqp-client</artifactId>
            <version>5.7.0</version>
        </dependency>
        <!-- https://mvnrepository.com/artifact/com.google.code.gson/gson -->
        <dependency>
            <groupId>com.google.code.gson</groupId>
            <artifactId>gson</artifactId>
            <version>2.8.5</version>
        </dependency>
        <!-- https://mvnrepository.com/artifact/org.springframework.amqp/spring-rabbit -->
        <dependency>
            <groupId>org.springframework.amqp</groupId>
            <artifactId>spring-rabbit</artifactId>
            <version>2.1.4.RELEASE</version>
        </dependency>
        <!-- https://mvnrepository.com/artifact/junit/junit -->
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.12</version>
            <scope>test</scope>
        </dependency>
        <!-- https://mvnrepository.com/artifact/org.springframework/spring-test -->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-test</artifactId>
            <version>5.1.5.RELEASE</version>
            <scope>test</scope>
        </dependency>
    </dependencies>

 配置文件:

<?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:rabbit="http://www.springframework.org/schema/rabbit"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
                           http://www.springframework.org/schema/beans/spring-beans.xsd
                           http://www.springframework.org/schema/rabbit
                           http://www.springframework.org/schema/rabbit/spring-rabbit.xsd">

</beans>

写配置:

<?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:rabbit="http://www.springframework.org/schema/rabbit"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
                           http://www.springframework.org/schema/beans/spring-beans.xsd
                           http://www.springframework.org/schema/rabbit
                           http://www.springframework.org/schema/rabbit/spring-rabbit.xsd">


    <rabbit:connection-factory id="connectionFactory" host="192.168.200.166"
                               port="5672" username="ljj" password="123456"
                               virtual-host="/demo"/>
    
    <!--创建一个交换机-->
    <!--auto-declare="true"   有则加载该文件,无则创建-->
    <rabbit:topic-exchange name="springexchange" auto-declare="true">

    </rabbit:topic-exchange>

    <!--RedisTemplate-->
    <rabbit:template id="rabbitTemplate" connection-factory="connectionFactory"
                     exchange="springexchange"></rabbit:template>

    <!--创建面板工具-->
    <rabbit:admin connection-factory="connectionFactory"></rabbit:admin>

</beans>

 News.java:

package com.pb.entity;

import java.io.Serializable;
import java.util.Date;

public class News implements Serializable {
    private static final long serialVersionUID = 8707083474774769028L;
    private String source;
    private String title;
    private Date creatTime;
    private String content;

    public News() {
    }

    public News(String source, String title, Date creatTime, String content) {
        this.source = source;
        this.title = title;
        this.creatTime = creatTime;
        this.content = content;
    }

    public static long getSerialVersionUID() {
        return serialVersionUID;
    }

    public String getSource() {
        return source;
    }

    public void setSource(String source) {
        this.source = source;
    }

    public String getTitle() {
        return title;
    }

    public void setTitle(String title) {
        this.title = title;
    }

    public Date getCreatTime() {
        return creatTime;
    }

    public void setCreatTime(Date creatTime) {
        this.creatTime = creatTime;
    }

    public String getContent() {
        return content;
    }

    public void setContent(String content) {
        this.content = content;
    }
}

 NewsProducer.java:

public class NewsProducer {
    private RabbitTemplate rabbitTemplate;

    public void setRabbitTemplate(RabbitTemplate rabbitTemplate) {
        this.rabbitTemplate = rabbitTemplate;
    }
}

然后在去配置文件: 在创建一个bean

<!--创建一个bean-->
    <bean id="newsProducer" class="com.pb.producer.NewsProducer">
        <property name="rabbitTemplate" ref="rabbitTemplate" />
    </bean>

然后去加载bean

package com.pb.producer;

import com.pb.entity.News;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import java.util.Date;
public class NewsProducer {
    private RabbitTemplate rabbitTemplate;
    public void setRabbitTemplate(RabbitTemplate rabbitTemplate) {
        this.rabbitTemplate = rabbitTemplate;
    }
    public void send(String routingKey, News news) {
        rabbitTemplate.convertAndSend(routingKey, news);
    }
    public static void main(String[] args) {
        ApplicationContext ac = new ClassPathXmlApplicationContext("beans.xml");
        NewsProducer newsProducer = ac.getBean(NewsProducer.class);
        newsProducer.send("a.123213", new News("xxx", "xxx", new Date(), "xxx"));
        newsProducer.send("b.sadfwe", new News("sss", "sss", new Date(), "sss"));
        System.out.println("发送成功...");
    }
}

运行:

 

 

 

<?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:rabbit="http://www.springframework.org/schema/rabbit"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
                           http://www.springframework.org/schema/beans/spring-beans.xsd
                           http://www.springframework.org/schema/rabbit
                           http://www.springframework.org/schema/rabbit/spring-rabbit.xsd">


    <rabbit:connection-factory id="connectionFactory" host="192.168.200.166"
                               port="5672" username="ljj" password="123456"
                               virtual-host="/demo"/>

    <!--创建面板工具-->
    <rabbit:admin connection-factory="connectionFactory"></rabbit:admin>

    <!--创建队列-->
    <rabbit:queue name="springqueue" auto-declare="true" auto-delete="false" exclusive="false" durable="false"/>

    <!--和交换机进行绑定-->
    <rabbit:topic-exchange  name="springexchange" auto-declare="true">
        <rabbit:bindings>
            <rabbit:binding pattern="a.#" queue="springqueue" />
            <rabbit:binding pattern="b.#" queue="springqueue" />
        </rabbit:bindings>
    </rabbit:topic-exchange>


</beans>

在创建监听器的时候先创建一个实体:

 实体与生产端一样

NewsConsult.java:

package com.pb.consumer;


import com.pb.entity.News;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class NewsConsumer {
    public void getMessage(News news) {
        System.out.println(news.getSource() + "\t" + news.getTitle() +"\t" + news.getCreatTime() + "\t" + news.getContent());
    }
    public static void main(String[] args) {
        ApplicationContext ac = new ClassPathXmlApplicationContext("beans.xml");
    }
}

在到  配置文件中:加+

 <!--创建一个监听-->
    <rabbit:listener-container connection-factory="connectionFactory">
        <rabbit:listener ref="newsConsumer" method="getMessage" queue-names="springqueue"></rabbit:listener>
    </rabbit:listener-container>


    <!--创建消费者的bean-->
    <bean id="newsConsumer" class="com.pb.consumer.NewsConsumer"></bean>

运行:

 使用RabbitAdmin管理MQ(这样子出不来  有没有人 会?  求助)

 

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("classpath:beans.xml")
public class RabbitTest {
    @Autowired
    private RabbitAdmin rabbitAdmin;

    @Test
    public  void  test(){
        //System.out.println(rabbitAdmin);
        //创建交换机
        rabbitAdmin.declareExchange(new TopicExchange("aaa"));
        rabbitAdmin.declareExchange(new DirectExchange("bbb"));
        rabbitAdmin.declareExchange(new FanoutExchange("ccc"));
    }
}

 迁移到c

package com.pb;

import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.amqp.core.Binding;
import org.springframework.amqp.core.Queue;
import org.springframework.amqp.core.TopicExchange;
import org.springframework.amqp.rabbit.core.RabbitAdmin;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;

import javax.annotation.Resource;
import java.util.HashMap;

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("classpath:beans.xml")
public class RabbitTest {
    @Resource
    private RabbitAdmin rabbitAdmin;

    @Resource
    private RabbitTemplate rabbitTemplate;

    @Test
    public void test() {
        //创建交换机
        rabbitAdmin.declareExchange(new TopicExchange("aaa2", false, false));
        /*rabbitAdmin.declareExchange(new DirectExchange("bbb"));
        rabbitAdmin.declareExchange(new FanoutExchange("ccc"));*/

        rabbitAdmin.declareQueue(new Queue("dadeng"));
    }

    @Test
    public void test1() {
        rabbitAdmin.declareBinding(new Binding("dadeng", Binding.DestinationType.QUEUE, "springexchange", "#", new HashMap<String,Object>()));
        rabbitTemplate.convertAndSend("aaa", "大灯最近有点飘");
    }

    @Test
    public void test2() {
        rabbitAdmin.deleteExchange("springexchange");
        rabbitAdmin.deleteQueue("dadeng");
    }

}

 我们先用这个:

 运行test1:

 

 删除

@Test
public void test2() {
    rabbitAdmin.deleteExchange("springexchange");
    rabbitAdmin.deleteQueue("dadeng");
}

运行:

 Springboot与RabbitMQ整合-1 生产者:

依赖:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.7.12</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.pb</groupId>
    <artifactId>springbootconsumer</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>springbootconsumer</name>
    <description>springbootconsumer</description>
    <properties>
        <java.version>17</java.version>
    </properties>
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-amqp</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.springframework.amqp</groupId>
            <artifactId>spring-rabbit-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <configuration>
                    <excludes>
                        <exclude>
                            <groupId>org.projectlombok</groupId>
                            <artifactId>lombok</artifactId>
                        </exclude>
                    </excludes>
                </configuration>
            </plugin>
        </plugins>
    </build>
</project>

Product

配置文件:yml

server:
  port: 9000

spring:
  rabbitmq:
    username: test
    password: 123
    host: 192.168.235.128
    port: 5672
    virtual-host: /demo
    connection-timeout: 20000
    publisher-confirm-type: CORRELATED   #确认消息是否传递到mq
    publisher-returns: true             #如果说我们的消息没有匹配的路由则退回给生产者
    template:
      mandatory: true   #如果说我们的消息没有匹配的路由则退回给生产者

  Emp.java:

package com.pb.com.pb.entity;

import java.io.Serializable;

public class Emp implements Serializable {
    private static final long serialVersionUID = 6010911148025965132L;

    private Integer empno;
    private String name;
    private Integer age;

    public Emp() {
    }

    public Emp(Integer empno, String name, Integer age) {
        this.empno = empno;
        this.name = name;
        this.age = age;
    }
    public Integer getEmpno() {
        return empno;
    }
    public void setEmpno(Integer empno) {
        this.empno = empno;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public Integer getAge() {
        return age;
    }
    public void setAge(Integer age) {
        this.age = age;
    }
}
EmpProducer.java:
@Component
public class EmpProducer {

    @Resource
    private RabbitTemplate rabbitTemplate;


    public void send() {
        rabbitTemplate.convertAndSend("springbootexchange","#", new Emp(1001, "光光",20));
    }
}

 报错!!!!

我们手动创建一个交换机:

 

@Component
public class EmpProducer {

    @Resource
    private RabbitTemplate rabbitTemplate;

    RabbitTemplate.ConfirmCallback confirmCallback = new RabbitTemplate.ConfirmCallback() {
        @Override
        public void confirm(CorrelationData correlationData, boolean b, String s) {
            System.out.println(b + "\t" + s);
        }
    };

    RabbitTemplate.ReturnsCallback returnsCallback = new RabbitTemplate.ReturnsCallback() {
        @Override
        public void returnedMessage(ReturnedMessage msg) {
            Message message = msg.getMessage();
            String str = new String(message.getBody());
            System.err.println("信息为:" + str);
            System.err.println("交换机为:" + msg.getExchange());
            System.err.println("路由为:" + msg.getRoutingKey());

        }
    };

    public void send() {
        //设置消息ack机制
        rabbitTemplate.setConfirmCallback(confirmCallback);
        //设置消息的return机制
        rabbitTemplate.setReturnsCallback(returnsCallback);
        rabbitTemplate.convertAndSend("springbootexchange","#", new Emp(1001, "光光",20));
    }
}

测试:

 

 

 

 

 

 消费者:

配置文件:

spring:
  rabbitmq:
    username: ljj
    password: 123456                
    host: 192.168.200.166
    port: 5672
    virtual-host: /demo
    listener:
      simple:
        acknowledge-mode: manual  #手动签收
        concurrency: 1
        max-concurrency:  5

 NewConsumer.java:

package com.pb.consumer;

import com.pb.entity.Emp;
import com.rabbitmq.client.Channel;
import org.springframework.amqp.rabbit.annotation.Exchange;
import org.springframework.amqp.rabbit.annotation.Queue;
import org.springframework.amqp.rabbit.annotation.QueueBinding;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.amqp.support.AmqpHeaders;
import org.springframework.messaging.handler.annotation.Headers;
import org.springframework.messaging.handler.annotation.Payload;
import org.springframework.stereotype.Component;

import java.io.IOException;
import java.util.Map;

@Component
public class NewsConsumer {

    @RabbitListener(
            bindings=@QueueBinding(    //绑定队列和交换机
                    value=@Queue(name="bootqueue"),   //队列
                    exchange =@Exchange(name = "springbootexchange " ,type = "topic"),  //交换机
                    key = "#"  //路由
            )
    )
    public void getMessage(@Payload Emp emp, Channel channel, @Headers Map<String,Object> headers) throws IOException {
        System.out.println("接收到了消息:" + emp.getName() + "\t" + emp.getEmpno());
        Long id = (Long) headers.get(AmqpHeaders.DELIVERY_TAG);   //签收的Id
        channel.basicAck(id, false);
    }
}

启动服务:消费 

 运行生产者:tese

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/589036.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

定薪17K*15,阿里测开岗上岸面经分享....

先简单介绍一下我自己吧&#xff0c;等会大家以为我是什么学历狂人&#xff0c;技术大牛&#xff0c;我毕业于广东一个普通本科院校&#xff0c;绝对不是什么双一流大学&#xff0c;大家不要有距离感&#xff0c;这也是我为什么来分享的原因&#xff0c;因为我觉得我这段经验还…

github SSH 生成和使用(详细)

通过ssh连接github&#xff0c;可以有效的提升安全性 1.设置位置 2.生成ssh密钥&#xff08;windows&#xff09; 打开git bash&#xff0c;输入以下命名&#xff0c;把your_emailexample.com换成自己的github账号 ssh-keygen -t rsa -b 4096 -C "your_emailexample.co…

【计算几何】判断多边形边界顺逆时针 C++代码实现

文章目录 一、多边形边界顺序二、数学原理2.1 Green公式2.2 鞋带公式 三、代码实现 一、多边形边界顺序 多边形可以由一个点集 { v 1 , v 2 , . . . , v n } \{v_1,v_2,...,v_n\} {v1​,v2​,...,vn​} 表示&#xff0c;构成多边形的点集确定&#xff0c;多边形边界的顺序也就…

InsCode AI 创作助手围绕《程序员应如何应付AI带来的影响》为主题

InsCode AI 创作助手围绕《程序员应如何应付AI带来的影响》为主题 作者&#xff1a;i阿极 作者简介&#xff1a;Python领域新星作者、多项比赛获奖者&#xff1a;博主个人首页 &#x1f60a;&#x1f60a;&#x1f60a;如果觉得文章不错或能帮助到你学习&#xff0c;可以点赞&a…

Fabric模块功能介绍(一)

主要有5个模块,分别是peer、orderer、cryptogen、configtxgen、configtxlator 模块功能peer主节点模块&#xff0c;负责存储区块链数据、运行维护链码orderer交易打包&#xff0c;排序模块cryptogen组织和证书生成模块configtxgen区块和交易生成模块configtxlator区块和交易解…

【小程序开发日记】django学习笔记4

在没有学完django的情况下匆匆上阵。。。 这次的任务主要是管理数据库并实现浏览的功能。 首先介绍一下微信小程序连接后端的接口&#xff1a;wx.request 基本上输入后会比较经常使用的就是这几个参数。 接下来明确一下这次的工作&#xff1a; 我需要管理两个数据库&#x…

Python - numpy basic

目录 数组array的创建 1 通过list创建array 2 通过list创建二维数组 3 通过arange函数创建 等差数组 4 通过zeros函数创建 零矩阵 5 通过eyes函数创建 单位矩阵 数组array的访问 1 访问形状/元素个数/数据类型 2 访问一维数组的位置/范围 3 访问二维数组的位置/范围 4…

Unity Emisson 自发光属性全局照明

给想要自发光的物体&#xff0c;选择Unity自带Standard Shader。然后勾选Emisson 如下图&#xff1a; 属性&#xff1a; Color指定发光的颜色和强度。单击 Color 框可打开 HDR Color 拾色器。在此处可以更改光照的颜色和发光的强度 (Intensity)。要指定材质的哪些区域发光&…

蓝库云:让销售人员搭配客服工单系统,已成销售企业必备的组合

让销售人员搭配客服工单系统&#xff0c;已成了众多销售企业必备的组合&#xff0c;这不但可以大大提高客户满意度和转化率&#xff0c;还有效跟踪客户及时收到客户的反馈&#xff0c;从而进一步优化产品及策略。站在企业的角度来说企业也可以可以进行数据分析和优化&#xff0…

Mybaits Oracle CLob类型处理

问题描述: 使用的是Oracle 数据库, 表中有一个字段类型为clob类型 问题 : 当使用mybatis查询返回map类型时, 该字段的值为clob对象,而不是数据库里面的字符串 解决方案: 1.手动进行转换,把clob类型转换为字符串(这种比较简单) if(map.get("MAIN_BIZ") instanceo…

【Linux】iptables 防火墙(SNAT/DNAT)

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 一、SNAT 原理与应用二、SNAT转换三、DNAT的介绍1.DNAT概述2.DNAT转换前提条件 四、DNAT转换五、防火墙规则的备份和还原六、tcpdump抓包工具的运用 一、SNAT 原理与…

【Java 方法重写】@Override 注解,一般用法,重写的具体要求

&#x1f340; 博主&#xff1a;_LJaXi Or 東方幻想郷 &#x1f338; 专栏&#xff1a; Java | 从入门到入坟 从前有一只小鸟&#xff0c;它的父母都是优秀的飞行员&#xff0c;它也很想成为一名出色的飞行员。于是&#xff0c;它开始学习飞行技巧&#xff0c;不断练习&#xf…

微信支付, 小程序,公众号, 商户号 需要进行的配置

目录 一 微信公众号1.1 公众号基础信息配置1.2 白名单配置1.3 公众号开发人员配置1.4 域名授权配置1.5 服务器配置 二 微信小程序2.1 开发设置2.2 域名设置2.3 开发者管理2.4 版本管理 三 微信商户号3.1 支付服务3.2 授权域名3.3 配置API安全,支付证书申请3.4 设置支付信息3.5 …

CSDN上海城市开发者社区线下活动纪实

引言 5月27号中午&#xff0c;很高兴能和现CSDN副总裁、前微软 Azure 工程团队首席研发经理、技术畅销书《编程之美》及《构建之法》的作者邹欣邹老师&#xff0c;以及CSDN的 “上海城市开发者社区” 的部分成员齐聚一堂&#xff0c;参加CSDN上海城市开发者社区自5月初成立以来…

在windows环境下使用winsw将jar包注册为服务(实现开机自启和配置日志输出模式)

前言 Windows系统使用java -jar m命令行运行Java项目会弹出黑窗。首先容易误点导致程序关闭&#xff0c;其次我们希望能在Windows系统做到开机自动启动。因此对于SpringBoot程序&#xff0c;目前主流的方法是采用winsw&#xff0c;简单容易配置 1.下载winsw工具 https://git…

新手自媒体找素材必备的5个素材网站。

自媒体需要用到视频、音频、图片、字体等各类素材&#xff0c;对于新手朋友来说&#xff0c;网上搜素材怕侵权&#xff0c;商用素材又不知道哪里找。作为一个老手的我收藏了各类优秀的免费素材网站&#xff0c;下面分享几个&#xff0c;对你一定有帮助&#xff0c;记得收藏起来…

安科瑞预付费管理系统对于学生公寓的设计

安科瑞 徐浩竣 江苏安科瑞电器制造有限公司 zx acrelxhj 摘要&#xff1a;论文设计了适用于学生公寓的自助式预付费控电控水管理系统&#xff0c;采用多种智能功能&#xff0c;可以监测和显示漏电现象&#xff0c;通过短路、跳线、零线接地等方式防范和记录用户的偷电行为&a…

zookeeper机制及消息队列kafka

目录 一、zookeeper1、zookeeper简介2、zookeeper特点3、zookeeper工作模式及机制4、zookeeper应用场景及选举机制5、zookeeper集群部署 二、消息队列kafka1、为什么要有消息队列2、使用消息队列的好处3、kafka简介4、kafka特点5、kafka系统架构名词介绍6、Kafka架构及流程7、k…

Docker理论基础

初识Docker 1.什么是Docker 微服务虽然具备各种各样的优势&#xff0c;但服务的拆分通用给部署带来了很大的麻烦。 分布式系统中&#xff0c;依赖的组件非常多&#xff0c;不同组件之间部署时往往会产生一些冲突。 在数百上千台服务中重复部署&#xff0c;环境不一定一致&…

Docker容器核心技术:Linux命名空间Namespaces、控制组cgroups、联合文件系统UnionFS

1.容器的本质——进程 Docker 使用 Google 公司推出的 Go 语言 进行开发实现&#xff0c;基于 Linux 内核的 cgroup&#xff0c;namespace&#xff0c;以及 OverlayFS 类的 Union FS 等技术&#xff0c;对进程进行封装隔离&#xff0c;属于 操作系统层面的虚拟化技术。由于隔离…