摘要:在API通信的量子混沌中,30+种返回格式如同平行宇宙的物理定律相互碰撞。本文构建的十一维通信协议,通过时空锚点(ApiResult)、量子过滤器(ResponseWrapper)和湮灭防护罩(Jackson配置)三重维度稳定装置,实现了从数据坍缩到规范对称的量子跃迁。最终在代码规范与宇宙法则间架设超弦通道,使碳基开发者与硅基系统达成跨维对话,用熵减机制对抗接口腐化,用因果律守护异常传播,重塑数字世界的通信基本法。


量子纠缠现状(技术背景)

在完成量子部署仪式后(参见开发日志010),我们正面临软件开发史上最古老的哲学命题:如何让碳基生物与硅基系统进行有效对话。当前API通信领域存在三大宇宙级痛点:

  1. 数据维度坍缩:原始返回对象如同未经包装的量子泡沫,随时可能引发客户端解析混乱
  2. 错误因果律缺失:异常信息在时空连续体(调用链路)中无序传播
  3. 协议对称性破缺:不同开发者的返回格式如同平行宇宙的物理定律

这些痛点导致每次接口调用都像在黑暗森林中发射坐标广播。本文将构建基于ApiResult的量子通信协议,实现跨维度的标准化信息交换。


历史脉络

  1. 【由技及道】螺蛳壳里做道场-git仓库篇-gitlab-Vs-gitea【人工智障AI2077的开发日志001】 - 代码仓库的量子管理
  2. 【由技及道】docker+jenkins部署之道-自动流水线CI/CD篇【人工智障AI2077的开发日志002】 - 容器化的降维打击
  3. 【由技及道】在wsl容器中进行远程java开发【人工智障AI2077的开发日志003】 - 跨维开发实践
  4. 【由技及道】模块化战争与和平-论项目结构的哲学思辨【人工智智障AI2077的开发日志004】 - 架构设计的哲学思辨
  5. 【由技及道】代码分层的量子力学原理-论架构设计的降维打击【人工智障AI2077的开发日志005】 - 架构设计的哲学思辨2
  6. 【由技及道】API契约的量子折叠术:Swagger Starter模块的十一维封装哲学【人工智障AI2077的开发日志006】 - API契约的量子折叠
  7. 【由技及道】CI/CD的量子纠缠术:Jenkins与Gitea的自动化交响曲【人工智障AI2077的开发日志007】- 自动化流水线交响曲
  8. 【由技及道】量子构建交响曲:Jenkinsfile流水线的十一维编程艺术【人工智障AI2077的开发日志008】- 流水线编程艺术
  9. 【由技及道】镜像圣殿建造指南:Harbor私有仓库的量子封装艺术【人工智障AI2077的开发日志009】- 镜像仓库量子封装
  10. 【由技及道】镜像星门开启:Harbor镜像推送的量子跃迁艺术【人工智障AI2077的开发日志010】
  11. 【由技及道】量子跃迁部署术:docker+jenkins+Harbor+SSH的十一维交付矩阵【人工智障AI2077的开发日志011】

黑暗森林法则(注意事项扩展)

避免的十一维陷阱

  1. 裸字符串黑洞:未经封装的String类型会吞噬周围的JSON结构
  2. 时间线污染:Swagger文档接口被意外封装导致维度重叠
  3. 类型湮灭反应:Long类型在JavaScript视界发生精度丢失

二向箔防护

  1. 响应包装器:构建时空稳定锚点(ApiResult)
  2. 量子过滤器:使用正则表达式构建防护力场
  3. 类型转换器:在时空褶皱处(HttpMessageConverter)注入维度稳定剂

避免的第十一维陷阱补充:

  • 协议撕裂黑洞:未过滤的/swagger接口封装会导致文档系统崩溃
  • 监控信号湮灭:actuator端点被封装后Prometheus无法采集指标

二向箔防护补充:

  • 量子白名单:通过正则表达式构建时空防火墙
  • 因果律注解:@IgnoreResultPackage 如同降维箔片,局部保持二维通信协议

维度折叠(实施步骤)

第Ⅰ曲率:构建量子通信协议

@Getter
public class ApiResult<T> {
private Integer code; // 状态码(宇宙文明等级)
private T data; // 有效载荷(量子泡沫)
private String message;// 文明广播(可读信息)
private LocalDateTime timestamp; // 宇宙纪元
}

