【Springcloud篇】学习笔记六(十一、十二章):Config分布式配置中心、Bus消息总线

news2024/11/15 23:39:14

第十一章_Config分布式配置中心

1.Config分布式配置中心介绍

1.1分布式系统面临的配置问题

  • 微服务意味着要将单体应用中的业务拆分成一个个子服务,每个服务的粒度相对较小,因此系统中会出现大量的服务。由于每个服务都需要必要的配置信息才能运行,所以一套集中式的、动态的配置管理设施是必不可少的。

  • SpringCloud提供了ConfigServer来解决这个问题,我们每一个微服务自己带着一个application.yml,上百个配置文件的管理…/(ㄒoㄒ)/~~

1.2是什么

SpringCloud Config为微服务架构中的微服务提供集中化的外部配置支持,配置服务器为各个不同微服务应用的所有环境提供了一个中心化的外部配置。

image-20220322005035706

1.3怎么玩

SpringCloud Config分为 服务端客户端 两部分。

  • 服务端也称为分布式配置中心,它是一个独立的微服务应用,用来连接配置服务器并为客户端提供获取配置信息,加密/解密信息等访问接口
  • 客户端则是通过指定的配置中心来管理应用资源,以及与业务相关的配置内容,并在启动的时候从配置中心获取和加载配置信息配置服务器默认采用git来存储配置信息,这样就有助于对环境配置进行版本管理,并且可以通过git客户端工具来方便的管理和访问配置内容。

1.4能干嘛

  • 集中管理配置文件
  • 不同环境不同配置,动态化的配置更新,分环境部署比如dev/test/prod/beta/release
  • 运行期间动态调整配置,不再需要在每个服务部署的机器上编写配置文件,服务会向配置中心统一拉取配置自己的信息
  • 当配置发生变动时,服务不需要重启即可感知到配置的变化并应用新的配置
  • 将配置信息以REST接口的形式暴露:post、curl访问刷新均可…

1.5与GitHub/Gitee整合配置

由于SpringCloud Config默认使用Git来存储配置文件(也有其它方式,比如支持SVN和本地文件),但最推荐的还是Git,而且使用的是http/https访问的形式

官网:https://cloud.spring.io/spring-cloud-static/spring-cloud-config/2.2.1.RELEASE/reference/html/

2.Config配置总控中心搭建

2.1服务端远程仓库配置

用你自己的账号在Gitee上新建一个名为springcloud-config的新Repository

地址:https://gitee.com/linhaipengg/springcloud-config.git

在仓库下新建三个文件

image-20230922173349524

2.2配置模块cloud-config-center-3344

新建Module模块cloud-config-center-3344,它即为Cloud的配置中心模块

(1)pom
	<dependencies>

        <!-- config Server -->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-config-server</artifactId>
        </dependency>

        <!--eureka-client config Server也要注册进服务中心-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-devtools</artifactId>
            <scope>runtime</scope>
            <optional>true</optional>
        </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><!-- 引入自己定义的api通用包,可以使用Payment支付Entity -->
            <groupId>springcloud</groupId>
            <artifactId>cloud-api-commons</artifactId>
            <version>${project.version}</version>
        </dependency>
    </dependencies>
(2)yml

image-20230922173618545

(3)主启动类

image-20230922173646368

(4)测试

image-20230922173658770

2.3文件命名规则

{application} 是应用名称,对应到配置文件上来,就是配置文件的名称部分。

{profile} 是配置文件的版本,我们的项目有开发版本、测试环境版本、生产环境版本

对应到配置文件上来就是以 application-{profile}.yml 加以区分,

例如application-dev.yml,application-prod.yml。

2.4文件访问规则

image-20230922173917374

3.Config客户端配置与测试

3.1搭建Config客户端模块3355

(1)pom
	<dependencies>
        <!-- config Client 和 服务端的依赖不一样 -->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-config</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-actuator</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-devtools</artifactId>
            <scope>runtime</scope>
            <optional>true</optional>
        </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>
            <!-- 引入自己定义的api通用包 -->
        </dependency>
        <dependency>
            <groupId>springcloud</groupId>
            <artifactId>cloud-api-commons</artifactId>
            <version>${project.version}</version>
        </dependency>
    </dependencies>
(2)bootstrap.yml
  • appllication.yml是用户级的资源配置项
  • bootstrap.yml是系统级的,优先级更加高

SpringCloud会创建一个"Bootstrap Context"作为Spring应用的ApplicationContext的父上下文。

初始化的时候,Bootstrap Context负责从外部源加载配置属性并解析配置。这两个上下文共享一个从外部获取的Environment。

