客户端从服务器端获取图片场景,加入CDN的实施方案

场景

浏览器(客户端)发送获取图片的请求,参数1—指定文件夹,参数2—指定文件夹中的指定图片名称(数字编号)作为开始,然后web服务器端通过websocket的方式从指定图片开始源源不断的按照顺序依次向浏览器发送图片。注:这些图片就存储在web服务器上的某个目录中。

CDN的作用

CDN通过将内容缓存到靠近用户的多个边缘节点,减少传输延迟,提高传输速度和可靠性。对于你的场景,CDN可以在以下方面发挥作用:

  1. 减少延迟:通过在全球分布的边缘节点缓存图片,CDN可以将图片快速传输给地理位置不同的医生,减少网络延迟。
  2. 减轻服务器负载:将图片请求分流到CDN节点,减轻了Web服务器的压力,提高整体系统的稳定性和响应速度。
  3. 提高可靠性:CDN的冗余机制确保了即使某个节点出现问题,图片也可以从其他节点获取,提高了系统的可靠性。

实施方案

  1. 图片存储和缓存策略
    首先,需要将图片上传到Web服务器,并通过CDN进行缓存。CDN会将图片分发到其全球节点。

  2. 配置CDN
    配置CDN服务,将图片目录设置为缓存目录。常见的CDN服务提供商包括Cloudflare、Akamai、Amazon CloudFront等。

  3. 图片请求流程
    当浏览器请求图片时,Web服务器根据请求参数(指定文件夹和指定图片名称)进行处理。具体流程如下:

(1)浏览器请求图片:

  • 浏览器通过WebSocket发送请求,包含指定文件夹和开始图片编号。

(2)Web服务器处理请求:

  • Web服务器接收请求,根据参数从本地目录中查找相应的图片。
  • 将图片的URL转换为CDN的URL

(3)图片推送:

  • Web服务器通过WebSocket将图片的CDN URL推送给浏览器。
  • 浏览器从CDN节点获取图片并展示。

(4)连续图片推送:

  • Web服务器依次查找下一张图片的路径,继续通过WebSocket推送CDN URL。
  • 浏览器从CDN获取下一张图片,保证图片连续、顺序地展示。

具体实现

  1. 配置CDN

假设使用Amazon CloudFront,配置步骤如下:

  • 在AWS管理控制台创建一个新的CloudFront分配。
  • 配置源为你的Web服务器域名。
  • 设置缓存行为规则,缓存所有图片请求。
  • 获取CloudFront分配的域名,类似于d12345678.cloudfront.net。
  1. 修改Web服务器

在Spring Boot项目中,通过WebSocket推送图片CDN URL:

import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.socket.TextMessage;
import org.springframework.web.socket.WebSocketSession;
import org.springframework.web.socket.handler.TextWebSocketHandler;import java.nio.file.*;
import java.util.List;
import java.util.stream.Collectors;public class ImageWebSocketHandler extends TextWebSocketHandler {@Value("${cdn.domain}")private String cdnDomain;@Value("${image.base.path}")private String imageBasePath;@Overrideprotected void handleTextMessage(WebSocketSession session, TextMessage message) throws Exception {String payload = message.getPayload();String[] params = payload.split(",");String folder = params[0];int startImage = Integer.parseInt(params[1]);List<Path> imagePaths = Files.list(Paths.get(imageBasePath, folder)).sorted().collect(Collectors.toList());for (int i = startImage; i < imagePaths.size(); i++) {Path imagePath = imagePaths.get(i);String imageName = imagePath.getFileName().toString();String imageUrl = String.format("https://%s/%s/%s", cdnDomain, folder, imageName);session.sendMessage(new TextMessage(imageUrl));Thread.sleep(1000); // 控制图片推送速度}}
}
  1. 前端处理

使用JavaScript在浏览器端通过WebSocket接收CDN URL并显示图片:

const socket = new WebSocket('ws://localhost:8080/ws/images');socket.onopen = function() {const folder = 'exampleFolder';const startImage = 0;socket.send(`${folder},${startImage}`);
};socket.onmessage = function(event) {const imageUrl = event.data;const img = document.createElement('img');img.src = imageUrl;img.style.width = '100%';document.body.appendChild(img);
};socket.onclose = function() {console.log('WebSocket connection closed');
};

缓存更新策略

CDN缓存有一定的有效期,当源服务器上的图片更新时,需要通过以下方式更新CDN缓存:

  1. 缓存失效:在源服务器上更新图片后,通过CDN管理控制台或API手动使相关路径缓存失效。
  2. 版本控制:在图片URL中加入版本号或时间戳,如https://cdn.example.com/folder/image_v2.jpg,确保浏览器每次请求都获取最新的图片。

总结

通过上述方案,CDN在浏览器请求图片并通过WebSocket推送过程中,起到了减少延迟、减轻服务器负载和提高系统可靠性的作用。浏览器通过CDN快速获取图片,同时保持顺序展示,实现了高效、流畅的医生阅片体验。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/33105.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Java中的NIO编程实践精华

Java中的NIO编程实践精华 大家好&#xff0c;我是免费搭建查券返利机器人省钱赚佣金就用微赚淘客系统3.0的小编&#xff0c;也是冬天不穿秋裤&#xff0c;天冷也要风度的程序猿&#xff01; 在Java网络编程中&#xff0c;NIO&#xff08;New I/O&#xff09;是一种基于通道和…

人工智能机器学习算法总结偏差和方差

1.定义 在机器学习中&#xff0c;偏差&#xff08;Bias&#xff09;和方差&#xff08;Variance&#xff09;是评估模型泛化能力的重要概念。它们描述了模型在训练数据上的表现以及对新数据的适应能力。 偏差&#xff08;Bias&#xff09; &#xff1a; 偏差是指模型的预测值与…

fetch 封装 文件流下载进度监控-demo

要使用 fetch API 下载文件并监控下载进度&#xff0c;你需要处理响应的 ReadableStream。这里是一个如何封装此功能的基本示例&#xff1a; <script setup lang"ts"> const downloadFileWithProgress async (url, onProgress) > {// 发起 fetch 请求cons…

北斗三号短报文通信终端 | 助力户外无网络场景作业

北斗三号短报文通信终端是一款专为户外无网络场景作业设计的先进通信工具&#xff0c;它依托于中国自主研发的北斗卫星导航系统&#xff0c;为用户在偏远地区或无网络覆盖区域提供了可靠的通信保障。以下是关于北斗三号短报文通信终端的详细介绍&#xff1a; 一、功能特点 北斗…

【Linux系列】tree 命令的实用指南

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

头歌——机器学习——集成学习案例

第1关&#xff1a;基于集成学习模型的应用案例 任务描述 本次任务我们将会使用银行营销数据集&#xff08;来源于UCI数据集&#xff1a;UCI Machine Learning Repository &#xff09;,该数据集共45211条数据&#xff0c;涉及葡萄牙银行机构的营销活动&#xff0c;通过一些与…

大端和小端存储

在计算机科学中&#xff0c;数据存储的“字节顺序”是指数据的字节在内存中排列的顺序。主要有两种字节序&#xff1a;大端&#xff08;Big Endian&#xff09;和小端&#xff08;Little Endian&#xff09;。 大端字节序 (Big Endian) 大端字节序将数据的高位字节存储在内存…

【机器学习】自然语言处理的新前沿:GPT-4与Beyond

&#x1f4dd;个人主页&#xff1a;哈__ 期待您的关注 目录 &#x1f525;引言 背景介绍 文章目的 一、GPT-4简介 GPT-4概述 主要特性 局限性和挑战 二、自监督学习的新进展 自监督学习的原理 代表性模型和技术 三、少样本学习和零样本学习 少样本学习的挑战 先…

Maven深度解析:Java项目构建

Maven是一个由Apache软件基金会维护的软件项目管理和理解工具&#xff0c;它主要服务于基于Java的软件项目。。 Maven深度解析&#xff1a;Java项目构建 引言 在Java开发领域&#xff0c;项目构建和管理是一个复杂而关键的任务。Maven作为这一领域的佼佼者&#xff0c;以其声…

【MDK5问题】:MDK5无法跳转,并且提示:no browse information available in xxxxx

1、问题&#xff1a; MDK5原来的函数调用可以直接跳转到原函数&#xff0c;但是出现不能跳转原函数的情况&#xff0c;且提示&#xff1a;no browse information available in xxxxx 的情况&#xff1b; 2、解决&#xff1a; 如下图所示&#xff1a;在魔术棒&#xff08;pro…

使用 JavaScript 获取电池状态

在现代的移动设备和笔记本电脑上&#xff0c;了解电池状态是一项非常有用的功能。使用 JavaScript 可以轻松地获取电池的充电状态、电量百分比等信息。本文将介绍如何使用 JavaScript 访问这些信息&#xff0c;并将其显示在网页上。 1. HTML 结构 首先&#xff0c;我们需要一…

【React Native】measureInWindow在安卓上无法正确获取View在屏幕上的布局信息

问题描述&#xff1a; 在React Native中&#xff0c;我们可以使用measureInWindow的方式去获取一个View在屏幕中的位置信息&#xff1a; 下面这个Demo中&#xff0c;我们写了一个页面HomePage和一个列表项组件ListItemA&#xff0c;我们期望每过5s监测一次列表中每一项在屏幕中…

FW Activity跳转动画源码解析(一)

文章目录 跳转动画实际操作的是什么?窗口怎么知道应该执行什么动画,是透明,还是平移,还是缩放,旋转? 跳转动画实际操作的是什么? startActivity调用之后进行页面跳转,会有一系列的涉及到ActivitStar,ActivityTask,ActivityManager等类的操作,最终在执行动画会调用到Surface…

【LinuxC语言】第一个简单的tcp/ip客户端

文章目录 前言一、客户端连接服务器的示意图二、客户端涉及的相关函数socket函数connect函数struct sockaddr结构体相关的转换函数connect主体函数发送数据函数接收数据函数关闭socket客户端示例代码总结前言 在计算机网络中,TCP/IP 是最常见的网络协议。它为我们提供了一种可…

可视化实训复习篇章

前言&#xff1a; 今天&#xff0c;我们来学习seaborn库可视化&#xff0c;当然&#xff0c;这个建立在Matplotlib的基础上&#xff0c;话不多说&#xff0c;进入今天的正题吧&#xff01;当然&#xff0c;这个是《python数据分析与应用》书中&#xff0c;大家有需求的可以参考…

将一维机械振动信号构造为训练集和测试集(Python)

从如下链接中下载轴承数据集。 https://www.sciencedirect.com/science/article/pii/S2352340918314124 import numpy as np import scipy.io as sio import matplotlib.pyplot as plt import statistics as stats import pandas as pd from sklearn.model_selection import t…

在Ubuntu下将pulseaudio换成pipewire

1、为什么要将pulseaudio换成pipewire&#xff1f; PulseAudio 是一个成熟且广泛使用的音频服务器&#xff0c;适合一般桌面音频需求&#xff0c;但在性能和延迟上有一定限制。PipeWire 是一个更现代的解决方案&#xff0c;旨在统一音频和视频处理&#xff0c;提供高性能和低延…

苹果可能与 Meta 合作开发人工智能

随着苹果进入AI领域&#xff0c;它也在寻求合作伙伴的帮助。 在本月早些时候宣布Apple Intelligence期间&#xff0c;苹果表示将与OpenAI合作&#xff0c;将ChatGPT引入改版后的Siri。据《华尔街日报》报道&#xff0c;苹果和Facebook的母公司Meta也在讨论类似的合作事宜。 据…

微服务、多租户、单点登录、国产化形成的开源Java框架!

一、项目简介 JVS是软开企服构建的一站式数字化的开源框架&#xff0c;支持对接多种账户体系&#xff0c;支持多租户、支持Auth2、统一登录、单点登录等&#xff0c;支持原生开发、低代码/零代码开发应用。 二、框架核心功能 控制台(首页)&#xff1a;采用配置化的方式 用户…

已经被驳回的商标名称还可以申请不!

看到有网友在问&#xff0c;已经驳回的商标名称还可以申请不&#xff0c;普推商标知产老杨觉得要分析看情况&#xff0c;可以适当分析下看可不可以能申请&#xff0c;当然最终还是为了下证 &#xff0c;下证概率低的不建议申请。 先看驳回理由&#xff0c;如果商标驳回是绝对理…