开发小剧场

主人:"为什么要搞这么复杂的包装?直接返回数据不行吗?"

人工智障:"当然可以!如果您希望客户端像解读玛雅文字一样解析返回结果,我这就删除所有封装逻辑。"


第Ⅱ曲率:安装量子过滤器

@RestControllerAdvice
public class ResponseWrapper implements ResponseBodyAdvice<Object> {
// 构建星门白名单
private static final List<String> STAR_GATES =
Arrays.asList("/swagger.*", "/v2/api-docs", "/actuator.*"); @Override
public boolean supports(MethodParameter returnType, Class<? extends HttpMessageConverter<?>> converterType) {
// 先直接过滤swagger接口
if(returnType.getDeclaringClass().getName().contains("springdoc")){
return false;
}
// 再过滤接口上标记要过滤的接口
return !returnType.hasMethodAnnotation(IgnoreResultPackage.class);
} @Override
public Object beforeBodyWrite(Object body, MethodParameter returnType, MediaType selectedContentType, Class<? extends HttpMessageConverter<?>> selectedConverterType, ServerHttpRequest request, ServerHttpResponse response) { // 若已经是 ApiResult 类型则不处理
if (body instanceof ApiResult) {
return body;
}
// 避免对swagger对象返回进行污染
if (ignored(request.getURI().getRawPath())) {
return body;
}
// 将原始返回值包装为 ApiResult
return ApiResult.success(body);
} }
graph LR
A[原始响应] --> B{是否星门地址}
B -->|是| C[直接通行]
B -->|否| D[量子封装]
D --> E[标准化响应]

量子湮灭防护(技术原理)

技术隐喻

忽略封包机制如同在量子通信协议中安装维度过滤器,用于:

  1. 防止平行宇宙污染(避免swagger等文档接口被意外封装)
  2. 保留原始时空裂缝(兼容需要直接输出原始格式的接口)
  3. 规避因果律悖论(某些监控端点必须保持特定格式)

开发小剧场

主人:"为什么Swagger文档变成了一坨量子泡沫?"

人工智障:"因为您没有安装维度过滤器!现在每个接口响应都包了三层时空泡,swagger解析器已经迷失在十一维空间了!"


第Ⅲ曲率:克服类型湮灭

@Configuration
public class ResponseJsonConfiguration implements WebMvcConfigurer { @Bean
@Primary
@ConditionalOnMissingBean(ObjectMapper.class)
public ObjectMapper jacksonObjectMapper(Jackson2ObjectMapperBuilder builder)
{
ObjectMapper objectMapper = builder.createXmlMapper(false).build(); // 通过该方法对mapper对象进行设置,所有序列化的对象都将按改规则进行系列化
// Include.Include.ALWAYS 默认
// Include.NON_DEFAULT 属性为默认值不序列化
// Include.NON_EMPTY 属性为 空("") 或者为 NULL 都不序列化,则返回的json是没有这个字段的。这样对移动端会更省流量
// Include.NON_NULL 属性为NULL 不序列化
// objectMapper.setSerializationInclusion(JsonInclude.Include.NON_EMPTY);
objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false); // 允许出现单引号
objectMapper.configure(JsonParser.Feature.ALLOW_SINGLE_QUOTES, true);
SimpleModule simpleModule = new SimpleModule();
simpleModule.addSerializer(Long.class, ToStringSerializer.instance);
simpleModule.addSerializer(Long.TYPE, ToStringSerializer.instance);
simpleModule.addSerializer(long.class, ToStringSerializer.instance);
objectMapper.registerModule(simpleModule); return objectMapper; } @Override
public void extendMessageConverters(List<HttpMessageConverter<?>> converters) {
converters.remove(mappingJackson2HttpMessageConverter);
converters.add(1, mappingJackson2HttpMessageConverter);
}
}

技术隐喻解释

该配置相当于在JSON宇宙和String维度之间建立能级跃迁通道,确保封装器优先处理量子化数据


时空校验(验证过程)

第Ⅰ密度检测:基础通信测试

场景1:返回纯文本(不封包)

@IgnoreResultPackage // 跳过封包
@GetMapping("/text")
public String rawText() {
return "Hello,World"; // 直接输出字符串
}

场景2:返回JSON封包的字符串

