Http的缓存机制?和Https有哪些区别?

本文详细解读了HTTP缓存机制如何通过强缓存和协商缓存提升效率,包括优点、http与https的区别,以及两种缓存策略的工作原理。

Http的缓存机制

http的缓存机制其实就是一种输出缓存,就是把一个请求过的web资源存储在浏览器中,当下一次在发送请求的时候,如果是相同的url路径,如果网页没有更新,浏览器就不会重新下载网页,而是直接使用本地缓存的网页,只有当网站明确标识已更新,浏览器才会再次下载网页.

优点:
减少了宽带流量的产生,降低成本。渲染缓存的页面,减少了对服务器的访问,也减轻了服务器的压力。提高响应页的速度,用户再次打开不用等待时间过长。


Http和https有哪些区别?

http是超文本传输协议,传输是无状态的,所谓无状态就是数据传输和接收都是相互独立。http和https两者连接的接口不一样,http使用的端口是80,https使用的端口是443。主要一点就是https所传输的数据是加密的,安全性相比http更好些。另外https需要颁发CA证书,这个证书好像需要花钱购买。

强缓存和协商缓存

强缓存就是发送请求不会发送给服务器,浏览器会直接提供存储的资源.
协商缓存就是客户端第一次向服务器发出请求,服务器就会返回资源和相对应的资源标识给浏览器,如果浏览器再次发送请求时,就会带上这个标识,此时,服务器端会通过这个资源标识来做判断,如果浏览器的资源标识跟服务器端的资源标识一致就返回304如果不一样就会返回资源以及新的资源标识(200)