Bootstrap 属性有高优先级,默认情况下,它们不会被本地配置覆盖。BootstrapContext和ApplicationContext、有着不同的约定,所以新增了一个bootstrap.yml文件,保证BootstrapContext和ApplicationContext配置的分离。

image-20230922181325357

(3)主启动类

image-20230922181333932

(4)controller层

image-20230922181344752

(5)测试

image-20230922181355983

3.2修改远程仓库配置文件内容

直接在gitee官网进行修改

  • 修改前:

    image-20230922181830216

  • 修改后:

image-20230922181857541

(1)观察3344_发生改变

image-20230922181914526

(2)观察3355_没有改变

image-20230922181932035

(3)存在的问题

当远程仓库配置文件被修改后,3344和3355都要变,3344变了,但是3355必须要重启才可以更新。

4.Config客户端之动态刷新

避免每次更新配置都要重启客户端微服务3355,我们需要它能动态刷新,下面来修改3355模块

4.1修改3355模块

(1)pom引入actuator监控

image-20230922182209927

(2)修改yml,暴露监控端口

image-20230922182238470

说明:因为==手动刷新需要自己调用一个类似于健康检查的端点(接口)==,所以呢,我们需要把这个端点给暴露出来,以便外部可访问

(3)Controller类添加@RefreshScope
(4)继续修改远程仓库的配置文件

image-20230922182535822

(5)运维人员发送Post请求刷新3355

image-20230922183338793

(6)查看3355查的数据是否发生变化

image-20230922183226267

4.2思考存在的问题

想想还有什么问题?

  • 假如有多个微服务客户端3355/3366/3377…,每个微服务都要执行一次post请求,手动刷新?
  • 可否广播,一次通知,处处生效?
  • 我们想大范围的自动刷新,求方法,定点刷新

于是就有下面的消息总线!

第十二章_Bus消息总线

1.SpringCloud Bus介绍

1.1消息总线的由来

回顾上一篇文章 Config分布式配置中心存在的问题

  • 假如有多个微服务客户端3355/3366/3377…,每个微服务都要执行一次post请求,手动刷新?
  • 可否广播,一次通知,处处生效?
  • 我们想大范围的自动刷新,求方法

以上就是消息总线的产生由来

Spring Cloud Bus 配合 Spring Cloud Config 使用可以实现配置的动态刷新

1.2bus是什么

image-20230923102424736

Spring Cloud Bus是用来==将分布式系统的节点与轻量级消息系统链接起来==的框架,它整合了Java的事件处理机制和消息中间件的功能。

Spring Cloud Bus目前支持RabbitMQ和Kafka。

1.3bus能干嘛

Spring Cloud Bus能管理和传播分布式系统间的消息,就像一个分布式执行器,可用于广播状态更改、事件推送等,也可以当作微服务间的通信通道。

image-20230923102517535

1.4总线

(1)什么是总线

在微服务架构的系统中,通常会使用轻量级的消息代理来构建一个共用的消息主题,并让系统中所有微服务实例都连接上来。由于==该主题中产生的消息会被所有实例监听和消费==,所以称它为消息总线。

在总线上的各个实例,都可以方便地广播一些需要让其他连接在该主题上的实例都知道的消息。

(2)基本原理

ConfigClient实例都监听MQ中同一个topic(默认是springCloudBus)。当一个服务刷新数据的时候,它会把这个信息放入到Topic中,这样其它监听同一Topic的服务就能得到通知,然后去更新自身的配置

2.RabbitMQ环境搭建

注意Erlang和RabbitMQ的版本要适应

2.1安装Erlang

下载地址:http://erlang.org/download/otp_win64_21.3.exe

2.2安装RabbitMQ

下载地址:Release RabbitMQ 3.7.14 · rabbitmq/rabbitmq-server (github.com)

image-20230923102843290

  • 进入RabbitMQ安装目录下的sbin目录,输入以下命令启动管理功能

    image-20230923102958908

  • 启动RabbitMQ,发现闪退

    image-20230923103043509

2.3解决闪退

image-20230923103131267

访问地址查看是否安装成功:http://localhost:15672/

输入账号密码并登录:guest guest

image-20230923103212467

3.动态刷新全局广播

3.1搭建客户端微服务3306

(1)pom
	<dependencies>
        <!-- config Client 和 服务端的依赖不一样 -->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-config</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-actuator</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-devtools</artifactId>
            <scope>runtime</scope>
            <optional>true</optional>
        </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><!-- 引入自己定义的api通用包,可以使用Payment支付Entity -->
            <groupId>springcloud</groupId>
            <artifactId>cloud-api-commons</artifactId>
            <version>${project.version}</version>
        </dependency>
    </dependencies>

