3-16
1 Node 分布式
Cap 理论
一个分布式系统最多可满足:一致性、可用性、分区容忍性的其中两项
进程与线程
- 进程:一个独立的程序,是操作系统分配资源的最小单位
- 线程:是进程中执行运行的最小单位
Node 特性
- 单线程
- 异步 I/O
- 事件驱动
Node 分布式
- Nginx:调度,负载均衡
- Node 集群:处理业务
- Redis:同步状态
Node 多线程运行
cluster 模块,一个主线程,多个 worker 线程,通过算法协调 worker 之间的
[1][【已完结】最新 node 分布式大全](https://www.bilibili.com/video/BV1bg411x7Xm?p=3&spm_id_from=pageDriver&vd_source=4065bea3d3139c3fda8b128a6a3a90a7)
2 for of 如何获取索引
for (const [index, item] of arr.entries()) {
// ...
}
3 加载字体示例
https://fonts.googleapis.com/css?family=Open+Sans:100,400,400i,600,800
[1][转换字体格式](https://transfonter.org/)
4 docker redis with password
redis 设置密码
docker run -d \
-h redis \
-v $PWD/redis:/data \
-p 6380:6379 \
--name my-redis2 \
--restart always \
redis redis-server --appendonly yes --requirepass "ginlink"
docker run -d \
-h redis \
-v $PWD/redis:/data \
-p 6379:6379 \
--name redis-nst \
--restart always \
redis redis-server --appendonly yes
docker run -d \
-h redis \
-v $PWD/redis:/data \
-p 6379:6379 \
--name redis \
--restart always \
redis redis-server --appendonly yes --requirepass "8HHoDacSmzIF"
5 小程序局部刷新
思想:1.同组件,删除一个元素时,给元素打标记,UI 层根据该标记显示或隐藏 2.跨组件同理,将数据放状态管理器中 3.同组件虚拟列表同理 4.跨组件虚拟列表,暂无解决方案
[1][微信小程序 setData 局部刷新列表](https://www.cnblogs.com/liangyuji/p/13509598.html)
6 mongo 设置密码
6.1 mongo 单机设置密码
docker run -d \
-p 27017:27017 \
-v ~/data/mongo/mongo_chatgpt:/data/db \
-e MONGO_INITDB_ROOT_USERNAME=root \
-e MONGO_INITDB_ROOT_PASSWORD=admin \
--name mongo_chatgpt \
mongo \
--replSet rs0
注意 \ 后面不能有空格
6.1 mongo 副本集设置密码
cd ~
mkdir -p /root/mongodb_test/mongo_cluster/config
cd /root/mongodb_test/mongo_cluster/config
vim /root/mongodb_test/mongo_cluster/config/mongod.conf
# mongod.conf
# for documentation of all options, see:
# http://docs.mongodb.org/manual/reference/configuration-options/
# Where and how to store data.
#storage:
# dbPath: /data/db
# engine:
# wiredTiger:
# where to write logging data.
systemLog:
destination: file
logAppend: true
path: /data/log/mongo.log
# network interfaces
#net:
# port: 27017
# bindIp: 127.0.0.1
# how the process runs
#processManagement:
# timeZoneInfo: /usr/share/zoneinfo
# 安全项先保持注释状态,配好集群后放开。mongo.key后面步骤里会有生成。
# security:
# keyFile: /etc/mongo/mongo.key
# authorization: enabled
#operationProfiling:
# 配副本集名
replication:
replSetName: "rs0"
#sharding:
## Enterprise-Only Options:
#auditLog:
#snmp:
cd ..
# 增加启动脚本 mongo_node1.sh
vim run_mongo_cluster_node1.sh
docker run --name mongo_node1 \
-h mongo_node1 \
-v /root/mongodb_test/mongo_cluster/data/node1:/data/db \
-v /root/mongodb_test/mongo_cluster/log/node1:/data/log \
-v /root/mongodb_test/mongo_cluster/config:/etc/mongo \
-p 27017:27017 \
--restart=always \
-d mongo \
--config /etc/mongo/mongod.conf
# 增加启动脚本 mongo_node2.sh
docker exec -it mongo_node1 mongosh
# 设置集群,主要,这里填写的公网ip,如果填内网ip,会导致其他无法正常访问该服务
# 原因未知
rs.initiate({
_id: 'rs0',
members: [
{ _id: 0, host: '110.42.130.99:27017' },
{ _id: 1, host: '110.42.130.99:27018' },
],
});
# 设置密码
use admin
db.createUser({user:"ginlink",pwd:"xxx",roles:[{role:'root',db:'admin'}]})
# 停止容器
docker stop mongo_node1
docker stop mongo_node2
# 打开授权
vim /root/mongodb_test/mongo_cluster/config/mongod.conf
# 增加访问文件
openssl rand -base64 756 > /root/mongodb_test/mongo_cluster/config/mongo.key
sudo chown 999 /root/mongodb_test/mongo_clusterconfig/config/mongo.key
sudo chmod 400 /root/mongodb_test/mongo_clusterconfig/config/mongo.key
# 打开容器
docker start mongo_node1
docker start mongo_node2
[1][用 Docker 搭建 MongoDB 集群(副本集)并启用认证用户名密码登录](https://www.jianshu.com/p/92b1f01977eb)
7 Nestjs 有哪些异常
- HttpException:HTTP 异常,用于表示 HTTP 响应中的错误状态码,例如 400、401、404 等。可以在控制器中抛出 HttpException,Nest.js 将自动处理并生成相应的 HTTP 响应。
- BadRequestException:用于表示客户端发送了无效请求的异常,通常与 HTTP 状态码 400(Bad Request)一起使用。
- UnauthorizedException:用于表示未经授权的请求的异常,通常与 HTTP 状态码 401(Unauthorized)一起使用。
- NotFoundException:用于表示请求的资源不存在的异常,通常与 HTTP 状态码 404(Not Found)一起使用。
- ForbiddenException:用于表示请求的操作不被允许的异常,通常与 HTTP 状态码 403(Forbidden)一起使用。
- InternalServerErrorException:用于表示服务器内部错误的异常,通常与 HTTP 状态码 500(Internal Server Error)一起使用。
- RpcException:用于表示 RPC 调用失败的异常,例如使用 Microservices 时发生的错误。
- WebSocketException:用于表示 WebSocket 连接错误的异常,例如连接关闭或消息发送失败。
8 Nestjs 如何指定内容到 dist 中?
[1] https://docs.nestjs.com/cli/monorepo#assets
Nestjs 不会自动输出一些杂项,要输出指定内容到 dist,需要配置 assets 字段,例如:复制 resources/* 到 dist/src 中(整个 resources 目录被复制到 dist/src 中)
{
"$schema": "https://json.schemastore.org/nest-cli",
"collection": "@nestjs/schematics",
"sourceRoot": "src",
"compilerOptions": {
"assets": [
{
"include": "resources/*",
"outDir": "dist/src"
}
]
}
}
9 Shell 中 ; 和 && 以及 || 区别?
command1 ; command2
的意思是先执行command1
,然后再执行command2
,不管command1
的执行结果是什么。也就是说,无论command1
是否成功执行,command2
都会被执行。command1 && command2
的意思是先执行command1
,如果command1
成功执行(返回 0),则执行command2
,否则不执行command2
。也就是说,如果command1
执行失败,则command2
不会被执行。|| 则表示 1 失败 则执行 2
10 Nginx
功能:1.反向代理 2.负载均衡
格式
有 4 种格式,权重依次降低
server {
# 1.全匹配(=),例如:匹配/a路径
location = /a {
echo '/a';
}
# 2.以什么开头(&~),例如:匹配以/a开头路径
location ^~ /a {
echo '^~ /a';
}
# 3.正则(~),例如:匹配任何非单词的路径
location ~ /\W {
echo '~ /\W';
}
# 4.跟2原理一样,但写法不同,例如:匹配任何/开头的路径
location / {
echo 'hello';
}
}
反向代理
server {
# 将/a代理到3000端口/a路径
location /a {
proxy_pass http://localhost:3000;
}
# 将/a代理到3000端口的/路径
location /a/ {
proxy_pass http://localhost:3000/;
}
}
注意上面两种写法的差异
负载均衡
http {
upstream group1 {
# 3001服务器和3002服务器轮流接受访问
server localhost:3001 weight=1;
server localhost:3002 weight=1;
}
server {
location /a/ {
proxy_pass http://group1/;
}
}
}
nginx 负载均衡的三种方式:1、轮询模式;2、最少连接;3、ip_hash
轮询模式
普通轮询方式
该方式是默认方式,轮询适合服务器配置相当,无状态且短平快的服务使用。另外在轮询中,如果服务器挂掉,会自动剔除该服务器,该方式适合服务器配置相当,无状态且短平快的服务使用,也适用于图片服务器集群和纯静态页面服务器集群。
权重轮询方式
如果在 upstream 中配置的 server 参数后追加 weight 配置,则会根据配置的权重进行请求分发。此策略可以与 least_conn 和 ip_hash 结合使用,适合服务器的硬件配置差别比较大的情况。
最少连接
轮询算法是把请求平均的转发给各个后端,使它们的负载大致相同;但是,有些请求占用的时间很长,会导致其所在的后端负载较高。这种情况下,least_conn 这种方式就可以达到更好的负载均衡效果,适合请求处理时间长短不一造成服务器过载的情况。
ip_hash
上述 weight 权重模式方式存在一个问题,在负载均衡系统中,假如用户在某台服务器上登录了,那么该用户第二次请求的时候,因为我们是负载均衡系统,每次请求都会重新定位到服务器集群中的某一个,那么已经登录某一个服务器的用户再重新定位到另一个服务器,其登录信息将会丢失,这样显然是不妥的。
可以采用 ip_hash 指令解决这个问题,如果客户已经访问了某个服务器,当用户再次访问时,会将该请求通过哈希算法,自动定位到该服务器。每个请求按访问 ip 的 hash 结果分配,这样每个访客固定访问一个后端服务器,可以解决 session 不能跨服务器的问题。
[1][nginx 负载均衡的三种方式](https://worktile.com/kb/ask/29615.html)
11 CI/CD
常见 CI/CD 工具:1.Jenkins 2.Travis
Jenkins
缺点:需要一台服务器
12 计算机网络
计算机网络分了几层,其中 数据链路层、网络层 为重点