<think>嗯,用户这次想深入了解Eureka的缓存机制原理实现方式。从历史对话看,用户之前已经了解过Eureka的缺点,特别是服务发现延迟问题,现在想聚焦在缓存机制这个技术细节上。用户应该是个开发者或架构师,正在评估注册中心技术选型。 用户引用的资料质量不错,都是讲Eureka缓存机制的专业内容。引用[1][2]提到二级缓存机制,引用[3]指出缓存导致状态更新滞后,引用[4]说明客户端缓存,引用[5]给出优化建议。这些正好能系统解答用户的疑问。 需要重点解释三个层面:首先是服务端的两级缓存设计(读写缓存+只读缓存),这是Eureka实现AP特性的核心;其次是客户端的本地缓存机制,这是造成延迟的关键;最后要说明这些缓存如何相互作用导致服务状态更新滞后。用户可能特别关心“为什么下线服务还会被调用”这个痛点问题。 图表展示会很有帮助,特别是缓存数据流动的示意图。另外要给出具体优化方案,比如怎么调整默认的30秒更新周期。用户引用[5]里提到的kill命令差异延迟下线技巧很实用,应该重点展开。 最后要自然引出相关问题,比如Nacos缓存机制对比,或者如何验证缓存配置生效。这些问题都能帮助用户深入理解机制。</think>Eureka 的缓存机制是其实现 AP 特性(高可用、分区容忍)的核心设计,但也导致服务状态更新滞后。其核心原理基于**服务端二级缓存****客户端本地缓存**的协同工作,具体实现如下: --- ### 一、服务端二级缓存机制 #### 1. **读写缓存(ReadWriteCacheMap)** - **作用**:存储服务实例的**实时注册信息**,直接对接注册表(Registry) - **数据写入**:服务实例注册/下线时,数据**先写入注册表,再同步到读写缓存** - **数据读取**:客户端拉取服务列表时,默认**不直接读取该缓存**(避免并发压力) - **过期策略**:基于**定时任务**主动刷新,默认每 **30 秒** 同步注册表数据[^1][^2] #### 2. **只读缓存(ReadOnlyCacheMap)** - **作用**:对外提供**最终一致性的服务列表**,客户端实际读取的缓存层 - **数据同步**:通过定时任务从 `ReadWriteCacheMap` **增量复制**数据,默认周期 **30 秒** - **关键设计**: ```mermaid graph LR A[服务注册/下线] --> B(Registry 注册表) B --> C[ReadWriteCacheMap] C -->|定时同步| D[ReadOnlyCacheMap] D --> E[Client 获取服务列表] ``` #### 3. 缓存更新延迟分析 | 阶段 | 默认延迟 | 最坏情况累计延迟 | |---------------------|----------|------------------| | 服务下线到注册表更新 | 0 | - | | ReadWriteCache 刷新 | 30 秒 | 30 秒 | | ReadOnlyCache 同步 | 30 秒 | 60 秒 | | 客户端缓存更新 | 30 秒 | **90 秒** | > 💡 服务下线后,客户端最长可能 **90 秒** 才能感知(3×30秒)[^3][^5] --- ### 二、客户端缓存机制 1. **本地服务列表缓存** - Ribbon 等客户端组件会将服务列表**缓存在内存**中 - 默认每 **30 秒** 向 Eureka Server 拉取更新(通过 `ribbon.ServerListRefreshInterval` 配置) - 更新前所有请求使用**旧服务列表**,导致调用已下线实例[^4] 2. **容错重试机制** - 客户端访问故障节点时(如 ConnectTimeout),可通过 Spring Cloud Retry **重试其他节点** - 需配合 Hystrix 等熔断器使用,示例配置: ```yaml ribbon: MaxAutoRetries: 1 # 同一节点重试次数 MaxAutoRetriesNextServer: 2 # 切换节点次数 ``` --- ### 三、缓存机制导致的典型问题 #### 场景:服务下线后仍被调用 ```mermaid sequenceDiagram participant Provider as 服务提供者 participant Server as Eureka Server participant Consumer as 服务消费者 Provider->>Server: 发送下线请求 Server->>Server: 更新 Registry ReadWriteCacheMap Note right of Server: 延迟 30 秒 Server->>Server: 同步到 ReadOnlyCacheMap Consumer->>Server: 定时拉取服务列表(缓存未更新) Consumer->>Provider: 调用已下线服务 → 失败 ``` > 原因:客户端在三级缓存(ReadOnlyCacheMap、客户端缓存、Ribbon缓存)更新前持续使用旧列表[^3][^5] --- ### 四、优化缓存延迟的方案 1. **缩短缓存刷新周期** ```yaml # Eureka Server 配置 eureka: server: response-cache-update-interval-ms: 3000 # ReadWriteCache刷新周期(默认30s) response-cache-auto-expiration-in-seconds: 3 # ReadOnlyCache自动过期时间 # 客户端配置 ribbon: ServerListRefreshInterval: 2000 # Ribbon服务列表刷新周期(默认30s) ``` 2. **服务优雅下线流程** - 先调用 `PUT /eureka/apps/{appId}/{instanceId}/status?value=OUT_OF_SERVICE` 标记服务不可用 - 等待 **90 秒**(覆盖缓存周期)后再停止服务进程 - 使用 `kill -15` 触发 `shutdown hook`,确保主动注销[^5] 3. **禁用只读缓存**(牺牲可用性换取实时性) ```yaml eureka: server: use-read-only-response-cache: false ``` --- > **关键结论**:Eureka 通过二级缓存实现 AP 特性,但带来秒级延迟。生产环境中需根据业务容忍度调整缓存参数,并结合服务优雅下线重试机制规避调用故障[^1][^5]。 --- ### 相关问题 1. **如何验证 Eureka 服务端缓存是否按预期更新?** 2. **Eureka 与 Nacos 的缓存机制设计有何本质区别?** 3. **在 Kubernetes 中如何优化 Eureka 客户端的缓存更新策略?** 4. **禁用 ReadOnlyCacheMap 会对 Eureka Server 性能产生多大影响?** 5. **服务优雅下线时,如何动态计算最优等待时间?**
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值