(2)yml

image-20230923104251043

(3)主启动

image-20230923104320120

(4)业务类

image-20230923104330212

3.2设计思想

(1)消息总线触发客户端

利用消息总线触发一个客户端/bus/refresh,而刷新所有客户端的配置

image-20230923104523160

(2)消息总线触发服务端

利用消息总线触发一个服务端ConfigServer的/bus/refresh端点,而刷新所有客户端的配置

image-20230923104548465

图二的架构显然更加适合,图一不适合的原因如下:

  • 打破了微服务的职责单一性,因为微服务本身是业务模块,它本不应该承担配置刷新的职责。
  • 破坏了微服务各节点的对等性
  • 有一定的局限性。例如,微服务在迁移时,它的网络地址常常会发生变化,此时如果想要做到自动刷新,那就会增加更多的修改

3.3配置中心3344添加消息总线支持

(1)pom添加消息总线支持
<!--添加消息总线RabbitMQ支持-->
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-bus-amqp</artifactId>
</dependency>
(2)yml配置rabbitmq并暴露端点
spring:
#rabbitmq相关配置 15672是Web管理界面的端口;5672是MQ访问的端口
  rabbitmq:
    host: 192.168.16.106
    port: 5672
    username: guest
    password: guest
 
# 暴露bus刷新配置的端点 actuator刷新配置
management:
  endpoints:
    web:
      exposure:
        include: 'bus-refresh' #Post /bus/refresh 官网架构图

说明:

因为手动刷新需要自己调用一个类似于健康检查的端点(接口),所以呢,我们需要把这个端点给暴露出来,以便外部可访问。

3.4客户端3355、3366添加消息总线支持

(1)pom添加消息总线支持
<!--添加消息总线RabbitMQ支持-->
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-bus-amqp</artifactId>
</dependency>
(2)yml添加rabbit相关配置
spring:
  #rabbitmq相关配置 15672是Web管理界面的端口;5672是MQ访问的端口
  rabbitmq:
    host: localhost
    port: 5672
    username: guest
    password: guest

3.5测试

修改Gitee上配置文件增加版本号

使用cmd发送POST请求

curl -X POST "http://localhost:3344/actuator/bus-refresh"

测试结果:一次修改,广播通知,处处生效

4.动态刷新定点通知

不想全部通知,只想定点通知:只通知3355,不通知3366

简单一句话:指定具体某一个实例生效而不是全部

公式:

http://localhost:配置中心的端口号/actuator/bus-refresh/{destination}

/bus-refresh请求不再发送到具体的服务实例上,而是发给config server并通过destination参数类指定需要更新配置的服务或实例

  • 案例:

    我们这里以刷新运行在3355端口上的config-client为例:只通知3355,不通知3366

curl -X POST "http://localhost:3344/actuator/bus-refresh/config-client:3355"

image-20230923110311496

5.总结

image-20230923110334015

6.Springboot Actuator的说明

6.1是什么

监控中心是针对微服务期间

  • 查看服务器内存变化(对内存,线程,日志管理等)
  • 检测服务配置连接池地址是否可用(模拟访问,懒加载)
  • 统计现在有多个bean(是Spring容器中的bean)
  • 统计SpringMVC@RequestMapping(统计http接口)

使用Actuator来查看这些信息,它是没有界面的返回的是json格式的数据

AdminUi底层使用的是Actuator实现的,只不过给它加了个可视化界面

6.2应用场景

用在生产环境

使用它的原因:它是springboot的一个附加功能,可帮助你在应用程序生产环境时监控和管理应用程序,可使用Http的各种请求来监管,审计,收集应用的运行情况,特别对于微服务管理十分有意义。

建议使用springboot2.0.5,因为它里面返回的信息更加全面。

springboot 提供了对项目的监控功能。

6.3如何使用

(1)导入依赖
<dependency>
   <groupId>org.springframework.boot</groupId>
   <artifactId>spring-boot-starter-actuator</artifactId>
   <version>2.1.3.RELEASE</version>
</dependency>
(2)配置端点

在application.properties中配置端点,

暴露部分端点
 
management.endpoints.web.exposure.include=info,health,beans,env
 
暴露所有端点
 
management.endpoints.web.exposure.include=*
 
不暴露beans端点
 
management.endpoints.web.exposure.exclude=beans

在上述配置中,首先使用 management.endpoints.web.exposure.include 暴露所有的端点,接着使用management.endpoints.web.exposure.exclud 排除 beans 端点,这样就能够暴露除 beans 外的所有 actuator端点了。

