客户让我给她写个爬虫-http优化

51 阅读3分钟

客户让我给她写个爬虫

HTTP 协议优化实践:提升 Web 应用性能

前言

在理解了 HTTP 协议的基本原理后,如何在实际应用中优化 HTTP 协议的使用,提升 Web 应用的性能,是每个开发者都需要关注的问题。本文将深入探讨 HTTP 协议在应用开发中的优化实践,包括请求优化、响应优化、连接优化等多个方面。

1. 请求优化

1.1 请求合并

  1. 合并多个小请求

    • 使用批处理 API
    • 实现请求聚合
    • 减少网络往返
  2. 使用 GraphQL

    query {
      user(id: "1") {
        name
        email
        posts {
          title
          content
        }
      }
    }
    
  3. 请求批处理

    // 批量请求处理
    @PostMapping("/batch")
    public List<Response> batchProcess(@RequestBody List<Request> requests) {
        return requests.parallelStream()
            .map(this::processRequest)
            .collect(Collectors.toList());
    }
    

1.2 请求压缩

  1. 启用 gzip 压缩

    // 配置请求压缩
    @Configuration
    public class CompressionConfig {
        @Bean
        public FilterRegistrationBean<CompressionFilter> compressionFilter() {
            FilterRegistrationBean<CompressionFilter> registration = new FilterRegistrationBean<>();
            registration.setFilter(new CompressionFilter());
            registration.addUrlPatterns("/*");
            return registration;
        }
    }
    
  2. 压缩配置优化

    // 设置压缩级别
    compressionFilter.setCompressionLevel(Deflater.BEST_SPEED);
    compressionFilter.setMinGzipSize(2048);
    

1.3 请求缓存

  1. 浏览器缓存

    // 设置缓存控制
    response.setHeader("Cache-Control", "max-age=3600");
    response.setHeader("ETag", "\"etag-value\"");
    
  2. 代理缓存

    # Nginx缓存配置
    proxy_cache_path /path/to/cache levels=1:2 keys_zone=my_cache:10m max_size=10g inactive=60m;
    

2. 响应优化

2.1 响应压缩

  1. 内容压缩

    // 配置响应压缩
    @Configuration
    public class ResponseCompressionConfig {
        @Bean
        public FilterRegistrationBean<GzipFilter> gzipFilter() {
            FilterRegistrationBean<GzipFilter> registration = new FilterRegistrationBean<>();
            registration.setFilter(new GzipFilter());
            registration.addUrlPatterns("/*");
            return registration;
        }
    }
    
  2. 图片优化

    // 图片压缩处理
    public BufferedImage compressImage(BufferedImage original) {
        // 实现图片压缩逻辑
        return compressed;
    }
    

2.2 响应缓存

  1. API 缓存

    // 实现响应缓存
    @Cacheable(value = "apiCache", key = "#request.url")
    public Response getCachedResponse(Request request) {
        return processRequest(request);
    }
    
  2. 缓存策略

    // 缓存配置
    @Configuration
    @EnableCaching
    public class CacheConfig {
        @Bean
        public CacheManager cacheManager() {
            return new ConcurrentMapCacheManager("apiCache");
        }
    }
    

2.3 分页优化

  1. 游标分页

    // 实现游标分页
    public PageResult<T> getPageByCursor(String cursor, int limit) {
        return repository.findByCursor(cursor, limit);
    }
    
  2. 无限滚动

    // 前端实现
    window.addEventListener('scroll', () => {
      if (isNearBottom()) {
        loadMoreData()
      }
    })
    

3. 连接优化

3.1 连接池配置

  1. HTTP 连接池

    // 配置HTTP连接池
    PoolingHttpClientConnectionManager cm = new PoolingHttpClientConnectionManager();
    cm.setMaxTotal(100);
    cm.setDefaultMaxPerRoute(20);
    
  2. 数据库连接池

    // 配置数据库连接池
    HikariConfig config = new HikariConfig();
    config.setMaximumPoolSize(10);
    config.setMinimumIdle(5);
    