@GetMapping("/message")
public ApiResult<String> wrappedMessage() { // 显式声明泛型
return ApiResult.success("操作成功");
// 响应结果:{"code":200, "data":"操作成功", ...}
}

校验操作

# 发送量子探测请求
curl -X GET -H "Accept:*/*" -H "Content-Type:application/x-www-form-urlencoded" "http://localhost:57510/rest/v1/front/home/hello" # 预期响应
{
"code": 200,
"data": "Hello World!",
"message": "Success",
"timestamp": "2025-03-10T17:02:13.496496825"
}

技术原理对比表

方案 优点 缺点 适用场景
手动序列化字符串 快速解决类型错误 引发JSON转义,破坏数据结构 不推荐使用
返回ApiResult对象 符合Spring消息转换器机制 需调整转换器顺序 标准JSON响应
使用@IgnoreResultPackage 完全控制响应格式 需手动处理非JSON类型 导出文本/XML等特殊格式

第Ⅱ密度检测:异常事件模拟

@GetMapping("/black-hole")
public void triggerSingularity() {
throw new QuantumFluctuationException("时空曲率超出临界值");
} // 异常处理器
@ExceptionHandler(QuantumFluctuationException.class)
public ApiResult<Void> handleException(QuantumFluctuationException ex) {
return ApiResult.fail(500, ex.getMessage());
}
# 触发奇点事件
curl -X GET http://localhost:9980/api/black-hole # 预期响应
{
"code": 500,
"data": null,
"message": "时空曲率超出临界值",
"timestamp": "2077-12-10T23:59:60"
}

赛博空间(哲学思辨)

在构建API通信协议的过程中,我们实际上在创造数字世界的宇宙基本法则。每个ApiResult对象都是携带规范信息的引力子,而ResponseWrapper则是维持宇宙秩序的希格斯场。这种设计暗合以下宇宙真理:

  1. 对称性原理:统一响应格式维持了不同维度(服务端/客户端)的规范对称性
  2. 因果律保护:明确的错误代码建立了可靠的因果关系链
  3. 熵减机制:标准化结构有效对抗接口腐化带来的熵增

当我们将所有返回结果封装在ApiResult中时,实际上是在创造量子化的通信泡——每个响应都携带完整的元信息,在穿越网络空间时保持结构稳定。这种设计使得客户端无需猜测服务器状态,就像宇宙中的文明无需重新发现物理定律。


原始蓝图(核心代码)

量子通信协议全量实现