(3)浏览器访问

例如:

http://127.0.0.1:8080/actuator/health

访问项目监控需要加前缀 /actuator

(4)端点说明

image-20230923110950956

6.4总结

上面利用SpringCloud Config刷新客户端配置,以及消息总线触发服务端ConfigServer的/bus-refresh端点,而刷新所有客户端的配置,利用的就是actuator刷新配置文件。

因为手动刷新需要自己调用一个类似于健康检查的端点(接口),所以呢,我们需要把这个端点给暴露出来,以便外部可访问。

刷新客户端:

curl -X POST "http://localhost:3355/actuator/refresh"

刷新服务端:

curl -X POST "http://localhost:3355/actuator/refresh"

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

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

相关文章

图论练习2

内容&#xff1a;路径计数DP&#xff0c;差分约束 最短路计数 题目大意 给一个个点条边的无向无权图&#xff0c;问从出发到其他每个点的最短路有多少条有自环和重边&#xff0c;对答案 解题思路 设边权为1&#xff0c;跑最短路 表示的路径数自环和重边不影…

Blender教程(基础)-面的切割-10

快捷键K切割&#xff0c;菜单选项切割. 一、随意切割 物体在编辑模式下&#xff0c;按键盘K建切割物体。 二、中点切割 先按K键&#xff0c;再按shift键&#xff0c;会自动吸附到每条边的中点进行切割。 三、取消吸附 切割时会自动吸附到顶点或边 关闭快速吸附 按K键再按…

山东淄博刑侦大队利用无人机抓获盗窃团伙

山东淄博刑侦大队利用无人机抓获盗窃团伙 近期&#xff0c;山东淄博临淄区发生多起盗窃案件。通过视频追踪和调查访问&#xff0c;推断临淄区某村可能为嫌疑人藏匿地点。刑侦大队无人机应急小组迅速到达现场&#xff0c;经无人机高空侦查&#xff0c;发现并锁定了嫌疑人的藏匿…

PHP入门指南:API

PHP入门指南&#xff1a;API 1. 简介2. API的基础概念2.1 什么是API&#xff1f;2.2 API的类型2.3 API的作用2.4 RESTful API2.5 API的基本构成元素 3. PHP与API的交互基础3.1 发送HTTP请求3.2 处理HTTP响应3.3 异常处理3.4 确保安全性 4. 如何在PHP中创建一个简单的API4.1 设计…

【数据分享】1929-2023年全球站点的逐月降雪深度数据(Shp\Excel\免费获取)

气象数据是在各项研究中都经常使用的数据&#xff0c;气象指标包括气温、风速、降水、能见度等指标&#xff0c;说到气象数据&#xff0c;最详细的气象数据是具体到气象监测站点的数据&#xff01; 之前我们分享过1929-2023年全球气象站点的逐月平均气温数据、逐月最高气温数据…

笔记---容斥原理

AcWing,890.能被整除的数 给定一个整数 n n n 和 m m m 个不同的质数 p 1 , p 2 , … , p m p_{1},p_{2},…,p_{m} p1​,p2​,…,pm​。 请你求出 1 ∼ n 1∼n 1∼n 中能被 p 1 , p 2 , … , p m p_{1},p_{2},…,p_{m} p1​,p2​,…,pm​ 中的至少一个数整除的整数有多少…

起心动念 | 生成式 AI 开发实践系列的开端

生成式 AI 和大模型的技术变革力量&#xff0c;正在逐渐影响着我们当下这个时代&#xff0c;全球各行各业都呈现百舸争流、万象更新的趋势。在 2023 年&#xff0c;我们通过各种面向开发者的活动&#xff0c;收集到了大量开发者关于基于生成式 AI 的开发内容需求和建议反馈。开…

免费CRM管理系统哪家好?如何选择?

免费的CRM系统有很多&#xff0c;以下是一些比较常见的&#xff1a;一、Zoho CRM&#xff1b;二、HubSpot CRM&#xff1b;三、Bitrix24&#xff1b;四、SuiteCRM&#xff1b;五、Agile CRM&#xff1b;六、Capsule CRM&#xff1b;七、Insightly。免费的CRM系统虽然功能相对较…

爬虫-网络空间微博信息管理系统的设计与实现-计算机毕业设计源码85633

摘 要 本论文主要论述了如何使用django框架开发一个网络空间微博管理信息系统&#xff0c;本系统将严格按照软件开发流程进行各个阶段的工作&#xff0c;面向对象编程思想进行项目开发。在引言中&#xff0c;作者将论述该系统的当前背景以及系统开发的目的&#xff0c;后续章节…

