| 问题 | 关键词/关键概念 | | ----------------------- | -------------------------------------------------------------------------------------------------------------------- | | 什么是专线?| **网络专线**:点对点专用网络连接<br>**云专线**:本地IDC到云VPC的专用通道<br>**特点**:低延迟、高带宽、安全可靠、SLA保障<br>**对比VPN**:物理隔离、性能稳定、成本高 | | 为什么云原生对应用启动速度要求高?| **弹性伸缩**:快速扩容应对流量<br>**按需计费**:启动快省钱<br>**容器调度**:频繁创建销毁<br>**故障恢复**:快速替换故障实例<br>**滚动更新**:减少更新时间窗口 | | | | | 什么是IaaS、PaaS、SaaS?| **IaaS**:基础设施即服务、虚拟机/存储/网络、AWS EC2<br>**PaaS**:平台即服务、运行环境/中间件、Heroku/GAE<br>**SaaS**:软件即服务、完整应用、Office365/Salesforce | | 什么是Serverless?| **无服务器架构**:无需管理服务器<br>**FaaS**:函数即服务、事件驱动<br>**按需付费**:按调用次数和执行时间<br>**自动伸缩**:0到N的弹性<br>**AWS Lambda/阿里云FC** | | 什么是云计算?| **定义**:通过网络提供可伸缩的IT资源<br>**特征**:按需自助、弹性伸缩、资源池化、按量付费、网络访问<br>**服务模式**:IaaS/PaaS/SaaS/FaaS | | 什么是公有云、私有云、混合云?| **公有云**:多租户共享、AWS/阿里云、成本低灵活<br>**私有云**:单一组织专用、OpenStack、安全可控<br>**混合云**:公有+私有结合、数据本地敏感应用上云 | | 什么是无状态?为啥Serverless无状态?| **无状态**:不保存客户端会话、请求独立、可任意扩缩容<br>**Serverless无状态**:函数执行完即销毁、无持久存储、状态外置到数据库/缓存、保证横向扩展 | # 云原生核心概念详解 ## **云原生应用启动速度要求原因** ### **1. 弹性伸缩需求** ```yaml # K8s HPA示例 apiVersion: autoscaling/v2 kind: HorizontalPodAutoscaler spec: minReplicas: 2 maxReplicas: 100 metrics: - type: Resource resource: name: cpu target: averageUtilization: 50 # 流量突增时需要快速扩容 # 启动慢会导致: # - 扩容延迟 # - 用户请求失败 # - 雪崩效应 ``` ### **2. 成本优化** ```Java 传统应用启动:2-3分钟 ├── JVM预热 ├── 连接池初始化 ├── 缓存加载 └── 依赖注入 云原生优化:5-10秒 ├── GraalVM原生镜像 ├── 懒加载 ├── 并行初始化 └── 预热容器池 ``` ### **3. 容器编排效率** - **Pod调度**:快速启动减少Pending时间 - **滚动更新**:缩短发布窗口 - **故障转移**:快速恢复服务 - **Spot实例**:抢占式实例需快速迁移 ## **云服务模型对比** |层级|IaaS|PaaS|SaaS|FaaS| |---|---|---|---|---| |**用户管理**|OS以上|应用+数据|仅数据|仅函数代码| |**提供商管理**|硬件+虚拟化|硬件到运行时|全栈|除函数外全部| |**示例**|EC2、ECS|App Engine、Heroku|Gmail、Slack|Lambda、FC| |**灵活性**|高|中|低|中| |**复杂度**|高|中|低|低| |**成本**|按资源|按使用|按订阅|按调用| ## **Serverless架构** ### **核心特征** ```javascript // 传统服务器应用 class UserService { constructor() { this.db = new Database(); // 持久连接 this.cache = new Cache(); // 状态保持 } async getUser(id) { return await this.db.query(id); } } // Serverless函数 exports.handler = async (event) => { // 每次执行都是全新环境 const db = await getDBConnection(); // 从连接池获取 const user = await db.query(event.userId); // 函数执行完毕,所有资源释放 return { statusCode: 200, body: JSON.stringify(user) }; }; ``` ### **Serverless优势** 1. **零运维**:无需管理服务器 2. **自动扩缩**:0到无限扩展 3. **按需付费**:精确到毫秒级 4. **事件驱动**:完美契合事件模型 ### **Serverless限制** - **冷启动**:首次调用延迟高 - **执行时限**:通常15分钟内 - **无状态**:不能保存会话 - **调试困难**:本地环境差异 ## **云部署模型详解** ```Java 公有云(Public Cloud) ├── 优点:成本低、弹性强、免运维 ├── 缺点:安全性、合规性、vendor lock-in └── 场景:互联网应用、临时资源 私有云(Private Cloud) ├── 优点:安全可控、定制化、合规 ├── 缺点:成本高、运维复杂、弹性受限 └── 场景:金融、政府、敏感数据 混合云(Hybrid Cloud) ├── 优点:灵活性、成本平衡、风险分散 ├── 缺点:架构复杂、网络延迟、管理难 └── 场景:数据本地+计算上云、灾备 多云(Multi-Cloud) ├── 优点:避免厂商锁定、最佳服务选择 ├── 缺点:管理复杂、成本控制难 └── 场景:跨国企业、高可用要求 ``` ## **无状态设计原则** ### **有状态 vs 无状态** ```java // 有状态服务 @Service public class ShoppingCart { private Map<String, List<Item>> userCarts = new HashMap<>(); public void addItem(String userId, Item item) { userCarts.get(userId).add(item); // 内存中保存状态 } } // 无状态服务 @Service public class ShoppingCart { @Autowired private RedisTemplate redis; // 状态外置 public void addItem(String userId, Item item) { redis.opsForList().rightPush("cart:" + userId, item); } } ``` ### **无状态优势** 1. **水平扩展**:任意增减实例 2. **故障恢复**:实例可随意替换 3. **负载均衡**:请求可路由到任意实例 4. **简化部署**:无需考虑状态迁移 ## **专线(Direct Connect)详解** ### **网络连接方式对比** |连接方式|公网|VPN|专线| |---|---|---|---| |**安全性**|低|中|高| |**稳定性**|低|中|高| |**延迟**|高(20-100ms)|中(10-50ms)|低(2-10ms)| |**带宽**|受限|受限|1G-100G| |**成本**|低|中|高| |**SLA**|无|部分|99.95%+| ### **专线架构** ```Java 企业数据中心 ↓ (路由器) 专线接入点(POP) ↓ (物理专线) 云服务商接入点 ↓ (虚拟接口) VPC私有网络 ``` ### **专线使用场景** 1. **混合云部署**:本地IDC与云VPC互通 2. **大数据传输**:TB级数据迁移 3. **实时同步**:数据库主从同步 4. **低延迟要求**:金融交易、游戏 ## **云原生最佳实践** ### **应用优化** ```dockerfile # 多阶段构建减小镜像 FROM maven:3.8 AS builder COPY . /app RUN mvn package # 使用精简基础镜像 FROM openjdk:17-jdk-alpine COPY --from=builder /app/target/app.jar /app.jar # JVM优化启动 ENTRYPOINT ["java", "-XX:+UseContainerSupport", "-XX:MaxRAMPercentage=75.0", "-XX:InitialRAMPercentage=50.0", "-Xss256k", "-jar", "/app.jar"] ``` ### **12-Factor原则** 1. **基准代码**:一份代码多处部署 2. **依赖**:显式声明依赖 3. **配置**:存储在环境中 4. **后端服务**:当作附加资源 5. **构建发布运行**:严格分离 6. **进程**:无状态无共享 7. **端口绑定**:通过端口提供服务 8. **并发**:进程模型扩展 9. **易处理**:快速启动优雅终止 10. **环境等价**:开发生产一致 11. **日志**:事件流 12. **管理进程**:一次性进程