动手k8s之Nodejs + Mysql
每次学习中碰到 k8s,都会被它的复杂性难住。现在网上的教程,要么直接指定 image,省略了 yaml 文件的编写,要么是只有应用节点,没有数据库节点,这就和实际生产环境脱离。所以,我决定自己从头搭建一个集群,整合 Nodejs 和 mysql,打造一个最小示例,作为备忘记录。
每次学习中碰到 k8s,都会被它的复杂性难住。现在网上的教程,要么直接指定 image,省略了 yaml 文件的编写,要么是只有应用节点,没有数据库节点,这就和实际生产环境脱离。所以,我决定自己从头搭建一个集群,整合 Nodejs 和 mysql,打造一个最小示例,作为备忘记录。
这阵子学习《Nodejs 实战》的时候,有看到压力测试的话题,恰好最近工作中也遇到一些高负载场景,所以把这些知识和工具整理出来。
掌握任何一个真实项目,必然要以熟悉编程语言的模块系统为前提。Go 的模块系统有一些独特之处,在这里做一下完整记录。
这篇文章,我打算从 js 有哪些实现计算密集型任务的手段出发,延伸到进程和线程,再到 golang, 从而对并发有一个深刻的认知。
url base64 编码有特殊逻辑。
读懂配置文件,有助于分析 bug,并且更深一步了解项目。
问题背景:在一次将客户服务器的 SAP hana 数据库的数据通过 ETL 工具转移到 clickhouse 数仓时,发现本应是 600 多万行的数据,只有十几万到了数仓,且后台和数据库日志中没有任何报错信息。
我对于前端开发的感受是,实际工程和教程实例代码的差距很大,还有很容易陷在改局部需求,最终变成查文档和写局部 JS 代码的工具人,而失去对项目的总体认识。因为前端一般项目庞大,引入库众多,加上每个库都有自己独特的写法,写多了,就只知其一,不知其二了。
综上,为了建立对 react 项目的整体认知,我就第 N 次过一遍官网的教程,同时记录那些概念和项目结构。
CORS(Cross-Origin Resource Sharing,跨域资源共享) 是一种浏览器安全机制,允许或限制从不同来源(域名、协议或端口)加载资源的网页进行交互。它解决了浏览器的同源策略(Same-Origin Policy, SOP)限制,允许受控的跨域请求,以保护用户数据的安全。
浏览器的同源策略 规定,网页只能访问与其自身同源(即相同域名、协议和端口)的资源,防止恶意网站获取其他域的数据。这虽然有效提升了安全性,但限制了现代 Web 应用中常见的跨域交互需求,如 API 请求、跨域文件加载等。 CORS 允许在安全的情况下进行跨域请求,提供了一种松散的跨源资源访问机制,使得服务器可以指定哪些外部源可以访问其资源。
Content-Type: text/plain
,这些请求可以直接发送。响应头 :
服务器通过在响应头中设置CORS 相关的头 ,告知浏览器是否允许这个跨域请求。重要的 CORS 响应头 :Access-Control-Allow-Origin
: 指定允许哪些来源访问资源。可以是具体的域名,也可以是*
(表示允许任何来源)。Access-Control-Allow-Origin: https://example.com
请求示例 :
GET /api/data HTTP/1.1
Origin: https://client.com
响应示例 :
HTTP/1.1 200 OK
Access-Control-Allow-Origin: https://client.com
Content-Type: application/json
OPTIONS
请求),以确保目标服务器允许该请求。预检请求示例 :OPTIONS /api/data HTTP/1.1
Origin: https://client.com
Access-Control-Request-Method: POST
Access-Control-Request-Headers: Content-Type
预检响应示例 :
HTTP/1.1 200 OK
Access-Control-Allow-Origin: https://client.com
Access-Control-Allow-Methods: POST, GET, OPTIONS
Access-Control-Allow-Headers: Content-Type
Access-Control-Max-Age: 86400
Access-Control-Allow-Methods
: 指定允许的 HTTP 方法,如GET
、POST
等。
Access-Control-Allow-Headers
: 允许使用的自定义请求头。
Access-Control-Max-Age
: 指定预检请求的结果可以缓存多长时间,减少后续预检请求的次数。
Access-Control-Allow-Origin
: 允许的跨域源。
Access-Control-Allow-Methods
: 允许的 HTTP 请求方法。
Access-Control-Allow-Headers
: 允许的请求头字段。
Access-Control-Allow-Credentials
: 是否允许发送凭证(如 Cookies、HTTP 认证等)。值为true
时,浏览器允许客户 端发送和接收凭证。
Access-Control-Allow-Credentials: true
浏览器发起请求 :
当浏览器发起跨域请求时,会在请求头中添加Origin
字段,指示请求的来源。
服务器检查请求 :
服务器接收到请求后,根据自身配置检查Origin
,并决定是否允许该请求。如果允许,服务器会在响应头中返回相应的 CORS 头信息。
浏览器处理响应 :
浏览器根据服务器返回的Access-Control-Allow-Origin
等 CORS 头信息,决定是否允许页面访问返回的数据。如果服务器没有正确设置这些头,浏览器将阻止请求并抛 出 CORS 错误。
fetch("https://api.example.com/data", {
method: "GET",
credentials: "include", // 发送凭证,如Cookie
})
.then((response) => response.json())
.then((data) => console.log(data))
.catch((error) => console.error("Error:", error));
假设 api.example.com
设置了 CORS 响应头:
Access-Control-Allow-Origin: https://client.com
Access-Control-Allow-Credentials: true
PUT
或DELETE
),或自定义请求头(如Authorization
),浏览器会首先发送预检请求:OPTIONS /api/data HTTP/1.1
Origin: https://client.com
Access-Control-Request-Method: PUT
服务器响应:
HTTP/1.1 200 OK
Access-Control-Allow-Origin: https://client.com
Access-Control-Allow-Methods: PUT, GET, OPTIONS
Access-Control-Allow-Headers: Authorization
cors
中间件:const express = require("express");
const cors = require("cors");
const app = express();
app.use(
cors({
origin: "https://client.com", // 允许的来源
credentials: true, // 允许发送Cookies
})
);
app.get("/api/data", (req, res) => {
res.json({ message: "Hello World!" });
});
app.listen(3000);
server {
location /api/ {
add_header 'Access-Control-Allow-Origin' 'https://client.com';
add_header 'Access-Control-Allow-Credentials' 'true';
add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS';
add_header 'Access-Control-Allow-Headers' 'Authorization, Content-Type';
}
}
CORS 错误 :当浏览器禁止跨域请求时,会抛出 CORS 错误。这通常是因为服务器没有正确配置 CORS 响应头,或者浏览器不允许请求中的某些操作(如发送凭证)。
如何调试 :可以通过浏览器的开发者工具查看请求和响应头,检查Access-Control-Allow-*
相关头信息是否正确配置。
CORS 是为了解决同源策略下的跨域资源请求问题的浏览器机制。它通过一系列的 HTTP 请求头,让服务器控制哪些来源可以访问其资源,并规定了如何安全地进行跨域请求。在实现跨域请求时,确保服务器配置正确的 CORS 响应头是关键。
目标 :服务器、网站或网络资源。
方法 :利用僵尸网络(Botnet)来发起大规模流量攻击。
目标 :使用 SQL 数据库的网站或应用程序。
后果 :窃取或删除数据库中的敏感信息,或篡改应用行为。
目标 :Web 应用程序用户。
后果 :窃取用户的会话令牌、用户凭证,或者在用户浏览器上执行恶意操作。
目标 :用户登录系统、SSH、RDP 等需要密码的系统。
防御 :使用强密码、账户锁定策略和双因素认证。
目标 :PHP、ASP 等动态加载文件的 Web 应用程序。
后果 :攻击者可能获得服务器的控制权或敏感数据。
目标 :Web 应用中的合法用户。
后果 :攻击者可以利用用户的身份执行未经授权的操作。
特性 | Authentication(身份验证) | Authorization(授权) |
---|---|---|
目的 | 确认用户身份(你是谁) | 决定用户能做 什么(有什么权限) |
过程 | 验证用户凭证(用户名、密码、指纹等) | 检查用户是否有权限访问特定资源或执行特定操作 |
顺序 | 首先进行身份验证 | 身份验证之后进行授权 |
实例 | 用户输入用户名和密码,系统验证其合法性 | 用户登录后,系统决定用户能否查看特定页面或文件 |
应用范围 | 登录、身份识别、用户认证系统 | 权限管理、资源访问控制、功能限制 |
身份验证 :你输入用户名和密码登录银行网站。
授权 :你登录成功后,银行网站决定你可以查看账户余额,但不能访问管理员功能。
在实际应用中,身份验证和授权经常结合使用。例如,在 OAuth 2.0 中,用户首先通过身份验证登录(Authentication),然后授权应用程序访问其资源(Authorization)。