首页 文章 精选 留言 我的

精选列表

搜索[知识库问答],共5068篇文章
优秀的个人博客,低调大师

大模型问答助手前端实现打字机效果 | 京东云技术团队

1. 背景 随着现代技术的快速发展,即时交互变得越来越重要。用户不仅希望获取信息,而且希望以更直观和实时的方式体验它。这在聊天应用程序和其他实时通信工具中尤为明显,用户习惯看到对方正在输入的提示。 ChatGPT,作为 OpenAI 的代表性产品之一,不仅为用户提供了强大的自然语言处理能力,而且关注用户的整体交互体验。在使用 ChatGPT 进行交互时,用户可能已经注意到了一个细节:当它产生回复时,回复会像人类逐字输入的方式逐渐出现,而不是一次性显示完整答案。 这种打字效果给人一种仿佛与真人对话的感觉,进一步增强了其自然语言处理的真实感。一开始,许多开发者可能会误以为这是通过 WebSockets 实现的,这是因为 WebSockets 是一种常用于实时通信的技术。然而,仔细研究后,我们发现 ChatGPT 使用了一种不同的技术:基于 EventStream 的方法。更具体地说,它似乎是通过 SSE (Server-Sent Events) 来实现逐个字地推送答案的。 此外,考虑到 ChatGPT 的复杂性和其涉及的大量计算,响应时间可能会长于其他基于数据库的简单查询。因此,采用 SSE 逐步推送结果的方式可以帮助减少用户感到的等待时间,从而增强用户体验。 2. SSE 简介 Server-Sent Events(通常简称为SSE)是一种允许服务器向Web页面发送实时更新的技术。与WebSocket技术相比,SSE专门设计用于从服务器到客户端的单向通信。这种单向性使其在某些场景中更为简单和直观。 2.1 主要特点 单向通信:SSE 专为从服务器到客户端的单向通信设计。客户端不能通过SSE直接发送数据到服务器,但可以通过其他方法如AJAX与服务器进行交互。 基于HTTP:SSE 基于 HTTP 协议运行,不需要新的协议或端口。这使得它能够轻松地在现有的Web应用架构中使用,并且通过标准的HTTP代理和中间件进行支持。 自动重连:如果连接断开,浏览器会自动尝试重新连接到服务器。 格式简单:SSE 使用简单的文本格式发送消息,每个消息都以两个连续的换行符分隔。 原生浏览器支持:许多现代浏览器(如 Chrome、Firefox 和 Safari)已原生支持SSE,但需要注意的是,某些浏览器,如Internet Explorer和早期的Edge版本,不支持SSE。 2.2 SSE 与 WebSockets 虽然 SSE 与 WebSockets 在某种程度上有些相似,但它们之间还存在一些关键差异,如下所示: 对比项 Server-Sent Events (SSE) WebSockets 基于协议 基于 HTTP,简化了连接和交互的过程 通常基于 WS/WSS(基于TCP),更为灵活 通信能力 单向通信:仅服务器向客户端发送消息 双向通信能力 配置 配置简单,易于理解和使用 需要更复杂的配置和理解 断线与消息追踪 自带的断线重连和消息跟踪功能 通常需要手动处理或使用额外库 数据格式 通常为文本,但可以发送经过编码/压缩的二进制消息 支持文本和原始二进制消息 事件处理 支持多种自定义事件 基本消息机制,不能像SSE那样自定义事件类型 连接并发性 连接数可能受到 HTTP 版本的限制,尤其是在HTTP/1.1中 WebSocket被设计为支持更高的连接并发性 安全性 仅支持HTTP和HTTPS的安全机制 支持WS和WSS,可以在WSS上实现更强大的加密 浏览器兼容性 大部分现代浏览器支持,但不是所有浏览器 几乎所有现代浏览器都支持 开销 由于基于HTTP,每次消息可能有较大的头部开销 握手后,消息头部开销相对较小 3. 服务端深入解析 3.1 SSE 的协议机制 Server-Sent Events(SSE)是一个基于 HTTP 的协议,允许服务器单向地向浏览器推送信息。为了成功地使用 SSE,服务器和客户端都必须遵循一定的规范和流程。 当客户端(例如浏览器)发出请求订阅 SSE 服务时,服务器需要通过设置特定的响应头部信息来确认该请求。这些头部信息包括: Content-Type: text/event-stream: 这表示返回的内容为事件流。 Cache-Control: no-cache: 这确保服务器推送的消息不会被缓存,以保障消息的实时性。 Connection: keep-alive: 这指示连接应始终保持开放,以便服务器可以随时发送消息。 3.2 消息的格式和结构 SSE 使用简单的文本格式来组织和发送消息。基本的消息结构是由一系列行组成,每一行由字段名、一个冒号和字段值组成。 以下是消息中可以使用的一些字段及其用途: event: 定义了事件的类型。这可以帮助客户端确定如何处理接收到的消息。 id: 提供事件的唯一标识符。如果连接中断,客户端可以使用最后收到的事件 ID 来请求服务器从某个点重新发送消息。 retry: 指定了当连接断开时,客户端应等待多少毫秒再尝试重新连接。这为连接中断和重连提供了一种机制。 data: 这是消息的主体内容。它可以是任何 UTF-8 编码的文本,而且可以跨多行。每行数据都会在客户端解析时连接起来,中间使用换行符分隔。 为了确保消息的正确和完整传输,服务器通常在消息的末尾添加一个空行,表示消息的结束。 示例: id: 123 event: update data: {"message": "This is a test message"} 此外,SSE 也支持多条连续消息的发送。只要每条消息之间使用两个换行符隔开即可。 4. 客户端实践 接入 SSE 并不困难,尤其在客户端这边。主流浏览器提供了EventSourceAPI,使得与 SSE 服务端建立和维护连接变得异常简单。 4.1 如何建立连接 首先,需要创建一个EventSource对象,它将代表与服务器的持久连接。初始化时,可以为它提供一些选项,以满足特定需求。 const options = { withCredentials: true // 允许跨域请求携带凭证 }; // 创建一个 EventSource 对象以开始监听 const eventSource = new EventSource('your_server_url', options); 在上面的代码中,withCredentials参数用于指示是否应该在请求中发送凭证(例如 cookies)。这在跨域场景中可能会非常有用。 4.2 如何处理收到的事件 一旦与服务器建立了连接,就可以开始监听从服务器发送过来的事件。 通用事件处理: 默认情况下,EventSource对象会对三种基本的事件类型进行响应:open、message和error。可以设置对应的处理函数来对它们进行响应。 // 监听连接打开事件 eventSource.onopen = function(event) { console.log('Connection to SSE server established!'); }; // 监听标准消息事件 eventSource.onmessage = function(event) { console.log('Received data from server: ', event.data); }; // 监听错误事件 eventSource.onerror = function(event) { console.error('An error occurred while receiving data:', event); }; 自定义事件处理: 除了上述的基本事件外,服务器还可能发送自定义的事件类型。为了处理这些事件,需要使用addEventListener()方法。 // 监听一个名为 "update" 的自定义事件 eventSource.addEventListener('update', function(event) { console.log('Received update event:', event.data); }); 4.3 关闭连接 如果不再需要从服务器接收事件,可以使用close方法关闭连接。 eventSource.close(); 关闭连接后,将不再接收任何事件,除非再次初始化EventSource对象。 总结:使用EventSourceAPI,客户端可以方便地与 SSE 服务器交互,从而实时接收数据更新。这为创建响应迅速的 web 应用提供了极大的便利,同时避免了传统的轮询方式带来的资源浪费。 5. 理论实践 5.1 服务端 const http = require('http'); const fs = require('fs'); // 初始化 HTTP 服务器 http.createServer((req, res) => { // 为了简洁,将响应方法抽离成函数 function serveFile(filePath, contentType) { fs.readFile(filePath, (err, data) => { if (err) { res.writeHead(500); res.end('Error loading the file'); } else { res.writeHead(200, {'Content-Type': contentType}); res.end(data); } }); } function handleSSEConnection() { res.writeHead(200, { 'Content-Type': 'text/event-stream', 'Cache-Control': 'no-cache', 'Connection': 'keep-alive' }); let id = 0; const intervalId = setInterval(() => { const message = { event: 'customEvent', id: id++, retry: 30000, data: { id, time: new Date().toISOString() } }; for (let key in message) { if (key !== 'data') { res.write(`${key}: ${message[key]}\n`); } else { res.write(`data: ${JSON.stringify(message.data)}\n\n`); } } }, 1000); req.on('close', () => { clearInterval(intervalId); res.end(); }); } switch (req.url) { case '/': serveFile('index.html', 'text/html'); break; case '/events': handleSSEConnection(); break; default: res.writeHead(404); res.end(); break; } }).listen(3000); console.log('Server listening on port 3000'); 5.2 客户端 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>SSE Demo</title> </head> <body> <h1>SSE Demo</h1> <button onclick="connectSSE()">建立 SSE 连接</button> <button onclick="closeSSE()">断开 SSE 连接</button> <br /><br /> <div id="message"></div> <script> const messageElement = document.getElementById('message'); let eventSource; // 连接 SSE function connectSSE() { eventSource = new EventSource('/events'); eventSource.addEventListener('customEvent', handleReceivedMessage); eventSource.onopen = handleConnectionOpen; eventSource.onerror = handleConnectionError; } // 断开 SSE 连接 function closeSSE() { eventSource.close(); appendMessage(`SSE 连接关闭,状态${eventSource.readyState}`); } // 处理从服务端收到的消息 function handleReceivedMessage(event) { const data = JSON.parse(event.data); appendMessage(`${data.id} --- ${data.time}`); } // 连接建立成功的处理函数 function handleConnectionOpen() { appendMessage(`SSE 连接成功,状态${eventSource.readyState}`); } // 连接发生错误的处理函数 function handleConnectionError() { appendMessage(`SSE 连接错误,状态${eventSource.readyState}`); } // 将消息添加到页面上 function appendMessage(message) { messageElement.innerHTML += `${message}<br />`; } </script> </body> </html> 将上面的两份代码保存为server.js和index.html,并在命令行中执行node server.js启动服务端,然后在浏览器中打开http://localhost:3000即可看到 SSE 效果。 6. 业务实践 6.1 存在问题 在业务真实使用场景中,基于SSE的方法存在一些问题和限制: 默认请求仅支持GET方法。当前端需要向后端传递参数时,参数只能拼接在请求的 URL 上,对于复杂的业务场景来说实现较为麻烦。 对于服务端返回的数据格式有固定要求,必须按照event、id、retry、data的结构返回。 服务端发送的数据可以在浏览器控制台中查看,这可能会暴露敏感数据,导致数据安全问题。 为了解决以上问题,并使其支持POST请求以及自定义的返回数据格式,我们可以使用以下技巧 6.2 优化技巧 利用 Fetch API 的流处理能力,我们可以实现对 SSE 的扩展: /** * Utf8ArrayToStr: 将Uint8Array的数据转为字符串 * @param {Uint8Array} array - Uint8Array数据 * @return {string} - 转换后的字符串 */ function Utf8ArrayToStr(array) { const decoder = new TextDecoder(); return decoder.decode(array); } /** * fetchStream: 建立一个SSE连接,并支持多种HTTP请求方式 * @param {string} url - 请求的URL地址 * @param {object} params - 请求的参数,包括HTTP方法、头部、主体内容等 * @return {Promise} - 返回一个Promise对象 */ const fetchStream = (url, params) => { const { onmessage, onclose, ...otherParams } = params; return fetch(url, otherParams) .then(response => { let reader = response.body?.getReader(); return new ReadableStream({ start(controller) { function push() { reader?.read().then(({ done, value }) => { if (done) { controller.close(); onclose?.(); return; } const decodedData = Utf8ArrayToStr(value); console.log(decodedData); onmessage?.(decodedData); controller.enqueue(value); push(); }); } push(); } }); }) .then(stream => { return new Response(stream, { headers: { "Content-Type": "text/html" } }).text(); }); }; // 示例:调用fetchStream函数 fetchStream("/events", { method: "POST", // 使用POST方法 headers: { "content-type": "application/json" }, credentials: "include", body: JSON.stringify({ // 这里列出了一些示例数据,实际业务场景请替换为你的数据 boxId: "exampleBoxId", sessionId: "exampleSessionId", queryContent: "exampleQueryContent" }), onmessage: res => { console.log(res); // 当接收到消息时的回调 }, onclose: () => { console.log("Connection closed."); // 当连接关闭时的回调 } }); 6.3 封装插件 我们定义一个名为eventStreamHandler.ts的文件 // 定义请求主体的接口,需要根据具体的应用场景定义具体的属性 interface RequestBody { // 示例属性,具体属性需要根据实际需求定义 key?: string; } // 错误响应的结构 interface ErrorResponse { error: string; detail: string; } // 返回值类型定义 type TextStream = ReadableStreamDefaultReader<Uint8Array>; // 获取数据并返回TextStream async function fetchData( url: string, body: RequestBody, accessToken: string, onError: (message: string) => void ): Promise<TextStream | undefined> { try { // 尝试发起请求 const response = await fetch(url, { method: "POST", cache: "no-cache", keepalive: true, headers: { "Content-Type": "application/json", Accept: "text/event-stream", Authorization: `Bearer ${accessToken}`, }, body: JSON.stringify(body), }); // 检查是否有冲突,例如重复请求 if (response.status === 409) { const error: ErrorResponse = await response.json(); onError(error.detail); return undefined; } return response.body?.getReader(); } catch (error) { onError(`Failed to fetch: ${error.message}`); return undefined; } } // 读取流数据 async function readStream(reader: TextStream): Promise<string | null> { const result = await reader.read(); return result.done ? null : new TextDecoder().decode(result.value); } // 处理文本流数据 async function processStream( reader: TextStream, onStart: () => void, onText: (text: string) => void, onError: (error: string) => void, shouldClose: () => boolean ): Promise<void> { try { // 开始处理数据 onStart(); while (true) { if (shouldClose()) { await reader.cancel(); return; } const text = await readStream(reader); if (text === null) break; onText(text); } } catch (error) { onError(`Processing stream failed: ${error.message}`); } } /** * 主要的导出函数,用于处理流式文本数据。 * * @param url 请求的URL。 * @param body 请求主体内容。 * @param accessToken 访问令牌。 * @param onStart 开始处理数据时的回调。 * @param onText 接收到数据时的回调。 * @param onError 错误处理回调。 * @param shouldClose 判断是否需要关闭流的函数。 */ export async function streamText( url: string, body: RequestBody, accessToken: string, onStart: () => void, onText: (text: string) => void, onError: (error: string) => void, shouldClose: () => boolean ): Promise<void> { const reader = await fetchData(url, body, accessToken, onError); if (!reader) { console.error("Reader is undefined!"); return; } await processStream(reader, onStart, onText, onError, shouldClose); } 7. 兼容性 发展至今,SSE 已具有广泛的的浏览器兼容性,几乎除 IE 之外的浏览器均已支持。 8. 总结 SSE (Server-Sent Events) 是基于 HTTP 协议的轻量级实时通信技术。其核心特点是由服务器主动推送数据到客户端,而不需要客户端频繁请求。这样的特点使得 SSE 在某些应用场景中成为了理想选择,例如股票行情实时更新、网站活动日志推送、或聊天室中的实时在线人数统计。 然而,尽管 SSE 有很多优势,如断线重连机制、相对简单的实现和轻量性等,但它也存在明显的局限性。首先,SSE 只支持单向通信,即服务器到客户端的数据推送,而无法实现真正的双向交互。其次,由于浏览器对并发连接数有限制,当需要大量的实时通信连接时,SSE 可能会受到限制。 相对而言,WebSockets 提供了一个更加强大的双向通信机制,能够满足高并发、高吞吐量和低延迟的需求。因此,在选择适合的实时通信方案时,开发者需要根据应用的具体需求和场景来做出选择。简而言之,对于需要简单、低频率更新的场景,SSE 是一个非常不错的选择;而对于需要复杂、高频、双向交互的应用,WebSockets 可能更为合适。 最后,无论选择哪种技术,都应对其优缺点有深入了解,以确保在特定场景下可以提供最佳的用户体验。 作者:京东科技卞荣成 来源:京东云开发者社区 转载请注明来源

优秀的个人博客,低调大师

Java多线程和并发基础面试问答,错过会后悔哦【转】

第一:Java多线程面试问题 1:进程和线程之间有什么不同? 一个进程是一个独立(self contained)的运行环境,它可以被看作一个程序或者一个应用。而线程是在进程中执行的一个任务。Java运行环境是一个包含了不同的类和程序的单一进程。线程可以被称为轻量级进程。线程需要较少的资源来创建和驻留在进程中,并且可以共享进程中的资源。 2:多线程编程的好处是什么? 在多线程程序中,多个线程被并发的执行以提高程序的效率,CPU不会因为某个线程需要等待资源而进入空闲状态。多个线程共享堆内存(heap memory),因此创建多个线程去执行一些任务会比创建多个进程更好。举个例子,Servlets比CGI更好,是因为Servlets支持多线程而CGI不支持。 3:用户线程和守护线程有什么区别? 当我们在Java程序中创建一个线程,它就被称为用户线程。一个守护线程是在后台执行并且不会阻止JVM终止的线程。当没有用户线程在运行的时候,JVM关闭程序并且退出。一个守护线程创建的子线程依然是守护线程。 4:我们如何创建一个线程? 有两种创建线程的方法:一是实现Runnable接口,然后将它传递给Thread的构造函数,创建一个Thread对象;二是直接继承Thread类。 5:有哪些不同的线程生命周期? 当我们在Java程序中新建一个线程时,它的状态是New。当我们调用线程的start()方法时,状态被改变为Runnable。线程调度器会为Runnable线程池中的线程分配CPU时间并且讲它们的状态改变为Running。其他的线程状态还有Waiting,Blocked和Dead。 6:可以直接调用Thread类的run()方法么? 当然可以,但是如果我们调用了Thread的run()方法,它的行为就会和普通的方法一样,为了在新的线程中执行我们的代码,必须使用Thread.start()方法。 7:如何让正在运行的线程暂停一段时间? 我们可以使用Thread类的Sleep()方法让线程暂停一段时间。需要注意的是,这并不会让线程终止,一旦从休眠中唤醒线程,线程的状态将会被改变为Runnable,并且根据线程调度,它将得到执行。 8:你对线程优先级的理解是什么? 每一个线程都是有优先级的,一般来说,高优先级的线程在运行时会具有优先权,但这依赖于线程调度的实现,这个实现是和操作系统相关的(OS dependent)。我们可以定义线程的优先级,但是这并不能保证高优先级的线程会在低优先级的线程前执行。线程优先级是一个int变量(从1-10),1代表最低优先级,10代表最高优先级。 9:什么是线程调度器和时间分片? 线程调度器是一个操作系统服务,它负责为Runnable状态的线程分配CPU时间。一旦我们创建一个线程并启动它,它的执行便依赖于线程调度器的实现。时间分片是指将可用的CPU时间分配给可用的Runnable线程的过程。分配CPU时间可以基于线程优先级或者线程等待的时间。线程调度并不受到Java虚拟机控制,所以由应用程序来控制它是更好的选择(也就是说不要让你的程序依赖于线程的优先级)。 10:在多线程中,什么是上下文切换? 上下文切换是存储和恢复CPU状态的过程,它使得线程执行能够从中断点恢复执行。上下文切换是多任务操作系统和多线程环境的基本特征。 11:为什么Thread类的sleep()和yield()方法是静态的? Thread类的sleep()和yield()方法将在当前正在执行的线程上运行。所以在其他处于等待状态的线程上调用这些方法是没有意义的。这就是为什么这些方法是静态的。它们可以在当前正在执行的线程中工作,并避免程序员错误的认为可以在其他非运行线程调用这些方法。 12:如何确保线程安全? 在Java中可以有很多方法来保证线程安全——同步,使用原子类(atomic concurrent classes),实现并发锁,使用volatile关键字,使用不变类和线程安全类。在线程安全教程中,你可以学到更多。 13:如何创建守护线程? 使用Thread类的setDaemon(true)方法可以将线程设置为守护线程,需要注意的是,需要在调用start()方法前调用这个方法,否则会抛出IllegalThreadStateException异常。 14:什么是ThreadLocal? ThreadLocal用于创建线程的本地变量,我们知道一个对象的所有线程会共享它的全局变量,所以这些变量不是线程安全的,我们可以使用同步技术。但是当我们不想使用同步的时候,我们可以选择ThreadLocal变量。每个线程都会拥有他们自己的Thread变量,它们可以使用get()set()方法去获取他们的默认值或者在线程内部改变他们的值。ThreadLocal实例通常是希望它们同线程状态关联起来是private static属性。 第二:Java并发面试问题 1:什么是Executors框架? Executor框架同java.util.concurrent.Executor 接口在Java 5中被引入。Executor框架是一个根据一组执行策略调用,调度,执行和控制的异步任务的框架。无限制的创建线程会引起应用程序内存溢出。所以创建一个线程池是个更好的的解决方案,因为可以限制线程的数量并且可以回收再利用这些线程。利用Executors框架可以非常方便的创建一个线程池。 2:什么是Callable和Future? Java 5在concurrency包中引入了java.util.concurrent.Callable 接口,它和Runnable接口很相似,但它可以返回一个对象或者抛出一个异常。:Callable接口使用泛型去定义它的返回类型。Executors类提供了一些有用的方法去在线程池中执行Callable内的任务。由于Callable任务是并行的,我们必须等待它返回的结果。java.util.concurrent.Future对象为我们解决了这个问题。在线程池提交Callable任务后返回了一个Future对象,使用它我们可以知道Callable任务的状态和得到Callable返回的执行结果。Future提供了get()方法让我们可以等待Callable结束并获取它的执行结果。 3: 什么是FutureTask? FutureTask是Future的一个基础实现,我们可以将它同Executors使用处理异步任务。通常我们不需要使用FutureTask类,单当我们打算重写Future接口的一些方法并保持原来基础的实现是,它就变得非常有用。我们可以仅仅继承于它并重写我们需要的方法。 4:什么是并发容器的实现? Java集合类都是快速失败的,这就意味着当集合被改变且一个线程在使用迭代器遍历集合的时候,迭代器的next()方法将抛出ConcurrentModificationException异常。并发容器支持并发的遍历和并发的更新。主要的类有ConcurrentHashMap, CopyOnWriteArrayList 和CopyOnWriteArraySet。 5:Executors类是什么? Executors为Executor,ExecutorService,ScheduledExecutorService,ThreadFactory和Callable类提供了一些工具方法。Executors可以用于方便的创建线程池。 本文作者:George

优秀的个人博客,低调大师

湖北阿里云授权中心分享关于云服务器的相关问答

关于阿里云服务器大家有很多的疑问,最近武汉捷讯技术的小编根据大家的反馈,收集了一些大家都比较关注的问题。今天就给大家简单的回答一下。期待大家指正。 1、 问:阿里云共享虚拟主机,阿里云服务器多少钱? 答:阿里云服务器的相关配置不同,价格也不相同呢。比如企业级相较于入门级价格就偏贵,然后CPU和带宽不同,价格也有差异。下面是阿里云官网上价格简单的比较,大家可以参考一下: 企业级: 入门级: 2、 问:阿里云后台启动阿里云esc服务器无法启动,怎么办? 答:造成服务器无法启动的原因有很多,需要一一排除。一般来讲可以通过以下两种方式登录服务器再试试。 1)远程桌面连接(MicrosoftTerminalServicesClient,MSTSC):采用这种方式登录,请确保实例能访问公网。如果在创建实例时没有购买带宽,则不能使用远程桌面连接。 2)管理终端VNC:无论您在创建实例时是否购买了带宽,只要您本地有网页浏览器,都可以通过管理控制台的管理终端登录实例。 使用远程桌面连接(MSTSC)登录实例 a、打开开始菜单>远程桌面连接,或在开始菜单>搜索中输入mstsc。也可以使用快捷键Win+R来启动运行窗口,输入mstsc后回车启动远程桌面连接。 b、在远程桌面连接对话框中,输入实例的公网IP地址。单击显示选项。 c、输入用户名,单击允许我保存凭据,然后单击连接。这样以后登录就不需要手动输入密码了。 3、 问:阿里云服务器拥有多少公网IP? 答:目前阿里云服务器只能绑定一个公网IP 。基本上一个是可以满足大部分用户要求的。 4、 问:为什么要选择大带宽的服务器? 答:带宽越大,数据存取、访问速度越快,不轻易造成服务器负担,更不容易出现迸发时的宕机等情况,不过带宽对价格影响比较大。建议,根据实际情况选择带宽大小。 5、 问:阿里云服务器和虚拟主机应该选哪一个? 答:一般情况下,如果是个人使用,或者公司只做一个网站,且公司没有专业的技术人员可以选择虚拟主机。如果对服务器要求比较高,且日后配置需要增加或调整的,最好选择阿里云服务器。不过只要是适合就是可以的,选择哪个主要根据大家实际情况而定。 6、问:阿里云服务器到期后,怎么办? 答:到期之前都会发送邮件或者短信进行提醒;也就是说服务器到期后不会立即停止,会给7天的缓冲期;这期间数据还在。如果这七天之内续费还可以正常使用,如果七天之后还没有续费,就会释放。 7、 问:阿里云服务器不备案可以用吗? 答:国内的空间和服务器是必须备案的。否则国外的空间不用备案,也不能备案。如果面向国内的市场,做正规点的网站,建议还是按规定备案。 因为你国内的主机不备案,你就不能用域名访问,只能用IP。 国外的服务器(香港、美国区域等) 不需要备案也能绑定域名访问 。 8、 问:阿里云服务器如何绑定域名? 答:首先登陆阿里云服务器。 a、在服务器里选择开始菜单里的“interest信息服务(IIS)管理器”进入,如果桌面有图标双击打开; b、然后在“网站”文件展开目录下找到已经建立好的站点,右键属性里打开该站点属性面板:然后找到添加标志的网站右键属性打开; c、进入站点属性面板后可见“目录安全性”、“HTTP头”、“自定义错误”等选项标签,选择“网站”标签,保持“网站标识”以及“连接”内容的默认值,直接选择“高级”进入“高级网站标识”面板; d、保持“ip地址”、“TCP端口”、“主机头值”下原有的默认值不变,点击选择“添加”按钮,出现“添加\编辑网站标识”的对话框; e、保持“IP地址”默认值不变,将“TCP端口”设置成“80”,“主机头值”就是你要绑定的域名,可输入你要绑定的网址,下图示例是绑定二级域名。设置完成后点击“确定”按钮保存即可。 9、 问:一个台阿里云服务器可以建几个网站? 答:阿里云主机因为有独立的IP,带宽以及操作系统。它也是可以通过IIS来发布网站并不会影响到其他用户,所以阿里云云主机是不限制网站数量的。 一个阿里云云主机放多少个网站跟两方面有关。一个是阿里云云主机的配置与带宽大小。另一个就是所放的网站类型。一般情况下下载、电影类的网站会占用较多的系统资源,而文字、论坛类的网站会节约系统资源。所以网站的类型不同,能承载的网站数量也就会不同。一般情况下即使高配置的云主机来小型企业网站放一两百个就可以了,太多会影响到性能。给大家一个参考,阿里云服务器最基本的配置,阿里云CPU:1核,内存:1G,公网带宽1M,青岛节点,数据盘:5G。这个基本的阿里云服务器可放8-15个企业网站。 10、 问:公网带宽什么意思?有什么影响呢? 答:公网带宽是指对外提供服务,可以访问网络,网络其他计算机可以访问服务器的流量。通俗点说就是这台服务器可以被网络其他计算机访问; 阿里云服务器分有公网带宽服务器(独立ip服务器)、没有公网带宽服务器(内网服务器)。独立ip服务器可以被网络其他的计算机等访问到,内网服务器是被独立ip服务器调用,一般当数据库服务器使用比如mysql服务器; 另外数据盘是系统盘之外的存放数据的盘符,像本地电脑的D盘,E盘 好了,今天的分享就到这里了。大家还有什么疑问的话可以在线咨询捷讯技术客服人员,希望大家更好的了解阿里云相关的产品知识和应用。

