CDN架构设计
CDN架构设计
CDN工作原理
CDN通过将内容缓存到边缘节点,使用户就近获取资源,减少网络延迟和源站压力。
用户 → DNS解析 → 就近边缘节点 → 命中则返回 / 未命中则回源
缓存策略配置
通过Cache-Control和CDN配置控制缓存行为。
# Nginx源站配置
location ~* \.(jpg|jpeg|png|gif|ico|css|js)$ {
expires 30d;
add_header Cache-Control "public, immutable";
add_header Vary "Accept-Encoding";
}
location /api/ {
add_header Cache-Control "no-cache, no-store, must-revalidate";
proxy_pass http://backend;
}
// Spring Boot配置
@Configuration
public class CdnConfig {
@Bean
public WebMvcConfigurer cdnConfigurer() {
return new WebMvcConfigurer() {
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
registry.addResourceHandler("/static/**")
.addResourceLocations("classpath:/static/")
.setCacheControl(CacheControl.maxAge(30, TimeUnit.DAYS)
.cachePublic().immutable());
}
};
}
}
HTTPS加速
CDN提供SSL/TLS卸载,减轻源站加密计算压力。
// HTTPS重定向配置
@Configuration
public class HttpsRedirectConfig {
@Bean
public TomcatServletWebServerFactory tomcatFactory() {
TomcatServletWebServerFactory factory = new TomcatServletWebServerFactory() {
@Override
protected void postProcessContext(Context context) {
SecurityConstraint constraint = new SecurityConstraint();
constraint.setUserConstraint("CONFIDENTIAL");
SecurityCollection collection = new SecurityCollection();
collection.addPattern("/*");
constraint.addCollection(collection);
context.addConstraint(constraint);
}
};
factory.addAdditionalTomcatConnectors(httpRedirectConnector());
return factory;
}
private Connector httpRedirectConnector() {
Connector connector = new Connector("org.apache.coyote.http11.Http11NioProtocol");
connector.setScheme("http");
connector.setPort(80);
connector.setSecure(false);
connector.setRedirectPort(443);
return connector;
}
}
回源优化
减少回源请求的关键策略:预热、Range回源、条件请求。
@Service
public class CdnWarmUpService {
@Async
public void warmUp(List<String> urls) {
urls.forEach(url -> {
try {
restTemplate.exchange(url, HttpMethod.HEAD, null, Void.class);
log.info("Warm-up success: {}", url);
} catch (Exception e) {
log.error("Warm-up failed: {}", url, e);
}
});
}
}