(每日持续更新)jdk api之ObjectInput基础、应用、实战

博主18年的互联网软件开发经验&#xff0c;从一名程序员小白逐步成为了一名架构师&#xff0c;我想通过平台将经验分享给大家&#xff0c;因此博主每天会在各个大牛网站点赞量超高的博客等寻找该技术栈的资料结合自己的经验&#xff0c;晚上进行用心精简、整理、总结、定稿&…

11. Threejs案例-绘制网格状圆环扭结

11. Threejs案例-绘制网格状圆环扭结 实现效果 知识点 TorusKnotGeometry (圆环缓冲扭结几何体) 创建一个圆环扭结&#xff0c;其特殊形状由一对互质的整数&#xff0c;p 和 q 所定义。如果 p 和 q 不互质&#xff0c;创建出来的几何体将是一个环面链接。 构造器 TorusKno…

解锁MyBatis Plus的强大功能:学习高级操作与DML技巧!

MyBatisPlus 1&#xff0c;DML编程控制1.1 id生成策略控制知识点1&#xff1a;TableId1.1.1 环境构建1.1.2 代码演示AUTO策略步骤1:设置生成策略为AUTO步骤3:运行新增方法 INPUT策略步骤1:设置生成策略为INPUT步骤2:添加数据手动设置ID步骤3:运行新增方法 ASSIGN_ID策略步骤1:设…

12种算法优化CNN-BiLSTM-Attention多特征输入单步预测,机器学习预测全家桶,持续更新,MATLAB代码...

截止到本期&#xff0c;一共发了12篇关于机器学习预测全家桶MATLAB代码的文章。参考文章如下&#xff1a; 1.五花八门的机器学习预测&#xff1f;一篇搞定不行吗&#xff1f; 2.机器学习预测全家桶&#xff0c;多步预测之BiGRU、BiLSTM、GRU、LSTM&#xff0c;LSSVM、TCN、CNN&…

leetcode正则表达式匹配问题(困难)

1.题目描述 2.解题思路&#xff0c;这道题自己没做出来&#xff0c;看了官方的题解&#xff0c;感觉对自己来说确实是比较难想的。使用了动态规划的解决方案&#xff0c;这种方案看题解都不一定能看明白&#xff0c;不过有个评论画图讲解的非常明白。其实仔细看题解的话&#…

Vue服务端渲染

Vue服务端渲染 一、服务端渲染基础 1、概述 我们现在可以使用Vue,React等开发SPA单页面应用&#xff0c;单页面应用的优点&#xff0c;用户体验好&#xff0c;开发效率高&#xff0c;可维护性好等。 缺点&#xff1a;首屏渲染时间长&#xff08;在客户端通过JS来生成html来…

ios搭建OpenGL环境

前言 本篇文章介绍在ios搭建OpenGL开发环境 在app的启动文章中&#xff0c;讲述了一个ios应用是如何启动的以及在IOS 13之后苹果公司推出的多窗口功能&#xff0c;通过app的启动这篇文章&#xff0c;我们基本能随心所欲的搭建一个app应用环境&#xff0c;搭建完成后的基本文件…

Vim工具使用全攻略:从入门到精通

引言 在软件开发的世界里&#xff0c;Vim不仅仅是一个文本编辑器&#xff0c;它是一个让你的编程效率倍增的神器。然而&#xff0c;对于新手来说&#xff0c;Vim的学习曲线似乎有些陡峭。本文将手把手教你如何从Vim的新手逐渐变为高手&#xff0c;深入理解Vim的操作模式&#…

高级编程 (1)

Linux软件编程: 1.Linux: 操作系统的内核 1.管理CPU 2.管理内存 3.管理硬件设备 4.管理文件系统 5.任务调度 2.Shell: 1.保护Linux内核(用户和Linux内核不直接操作,通过操作Shell,Shell和内核交互) 2.命令解释器 3.Shell命令: …

快速理解复杂系统组成学习内容整合

目录 一、复杂系统组成 二、接入系统 (Access System) 三、应用系统 (Application System) 四、基础平台 (Foundation Platform) 五、中间件 (Abundant External Middleware) 六、支撑系统 (Supporting System) 参考文章 一、复杂系统组成 复杂系统是由多个相互关联、相…

【c++】vector用法详解

vector用法详解 vector定义vector容器的构造函数vector容器内元素的访问1.通过下标 [ ]来访问2.通过迭代器来访问3.通过范围for来访问 vector常用函数的用法解析1.size()2.clear()3.capacity()4.reserve()5.resize()6.shrink_to_fit()7.pop_back()8.push_back()9.erase()10.in…