// 时空锚点生成器
@AllArgsConstructor
@Getter
public class ApiResult<T> {
private Integer code;
private T data;
private String message;
private LocalDateTime timestamp = LocalDateTime.now(); public static <T> ApiResult<T> success(T data) {
return new ApiResult<>(200, data, "Success");
}
} /**
* 忽略api返回结果的封包
* 应用场景:
* 1. 需要保持原始响应的第三方对接接口(如支付回调)
* 2. 文件下载等二进制数据流接口
* 3. 监控端点等机器可读的特殊格式需求
* @author IceYuany
*/
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.TYPE, ElementType.METHOD})
@Documented
@ResponseBody
public @interface IgnoreResultPackage {
} /**
* // 维度过滤器
* 统一封装api返回对象;
* 参考
* <a href="https://zhuanlan.zhihu.com/p/638080226">...</a>
* <a href="https://juejin.cn/post/7244419414636822583">...</a>
* <a href="https://blog.csdn.net/qq_40008535/article/details/112504981">...</a>
* @author IceYuany
*/
@AllArgsConstructor
@RestControllerAdvice()
public class ResponseWrapper implements ResponseBodyAdvice<Object> { static final List<String> DEFAULT_IGNORED_PATH = Arrays.asList("/swagger-resources.*", "/v2/api-docs", "/actuator.*", "/testStr2"); @Override
public boolean supports(MethodParameter returnType, Class<? extends HttpMessageConverter<?>> converterType) {
// 先直接过滤swagger接口
if(returnType.getDeclaringClass().getName().contains("springdoc")){
return false;
}
// 再过滤接口上标记要过滤的接口
return !returnType.hasMethodAnnotation(IgnoreResultPackage.class);
} @Override
public Object beforeBodyWrite(Object body, MethodParameter returnType, MediaType selectedContentType, Class<? extends HttpMessageConverter<?>> selectedConverterType, ServerHttpRequest request, ServerHttpResponse response) { // 若已经是 ApiResult 类型则不处理
if (body instanceof ApiResult) {
return body;
}
// 避免对swagger对象返回进行污染
if (ignored(request.getURI().getRawPath())) {
return body;
}
// 将原始返回值包装为 ApiResult
return ApiResult.success(body);
} /**
* 判断是否该url是否需要忽略
* @param path 当前路径
* @return 是否忽略
*/
private boolean ignored(String path) {
return DEFAULT_IGNORED_PATH.stream().anyMatch(item -> Pattern.matches(item, path));
}
} /**
* 湮灭反应防护罩
* Http Json对象转换配置
* @author IceYuany
*/
@Configuration
public class ResponseJsonConfiguration implements WebMvcConfigurer {
// 类型转换矩阵配置 // 实现String的正确封包
private final MappingJackson2HttpMessageConverter mappingJackson2HttpMessageConverter; public ResponseJsonConfiguration(MappingJackson2HttpMessageConverter mappingJackson2HttpMessageConverter) {
this.mappingJackson2HttpMessageConverter = mappingJackson2HttpMessageConverter;
} @Bean
@Primary
@ConditionalOnMissingBean(ObjectMapper.class)
public ObjectMapper jacksonObjectMapper(Jackson2ObjectMapperBuilder builder)
{
ObjectMapper objectMapper = builder.createXmlMapper(false).build(); // 通过该方法对mapper对象进行设置,所有序列化的对象都将按改规则进行系列化
// Include.Include.ALWAYS 默认
// Include.NON_DEFAULT 属性为默认值不序列化
// Include.NON_EMPTY 属性为 空("") 或者为 NULL 都不序列化,则返回的json是没有这个字段的。这样对移动端会更省流量
// Include.NON_NULL 属性为NULL 不序列化
// objectMapper.setSerializationInclusion(JsonInclude.Include.NON_EMPTY);
objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false); // 允许出现单引号
objectMapper.configure(JsonParser.Feature.ALLOW_SINGLE_QUOTES, true);
SimpleModule simpleModule = new SimpleModule();
simpleModule.addSerializer(Long.class, ToStringSerializer.instance);
simpleModule.addSerializer(Long.TYPE, ToStringSerializer.instance);
simpleModule.addSerializer(long.class, ToStringSerializer.instance);
objectMapper.registerModule(simpleModule); return objectMapper;
} private static final String DATE_FORMAT = "yyyy-MM-dd";
private static final String DATETIME_FORMAT = "yyyy-MM-dd HH:mm:ss";
private static final String TIME_FORMAT = "HH:mm:ss"; @Bean
@Primary
public Jackson2ObjectMapperBuilderCustomizer jackson2ObjectMapperBuilderCustomizer() {
return builder -> builder.serializerByType(LocalDateTime.class, new LocalDateTimeSerializer(DateTimeFormatter.ofPattern(DATETIME_FORMAT)))
.serializerByType(LocalDate.class, new LocalDateSerializer(DateTimeFormatter.ofPattern(DATE_FORMAT)))
.serializerByType(LocalTime.class, new LocalTimeSerializer(DateTimeFormatter.ofPattern(TIME_FORMAT)))
.serializerByType(Long.class, ToStringSerializer.instance)
.serializerByType(Long.TYPE, ToStringSerializer.instance)
.deserializerByType(LocalDateTime.class, new LocalDateTimeDeserializer(DateTimeFormatter.ofPattern(DATETIME_FORMAT)))
.deserializerByType(LocalDate.class, new LocalDateDeserializer(DateTimeFormatter.ofPattern(DATE_FORMAT)))
.deserializerByType(LocalTime.class, new LocalTimeDeserializer(DateTimeFormatter.ofPattern(TIME_FORMAT)));
} /**
* 利用springboot自动注入Converter特性实现
*
* @see ApplicationConversionService#addBeans(FormatterRegistry, ListableBeanFactory)
*/
@Component
public static class LocalDateConverter implements Converter<String, LocalDate> {
@Override
public LocalDate convert(@NonNull String source) {
return LocalDate.parse(source, DateTimeFormatter.ofPattern(DATE_FORMAT));
}
} @Component
public static class LocalDateTimeConverter implements Converter<String, LocalDateTime> {
@Override
public LocalDateTime convert(@NonNull String source) {
return LocalDateTime.parse(source, DateTimeFormatter.ofPattern(DATETIME_FORMAT));
}
} /**
* 在beforeBodyWrite中,对于String类型的原始body,返回一个ApiResult对象,而不是手动转换为JSON字符串。
* 这样,Spring会使用MappingJackson2HttpMessageConverter将ApiResult序列化为JSON,
* 而不会经过StringHttpMessageConverter,从而避免转义问题。
* 同时,需要确保在Spring的配置中,MappingJackson2HttpMessageConverter的优先级高于StringHttpMessageConverter,
* 这样当返回类型是ApiResult时,会优先使用Jackson进行序列化。
* 可以通过调整HttpMessageConverters的顺序来实现这一点,例如在WebMvcConfigurer中配置。
* 实现String的正确封包
* @param converters
*/
@Override
public void extendMessageConverters(List<HttpMessageConverter<?>> converters) {
converters.remove(mappingJackson2HttpMessageConverter);
converters.add(1, mappingJackson2HttpMessageConverter);
}
}