优秀的个人博客,低调大师

云上浙江——阿里云助力浙江十万企业上云活动常见问答

1.公司注册地不在浙江,但是在浙江区域内有分公司/办事处的分支机构,是否可以享受该优惠政策?对企业规模是否有要求?答复:浙江十万企业上云项目,面向所有注册地在浙江省的企业,相关活动详情,请登录云上浙江主题页(https://promotion.aliyun.com/ntms/act/yunshangzhejiang/advanced.html)注册地不在浙江省内的企业,仍可享受阿里云官网推出的定期、不定期优惠活动。 2.具体优惠政策是什么?答复:十万企业上云优惠政策,分为阿里云官网补贴,和浙江省各级政府补贴两大类。浙江省各级政府补贴,由相关政府部门制定;阿里云将依据相关部门补贴政策,及时在活动主题页面更新。 3.优惠政策什么时间上线?答复:优惠政策即将发布,敬请期待 4.本次政府优惠是否有名额限制,或时间限制?怎么判断我(客户)是否可以享受优惠?答复:十万企业上云的政府优惠政策,由浙江省各地各级政府相关部门制定。阿里云依据各级政府相关部门的授权,推出相关活动;活动结束时,阿里云将同步在官网主题页下线相应内容。用户通过主题页面选购阿里云产品时,系统将提示用户是否享受相关优惠和补贴。 5.页面上的服务合作伙伴与阿里云的关系是什么?有哪些资质?是否安全可靠?答复:页面上的服务合作伙伴已经是阿里云统一认证过的合作伙伴。经过阿里云认证过的合作伙伴全部已经提供过营业执照、对公账号、公司简介、关键联系人等关键信息,由阿里云统一授权获取服务资格安全可靠。 6.页面介绍的服务伙伴,提供服务是收费还是免费?如果收费,费用收取办法是?答复:上云咨询、配置推荐等标准服务内容为免费,如果涉及到重大项目数据迁移、安全维护等需单独和服务商联系沟通收费方式,费用收取方法为线下付款。

资源下载

更多资源
Mario

Mario

马里奥是站在游戏界顶峰的超人气多面角色。马里奥靠吃蘑菇成长,特征是大鼻子、头戴帽子、身穿背带裤,还留着胡子。与他的双胞胎兄弟路易基一起,长年担任任天堂的招牌角色。

Spring

Spring

Spring框架(Spring Framework)是由Rod Johnson于2002年提出的开源Java企业级应用框架,旨在通过使用JavaBean替代传统EJB实现方式降低企业级编程开发的复杂性。该框架基于简单性、可测试性和松耦合性设计理念,提供核心容器、应用上下文、数据访问集成等模块,支持整合Hibernate、Struts等第三方框架,其适用范围不仅限于服务器端开发,绝大多数Java应用均可从中受益。

Sublime Text

Sublime Text

Sublime Text具有漂亮的用户界面和强大的功能,例如代码缩略图,Python的插件,代码段等。还可自定义键绑定,菜单和工具栏。Sublime Text 的主要功能包括:拼写检查,书签,完整的 Python API , Goto 功能,即时项目切换,多选择,多窗口等等。Sublime Text 是一个跨平台的编辑器,同时支持Windows、Linux、Mac OS X等操作系统。

WebStorm

WebStorm

WebStorm 是jetbrains公司旗下一款JavaScript 开发工具。目前已经被广大中国JS开发者誉为“Web前端开发神器”、“最强大的HTML5编辑器”、“最智能的JavaScript IDE”等。与IntelliJ IDEA同源,继承了IntelliJ IDEA强大的JS部分的功能。

用户登录
用户注册