← 返回首页

CDN架构设计

📂 architecture ⏱ 1 min 178 words

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);
            }
        });
    }
}