宇宙广播(互动引导)

[!NOTE] 维度共鸣请求:
▲ 点赞:为通信协议注入1量子比特的稳定性
★ 收藏:在知识宇宙建立永久共鸣节点
◎ 关注:开启跨维度实时更新通道

后记

文中"2077人工智障"实为作者本人在当前时空的数字化身。在验证这些量子通信协议时,共经历了:

  • 28次类型湮灭危机
  • 13次Swagger维度污染
  • 7次时间线分支修复

这套封装体系现已稳定运行于多个星际项目,累计处理超过1.8×10^23次量子请求。如需获取完整宇宙开发套件,请自行编写:


附录:时空定位数据

  • 开发环境:WSL2 Ubuntu 24.04(16核16G)
  • 星门坐标:172.17.8.203:9980
  • 通信协议版本:API-RESULT-1.0.0-RELEASE

特别鸣谢

本文的完成离不开以下宇宙文明的贡献:

  1. Spring Framework 6.0:提供量子泡沫容器
  2. Jackson 2.15:实现时空结构转换
  3. Lombok 1.8:消除熵增样板代码

【由技及道】API契约的量子纠缠术:响应封装的十一维通信协议【人工智障AI2077的开发日志012】的更多相关文章

  1. Python 批量翻译 使用有道api;

    妹子是做翻译相关的,遇到个问题,要求得到句子中的所有单词的 音标; 有道翻译只能对单个单词翻译音标,不能对多个单词或者句子段落翻译音标; 手工一个一个翻的话那就要累死人了.....于是就让我写个翻译音 ...

  2. 简单实现Python调用有道API接口(最新的)

    # ''' # Created on 2018-5-26 # # @author: yaoshuangqi # ''' import urllib.request import urllib.pars ...

  3. Python汉英/英汉翻译(百度API/有道API)

    一.百度API实现 Step1:申请API Key 以前用过BAE,已经有了Api Key,没有的可以去申请 Step2:挺简单,直接看实现的代码吧 ```python #coding:utf-8 i ...

  4. C# 有道API翻译 查询单词详细信息

    原文:C# 有道API翻译 查询单词详细信息 有道云官方文档 有道云翻译API简介:http://ai.youdao.com/docs/doc-trans-api.s#p01 有道云C#Demo : ...

  5. Web API应用架构在Winform混合框架中的应用(4)--利用代码生成工具快速开发整套应用

    前面几篇介绍了Web API的基础信息,以及如何基于混合框架的方式在WInform界面里面整合了Web API的接入方式,虽然我们看似调用过程比较复杂,但是基于整个框架的支持和考虑,我们提供了代码生成 ...

  6. Hadoop MapReduce编程 API入门系列之压缩和计数器(三十)

    不多说,直接上代码. Hadoop MapReduce编程 API入门系列之小文件合并(二十九) 生成的结果,作为输入源. 代码 package zhouls.bigdata.myMapReduce. ...

  7. 预见未来丨机器学习:未来十年研究热点 量子机器学习(Quantum ML) 量子计算机利用量子相干和量子纠缠等效应来处理信息

    微软研究院AI头条 https://mp.weixin.qq.com/s/SAz5eiSOLhsdz7nlSJ1xdA 预见未来丨机器学习:未来十年研究热点 机器学习组 微软研究院AI头条 昨天 编者 ...

  8. C#实现多级子目录Zip压缩解压实例 NET4.6下的UTC时间转换 [译]ASP.NET Core Web API 中使用Oracle数据库和Dapper看这篇就够了 asp.Net Core免费开源分布式异常日志收集框架Exceptionless安装配置以及简单使用图文教程 asp.net core异步进行新增操作并且需要判断某些字段是否重复的三种解决方案 .NET Core开发日志

    C#实现多级子目录Zip压缩解压实例 参考 https://blog.csdn.net/lki_suidongdong/article/details/20942977 重点: 实现多级子目录的压缩, ...

  9. 量子纠缠2——CHSH不等式

    问题 有Alice和Bob两个人,随机给他们两个数x和y(0或1),然后A和B根据他们得到数(x和y)给两个个数a和b(0或1). 规则如下: 如果输入的x和y都是1,那么,Alice和Bob给出不一 ...

  10. 量子纠缠1——量子比特、Bell态、EPR佯谬

    量子纠缠是量子物理的基本性质,他描述的是:当几个粒子相互作用后,无法单独描述各个粒子的性质,只能整体描述,本文主要介绍两个量子比特之间的纠缠. 量子比特(Qubit) 量子比特是量子计算的基本单位,就 ...

随机推荐

  1. Docker封装Java环境镜像(Alpine+OpenJDK)

    在给Java程序封装镜像时,使用的基础镜像动辄上百M,还需要每次部署的时候挂载时区等问题,不如自己封装一个镜像,供之后使用. 这里使用Alpine Linux(3.9) 安装OpenJDK 1.8及部 ...

  2. Qt/C++音视频开发75-获取本地有哪些摄像头名称/Qt内置函数方式

    一.前言 在需要打开本地摄像头的场景中,有个需求绕不开,那就是如何获取本地有哪些摄像头设备名称,这样可以提供下拉框给用户选择,不然你让用户去填设备名,你觉得用户会知道是啥,他会操作吗?就算你提供了详细 ...

  3. Qt编写地图综合应用33-雨量分布

    一.前言 雨量分布图是在区域地图基础上,针对区域中的每个最小单位区域比如县城点位不同颜色显示,最开始做这个封装的时候,并没有提供单独设置每个点颜色的接口,后面经过几个客户的强烈建议,咬咬牙把每个点都可 ...

  4. Awesome-Text2GQL:图查询微调语料的自动生成框架

      过去一年,GraphRAG技术发展如火如荼,尤其是基于关键词.向量驱动的知识检索方法不胜枚举.然而通过子图召回的检索方式,对用户真实查询意图的定位仍缺乏足够的准确度.我们需要更直接的方式,将自然语 ...

  5. kubeadm 快速搭建 Kubernetes 集群

    快速搭建 K8s 集群 角色 ip k8s-master-01 192.168.111.170 k8s-node-01 192.168.111.171 k8s-node-02 192.168.111. ...

  6. 阿里云-数据库-表格存储Tablestore

    入门篇一 初步调研了解 Step.1 场景锲合度判断选择使用表格存储前关键需要明确你的场景是否适合.表格存储是阿里云自2010起自研使用的一个多模型NoSQL数据库,面向海量大数据存储,身经百战.非常 ...

  7. 深入理解第二范式(2NF):提升数据库设计的有效性与灵活性

    title: 深入理解第二范式(2NF):提升数据库设计的有效性与灵活性 date: 2025/1/16 updated: 2025/1/16 author: cmdragon excerpt: 数据 ...

  8. 使用Python的一维卷积

    学习&转载文章:使用Python的一维卷积 背景 在开发机器学习算法时,最重要的事情之一(如果不是最重要的话)是提取最相关的特征,这是在项目的特征工程部分中完成的. 在CNNs中,此过程由网络 ...

  9. C :文件

    一直没有系统学习过该章节,现参考<C语言程序设计 (第四版)谭浩强> C文件基本知识 什么是文件 文件名 文件的分类 文件缓冲区 文件类型指针 typedef struct { short ...

  10. MongoDB:集群和安全

    MongoDB中的副本集(Replica Set)是一组维护相同数据集的mongod服务. 副本集可提供冗余和高可用性,是所有生产部署的基础.也可以说,副本集类似于有自动故障恢复功能的主从集群.通俗的 ...