3.2 超时设置

  1. 连接超时

    // 设置连接超时
    RequestConfig config = RequestConfig.custom()
        .setConnectTimeout(5000)
        .setSocketTimeout(5000)
        .build();
    
  2. 请求超时

    // 实现请求超时
    @Async
    public CompletableFuture<Response> executeWithTimeout(Request request) {
        return CompletableFuture.supplyAsync(() -> {
            // 处理请求
            return response;
        }).orTimeout(5, TimeUnit.SECONDS);
    }
    

3.3 重试机制

  1. 请求重试

    // 实现请求重试
    @Retryable(value = {IOException.class}, maxAttempts = 3)
    public Response executeWithRetry(Request request) {
        return httpClient.execute(request);
    }
    
  2. 重试策略

    // 配置重试策略
    RetryPolicy retryPolicy = new RetryPolicy()
        .withMaxAttempts(3)
        .withBackoff(1000, 5000);
    

4. 安全优化

4.1 HTTPS 配置

  1. SSL/TLS 配置

    // 配置HTTPS
    @Configuration
    public class HttpsConfig {
        @Bean
        public TomcatServletWebServerFactory tomcatServletWebServerFactory() {
            TomcatServletWebServerFactory factory = new TomcatServletWebServerFactory();
            factory.addConnectorCustomizers(connector -> {
                connector.setScheme("https");
                connector.setSecure(true);
            });
            return factory;
        }
    }
    
  2. 证书管理

    // 配置证书
    SSLContext sslContext = SSLContext.getInstance("TLS");
    sslContext.init(null, trustManager, null);
    

4.2 安全响应头

  1. 安全头设置

    // 设置安全响应头
    response.setHeader("X-Content-Type-Options", "nosniff");
    response.setHeader("X-Frame-Options", "DENY");
    response.setHeader("X-XSS-Protection", "1; mode=block");
    
  2. CORS 配置

    // 配置CORS
    @Configuration
    public class CorsConfig implements WebMvcConfigurer {
        @Override
        public void addCorsMappings(CorsRegistry registry) {
            registry.addMapping("/api/**")
                .allowedOrigins("https://trusted-domain.com")
                .allowedMethods("GET", "POST")
                .allowedHeaders("*")
                .allowCredentials(true);
        }
    }
    

5. 监控与日志

5.1 请求日志

  1. 请求追踪

    // 实现请求日志
    @Aspect
    @Component
    public class RequestLoggingAspect {
        @Around("@annotation(LogRequest)")
        public Object logRequest(ProceedingJoinPoint joinPoint) throws Throwable {
            long startTime = System.currentTimeMillis();
            Object result = joinPoint.proceed();
            long duration = System.currentTimeMillis() - startTime;
            log.info("Request completed in {}ms", duration);
            return result;
        }
    }
    
  2. 性能监控

    // 实现性能监控
    @Configuration
    public class MetricsConfig {
        @Bean
        public MeterRegistry meterRegistry() {
            return new SimpleMeterRegistry();
        }
    }
    

5.2 错误追踪

  1. 异常处理

    // 实现错误追踪
    @ControllerAdvice
    public class GlobalExceptionHandler {
        @ExceptionHandler(Exception.class)
        public ResponseEntity<ErrorResponse> handleException(Exception ex) {
            log.error("Error occurred", ex);
            return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR)
                .body(new ErrorResponse(ex.getMessage()));
        }
    }
    
  2. 日志聚合

    // 配置日志聚合
    @Configuration
    public class LoggingConfig {
        @Bean
        public LogstashLogbackEncoder logstashEncoder() {
            return new LogstashLogbackEncoder();
        }
    }
    

总结

HTTP 协议的优化是一个持续的过程,需要从多个维度进行考虑和实现。通过合理的请求优化、响应优化、连接优化、安全优化以及监控与日志,我们可以显著提升 Web 应用的性能和可靠性。在实际开发中,需要根据具体的业务场景和需求,选择合适的优化策略。

参考资料

  1. HTTP/2 规范
  2. Spring Boot 文档
  3. Apache HttpClient 文档
  4. Nginx 配置指南