nginx------------缓存功能 ip透传 负载均衡 (六)

一、http 协议反向代理

(一)反向代理示例:缓存功能

缓存功能可以加速访问,如果没有缓存关闭后端服务器后,图片将无法访问,缓存功能默认关闭,需要开启。

​
proxy_cache zone_name | off; 默认off
#指明调用的缓存,或关闭缓存机制;Context:http, server, location
#zone_name 表示缓存的名称.需要由proxy_cache_path事先定义

proxy_cache_key string;
#缓存中用于“键”的内容,默认值:proxy_cache_key $scheme$proxy_host$request_uri;

proxy_cache_valid [code ...] time;
#定义对特定响应码的响应内容的缓存时长,定义在http{...}中

proxy_cache_path;
#定义可用于proxy功能的缓存;Context:http   必须放在http语句中

#调用缓存功能,需要定义在相应的配置段,如server{...};或者location等
proxy_cache proxycache;
proxy_cache_key $request_uri; #对指定的数据进行MD5的运算做为缓存的key
proxy_cache_valid 200 302 301 10m; #指定的状态码返回的数据缓存多长时间
proxy_cache_valid any 1m;   #除指定的状态码返回的数据以外的缓存多长时间,必须设置,否则不会缓存


proxy_cache_use_stale error | timeout | invalid_header | updating | http_500 | http_502 | http_503 | http_504 | http_403 | http_404 | off ; #默认是off
#在被代理的后端服务器出现哪种情况下,可直接使用过期的缓存响应客户端
#示例:在http配置定义缓存信息
   proxy_cache_path /var/cache/nginx/proxy_cache #定义缓存保存路径,proxy_cache会自动创建
   levels=1:2:2 #定义缓存目录结构层次,1:2:2可以生成2^4x2^8x2^8=2^20=1048576个目录
   keys_zone=proxycache:20m #指内存中缓存的大小,主要用于存放key和metadata(如:使用次数),一般1M可存放8000个左右的key
   inactive=120s  #缓存有效时间  
   max_size=10g; #最大磁盘占用空间,磁盘存入文件内容的缓存空间最大值
proxy_cache zone_name | off; 默认off
#指明调用的缓存,或关闭缓存机制;Context:http, server, location
#zone_name 表示缓存的名称.需要由proxy_cache_path事先定义

proxy_cache_key string;
#缓存中用于“键”的内容,默认值:proxy_cache_key $scheme$proxy_host$request_uri;



proxy_cache_valid [code ...] time;
#定义对特定响应码的响应内容的缓存时长,定义在http{...}中
 示例:
 proxy_cache_valid 200 302 10m;
 proxy_cache_valid 404 1m;
 
 
 
proxy_cache_path;
#定义可用于proxy功能的缓存;Context:http   必须放在http语句中
proxy_cache_path path [levels=levels] [use_temp_path=on|off] 
keys_zone=zone_name:size [inactive=time] [max_size=size] [manager_files=number] 
[manager_sleep=time] [manager_threshold=time] [loader_files=number] 
[loader_sleep=time] [loader_threshold=time] [purger=on|off] 
[purger_files=number] [purger_sleep=time] [purger_threshold=time];


#示例:在http配置定义缓存信息
   proxy_cache_path /var/cache/nginx/proxy_cache #定义缓存保存路径,proxy_cache会自动创建
   levels=1:2:2 #定义缓存目录结构层次,1:2:2可以生成2^4x2^8x2^8=2^20=1048576个目录
   keys_zone=proxycache:20m #指内存中缓存的大小,主要用于存放key和metadata(如:使用次数),一般1M可存放8000个左右的key
   inactive=120s  #缓存有效时间  
   max_size=10g; #最大磁盘占用空间,磁盘存入文件内容的缓存空间最大值
   
   
#调用缓存功能,需要定义在相应的配置段,如server{...};或者location等
proxy_cache proxycache;
proxy_cache_key $request_uri; #对指定的数据进行MD5的运算做为缓存的key
proxy_cache_valid 200 302 301 10m; #指定的状态码返回的数据缓存多长时间
proxy_cache_valid any 1m;   #除指定的状态码返回的数据以外的缓存多长时间,必须设置,否则不会缓存


proxy_cache_use_stale error | timeout | invalid_header | updating | http_500 | http_502 | http_503 | http_504 | http_403 | http_404 | off ; #默认是off
#在被代理的后端服务器出现哪种情况下,可直接使用过期的缓存响应客户端

#示例
proxy_cache_use_stale error http_502 http_503;


proxy_cache_methods GET | HEAD | POST ...;
#对哪些客户端请求方法对应的响应进行缓存,GET和HEAD方法总是被缓存

实验:

① 主配置文件的http模块中添加配置 
proxy_cache_path /data/nginx/proyxcache   levels=1:1:1 keys_zone=proxycache:20m inactive=120s max_size=1g;

 7-1代理服务器

[root@localhost ~]# vim /apps/nginx/conf/nginx.conf
proxy_cache_path /data/nginx/proyxcache   levels=1:1:1 keys_zone=proxycache:20m inactive=120s max_size=1g;
#开启缓存         缓存路径              生成文件夹比例是3级  从内存中借调20M专门存放缓存  有效期120秒    最大存储空间为1g
[root@localhost ~]# mkdir /data/nginx/
[root@localhost ~]# nginx -t

② 子配置文件添加配置

proxy_cache proxycache;
        proxy_cache_key $request_uri;
        #proxy_cache_key $host$uri$is_args$args;
        proxy_cache_valid 200 302 301 10m;
        proxy_cache_valid any 5m;

去7-3配置拖入图片:

③ 去浏览器访问代理端:

去7-1代理服务器查看缓存

如果把真实服务器关掉

再去浏览器访问,还是可以访问到的,这就是缓存用处哦

(1)如何清理nginx代理服务器缓存

方法1: rm -rf 缓存目录
方法2: 第三方扩展模块ngx_cache_purge

(2)自定义添加响应报文头部信息

Syntax: add_header name value [always];
Default;
Context: http,server,location,if in location
 
#添加响应报文的自定义首部:
add_header name value [always];
 
#示例:
add_header X-Via  $server_addr; #当前nginx主机的IP
add_header X-Cache $upstream_cache_status; #是否缓存命中
add_header X-Accel $server_name;  #客户访问的FQDN
 
 
add_header X-Via   
add_header X-Cache 
add_header X-Accel

小插曲:虚拟机要在主配置文件夹写子配置,子配置才可用

实验1:自定义添加响应报文头部信息

add_header X-Via     $server_addr;             #当前nginx主机ip

add_header X-Cache $upstream_cache_status;   #是否缓存命中,hit命中,miss未命中add_header X-Accel   $server_name;             #客户端访问的FQDN

add_header X-Via   $server_addr;
       add_header X-Cache $upstream_cache_status;
       add_header X-Accel $server_name;
server {
        listen 80;
        server_name www.lucky.com;
        root /data/;
        proxy_cache proxycache;
        proxy_cache_key $request_uri;
        #proxy_cache_key $host$uri$is_args$args;
        proxy_cache_valid 200 302 301 10m;
        proxy_cache_valid any 5m;
        add_header X-Via     $server_addr;
        add_header X-Cache $upstream_cache_status;
        add_header X-Accel   $server_name;
        add_header  cxk  hero;
        location ~* /api {
        proxy_pass http://192.168.246.8;
        }
        location ~* \.(jpg|jpeg|png|gif|bmp)$ {
        proxy_pass http://192.168.246.9;
        }
}
① 添加子配置文件

 查看新增头部字段信息

(二)实现反向代理客户端 IP 透传

IP透传的定义:Client客户端通过http服务访问192.168.246.7的代理服务器,代理服务器通过proxy跳转至192.168.246.8后端真实服务器,最后在Web后端真实服务器应该可以看到真实客户端的访问IP和代理服务器的IP。

实验1:IP透传-------单向透传     7-1用nginx    7-2用apache

①在代理服务器7-1写配置文件:
server{ 
        listen 80;       
        root /data/;
       server_name www.lucky.com;
       add_header X-Via   $server_addr;
       add_header X-Cache $upstream_cache_status;
       add_header X-Accel $server_name;
       proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
       location  / {
       proxy_pass http://192.168.246.8;
       }
}

当前访问192.168.246.7代理服务器跳转的是192.168.246.8后端真实服务器

proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; #添加客户端IP和反向代理服务器IP到请求报文头部
②在后端服务器(真实服务器)配置:开启httpd服务,关闭防火墙,并实时查看访问日志

解释:

③ 客户端7-3访问代理服务器

我们使用第三台机器作为客户端,通过代理服务器去访问后端真实服务器 

再去查看日志:

显示了真实的访问主机的ip地址,开启ip透传后可以查看到客户端ip

实验2:IP透传----------多级代理     三台主机均为nginx服务

①去7-1代理服务器配置:
server{
        listen 80;
        root /data/;
       server_name www.lucky.com;
       add_header X-Via   $server_addr;
       add_header X-Cache $upstream_cache_status;
       add_header X-Accel $server_name;
       proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
       location  / {
       proxy_pass http://192.168.246.8;
       }
}

②去7-2代理服务器配置:
[root@zzzcentos2 ~]#systemctl stop httpd
[root@zzzcentos2 ~]#yum install  epel-release -y
[root@zzzcentos2 ~]#yum install nginx -y
[root@zzzcentos2 ~]#systemctl restart nginx
[root@zzzcentos2 ~]#systemctl stop firewalld
[root@zzzcentos2 ~]#setenforce 0
[root@zzzcentos2 ~]#systemctl stop httpd
[root@zzzcentos2 ~]#systemctl restart nginx
[root@zzzcentos2 ~]#vim /etc/nginx/nginx.conf
[root@zzzcentos2 ~]#nginx -s reload
[root@zzzcentos2 ~]#systemctl restart nginx
[root@zzzcentos2 ~]#

proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; 

#添加客户端IP和反向代理服务器IP到请求报文头部

③ 后端服务器7-3新建web文件
[root@zzzcentos3 html]#cd /usr/share/nginx/html
[root@zzzcentos3 html]#echo welcome 7-3 > index.html
[root@zzzcentos3 html]#cat index.html
welcome 7-3

④检测:

⑤查看日志

(三)http反向代理负载均衡

在上一个节中Nginx可以将客户端的请求转发至单台后端服务器但是无法转发至特定的一组的服务器,而且不能对后端服务器提供相应的服务器状态监测

Nginx 可以基于ngx_http_upstream_module模块提供服务器分组转发、权重分配、状态监测、调度算法等高级功能

配置格式:

#自定义一组服务器,配置在http块内
upstream   web { 
 server 192.168.91.100    调度算法
 server 192.168.91.101
}

location  / {
pass_proxy  http://web/
}
官方文档: https://nginx.org/en/docs/http/ngx_http_up
server address [parameters];
#配置一个后端web服务器,配置在upstream内,至少要有一个server服务器配置。
#server支持的parameters如下:
weight=number #设置权重,默认为1,实现类似于LVS中的WRR,WLC等
max_conns=number  #给当前后端server设置最大活动链接数,默认为0表示没有限制
max_fails=number  #后端服务器的下线条件,当客户端访问时,对本次调度选中的后端服务器连续进行检测多少次,如果都失败就标记为不可用,默认为1次,当客户端访问时,才会利用TCP触发对探测后端服务器健康性检查,而非周期性的探测
fail_timeout=time #后端服务器的上线条件,对已经检测到处于不可用的后端服务器,每隔此时间间隔再次进行检测是否恢复可用,如果发现可用,则将后端服务器参与调度,默认为10秒
backup  #设置为备份服务器,当所有后端服务器不可用时,才会启用此备用服务器 sorry server   自己不能转自己
down    #标记为down状态
resolve #当server定义的是主机名的时候,当A记录发生变化会自动应用新IP而不用重启Nginx

hash KEY [consistent];
#基于指定请求报文中首部字段或者URI等key做hash计算,使consistent参数,将使用ketama一致性

hash算法,适用于后端是Cache服务器(如varnish)时使用,consistent定义使用一致性hash运算,一
致性hash基于取模运算
hash $request_uri consistent; #基于用户请求的uri做hash
hash $cookie_sessionid  #基于cookie中的sessionid这个key进行hash调度,实现会话绑定




ip_hash;
#源地址hash调度方法,基于的客户端的remote_addr(源地址IPv4的前24位或整个IPv6地址)做hash计算,以实现会话保持


least_conn;
#最少连接调度算法,优先将客户端请求调度到当前连接最少的后端服务器,相当于LVS中的WLC

实验拓朴草图

我们做实验,为了看到效果,所以内容不一样

真实环境中,内容是一样的

负载均衡  实验拓朴图:

apache后端服务器开启httpd服务,关闭防火墙,分别建立web文件

[root@zzzcentos3 ~]#systemctl stop nginx
[root@zzzcentos3 ~]#systemctl start httpd
[root@zzzcentos3 ~]#cd /var/www/html/
[root@zzzcentos3 html]#echo welcome to 7-3 > index.html
[root@zzzcentos3 html]#cat index.html
welcome to 7-3

调度算法 :

①实验:轮询算法 (一人一次)   

默认算法是轮询算法即反向代理服务器处理用户请求时,每个后端服务器都轮流提供响应 

(1)7-1代理服务器编辑主配置文件

(2)apache后端服务器开启httpd服务,关闭防火墙,分别建立web文件

检测:

如果有一天服务器宕机

那么只会跳转好的那一台服务器

当其中一台宕机,就不去访问他了,直接跳过

那是因为 nginx 有 健康性检测 机制 就不去坏的服务器了

nginx服务较为只能,通过tcp三次握手可以检查服务器健康性,当无法完成连通性,默认将不会访问从而提示报错。当故障服务器恢复正常后,再次轮巡调度。

② 加权轮询算法

在默认轮询的基础上增加权重,weight=number。如果后端有2个服务器其中一个配置权重为weight=5另外一个不配置默认是1,则有用户访问时分配给给有权重的服务器和不配置权重的服务器的比例为5:1

修改7-1代理服务器配置

检测:客户端7-1访问代理服务器

 ③最大链接数、连续检测和延迟上线

max_fails=3 ###连你3次,没反应就认为你宕机了

fail_timeout=30 ###上线后,给一个延迟时间30s,然后再连你

max_conns=10 ###最大连接数,只给你连10个

backup  #设置为备份服务器,当所有后端服务器不可用时,才会启用此备用服务器 sorry server   自己不能转自己 

 20     upstream web {
 21     server 192.168.246.8;
 22     server 192.168.246.9 max_conns=10 max_fails=3 fail_timeout=30s;
 23     }
#max_conns=number  #给当前后端server设置最大活动链接数,默认为0表示没有限制
#max_fails=number   后端服务器的下线条件,当客户端访问时,对本次调度选中的后端服务器连续进行检测多少次,如果都失败就标记为不可用,默认为1次,当客户端访问时,才会利用TCP触发对探测后端服务器健康性检查,而非周期性的探测
#fail_timeout=time 后端服务器的上线条件,对已经检测到处于不可用的后端服务器,每隔此时间间隔再次进行检测是否恢复可用,如果发现可用,则将后端服务器参与调度,默认为10秒。这样避免服务器刚上线不稳定再次导致业务失败
④备份服务器

当所有后端服务器不可用时,才会启用此备用服务器sorry server,自己不能转自己。

​
upstream web {
    hash $remote_addr;
   server 192.168.246.8;
   server 192.168.246.9 backup;
   }​

检测:客户端7-3访问代理服务器7-2    (7-2或7-1做客户机都可以)

如果服务器宕机,就会启用备用服务器

如果需要维护,具体看看在哪台写,可以写入写内容

⑤hash调度操作
(1)ip hash根据客户端ip:

ip hash  $remote_addr  客户端真实ip

基于客户端IP地址的负载均衡算法。它会根据客户端的IP地址,将该客户端的所有请求都发送到同一个后端服务器上。这样可以保证同一个客户端的所有请求都被发送到同一个后端服务器,从而保证了会话的一致性。

upstream web {
    hash $remote_addr;
   server 192.168.246.8;
   server 192.168.246.9;
   }

① 修改代理服务器配置

② 客户端访问

hash算法会将Web页面访问的缓存定在某一个代理服务器;但是hash算法有一个缺点就是hash还要除以权重,下次重载配置会更换Web服务的代理服务器

(2) url hash
 20     upstream web { 
 21     hash $request_uri;         #发送请求的地址,一旦确定不会轻易改变
 22     server 192.168.246.8;
 23     server 192.168.246.9;
 24     }

① 修改代理服务器配置

② 客户端访问

(3)cookie  
upstream web {
   hash $cookie_hello;
   server 192.168.246.8;
   server 192.168.246.9;
   }

① 修改代理服务器配置

② 客户端模拟加上cookie访问

也是固定会话

(4) fair

基于后端服务器的负载均衡算法。它会根据后端服务器的响应时间,将请求发送到响应时间最短的服务器上。这样可以保证请求被发送到处理能力最强的服务器上,从而提高系统的性能

二、总结

1、负载均衡

http {
  upstream web {
  server 192.168.246.8;
  server 192.168.246.9;
  }
 server {
  location / {
  proxy_pass http://web/;
  }
}
}

2、调度算法    

3、ip透传

4、httpd服务和nginx服务开启问题

三、stream 服务模块

官网

stream  实现反向代理功能, 是四层模块,只能控制tcp、udp

(实现反向代理功能,包括TCP协议代理)

 stream和http模块是同级

四层代理和七层代理的区别:
4层是指传输层的 TCP/UDP 协议

7层是指应用层的 HTTP 协议

代理原理:

     4层代理:使用 NAT(Network Address Translation)技术,即网络地址转换。即请求进来的时候,nginx 只修改数据包里面的目标IP、源IP、端口,然后就直接把数据包发给目标服务器(即nginx不知道请求的具体内容),目标服务器处理完成后,发给 nginx,nginx 数据包再做一次类似的修改,就返回给请求的客户端了。
     7层代理:nginx 读取并解析 Http 请求内容,然后将具体内容(请求行、请求头、空行、请求数据)转发到相应的服务器,转发的过程是:建立和目标机器的连接,然后转发请求,收到响应数据再转发给请求客户端。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

SpringCloud-MQ消息队列

一、消息队列介绍 MQ (MessageQueue) ,中文是消息队列,字面来看就是存放消息的队列。也就是事件驱动架构中的Broker。消息队列是一种基于生产者-消费者模型的通信方式,通过在消息队列中存放和传递消息,实现了不同组件、服务或系统…

Ajax(黑马学习笔记)

Ajax介绍 Ajax概述 我们前端页面中的数据,如下图所示的表格中的学生信息,应该来自于后台,那么我们的后台和前端是互不影响的2个程序,那么我们前端应该如何从后台获取数据呢?因为是2个程序,所以必须涉及到…

springboot+vue小区物业管理系统

摘 要 随着我国经济发展和城市开发,人们对住房的需求增大,物业管理也得到了发展。但是,基于人工的物业管理仍然是现阶段我国大部分物业管理公司的管理模式,这种管理模式存在管理人员效率低下、工作难度大的问题,同时…

Springboot+vue的医药管理系统(有报告)。Javaee项目,springboot vue前后端分离项目。

演示视频: Springbootvue的医药管理系统(有报告)。Javaee项目,springboot vue前后端分离项目。 项目介绍: 采用M(model)V(view)C(controller)三层…

前缀和 刷题笔记

关键在于 构造前缀和数组 类比前n项和 第n项和等于 前n-1项和加上当前项 s[n]s[n-1]a[n]; #include<iostream> #include<algorithm> #include<cstring> #include<cstdio> using namespace std; int n,m; const int N1e5100; int a[N],s[N]; int ma…

适配器模式在微服务的巧妙应用

适配器模式&#xff08;Adapter Pattern&#xff09;是一种结构型设计模式&#xff0c;它允许不兼容的接口之间可以一起工作。适配器模式通常用于将一个类的接口转换成客户端期望的另一种接口&#xff0c;从而使原本因接口不兼容而不能一起工作的类可以一起工作。 适配器模式的…

图书管理系统(使用IO流实现数据的读取和写入)--version4.0

目录 一、项目要求&#xff1a; 二、项目环境 三、项目使用的知识点 四、项目代码 五、项目运行结果 六、项目难点分析 图书管理系统--versions1.0&#xff1a; 图书管理系统--versions1.0-CSDN博客文章浏览阅读981次&#xff0c;点赞29次&#xff0c;收藏17次。本文使用…

代码随想录算法训练营第四十天|139.单词拆分,多重背包介绍,背包问题总结篇!

系列文章目录 代码随想录算法训练营第一天|数组理论基础&#xff0c;704. 二分查找&#xff0c;27. 移除元素 代码随想录算法训练营第二天|977.有序数组的平方 &#xff0c;209.长度最小的子数组 &#xff0c;59.螺旋矩阵II 代码随想录算法训练营第三天|链表理论基础&#xff…

创建型模式之原型模式

一、概述 1、工作原理&#xff1a;将一个原型对象传给要发动创建的对象(即客户端对象),这个要发动创建的对象通过请求原型对象复制自己来实现创建过程 2、通过克隆方法所创建的对象是全新的对象&#xff0c;它们在内存中拥有新的地址&#xff0c;每一个克隆对象都是独立的 3…

虚拟线程目前不推荐上生产的个人思考

1. pin 线程引发的问题比预期严重&#xff0c;需要修改的库繁多 截止目前 Java 21 虚拟线程一些比较严重的 Bug&#xff1a; 1. Thread.HoldsLock(Object) 这个方法&#xff0c;如果是虚拟线程调用&#xff0c;会在平台线程获取到锁之后&#xff0c;就算切换虚拟线程&#xf…

JavaScript闭包漏洞与修补措施

请先看下面一段代码 var obj (function () {var sonObj {a: 1,b: 2}return {get: function (v) {return sonObj[v]}}})()可以看出,这是一段很典型的js闭包代码,可以通过obj调用get方法传一个参数,如果传的是a就可以得到闭包内的对象sonObj.a var obj (function () {var sonO…

2024真正有效的苹果mac电脑清理工具CleanMyMac X

一、前言 对于Mac用户来说&#xff0c;电脑卡顿、运行缓慢无疑是一件令人头疼的事情。而市面上的清理软件又五花八门&#xff0c;效果参差不齐&#xff0c;如何才能找到一款真正有效的清理工具呢&#xff1f;今天&#xff0c;我们为大家推荐一款实力派电脑清理软件——CleanMy…

Canvs的js库:Fabric.js简单强大,用于绘制各种图形

Fabric.js是一个用于创建交互式的HTML5 Canvas应用程序的JavaScript库。它提供了一个简单而强大的API&#xff0c;用于在Web浏览器中绘制和操作图形对象。Fabric.js可以用于创建各种图形应用程序&#xff0c;例如绘图编辑器、图像编辑器、流程图、地图和数据可视化等。 官网文…

图像物体的边界- 华为OD统一考试(C卷)

OD统一考试&#xff08;C卷&#xff09; 分值&#xff1a; 200分 题解&#xff1a; Java / Python / C 题目描述 给定一个二维数组M行N列&#xff0c;二维数组里的数字代表图片的像素&#xff0c;为了简化问题&#xff0c;仅包含像素1和5两种像素&#xff0c;每种像素代表一个…

C语言中的字符魔法:大小写转换的艺术

引言 在C语言的世界里&#xff0c;字符处理是一项基础且重要的任务。字符作为编程中最基本的元素之一&#xff0c;承担着信息展示、数据交互等多重角色。特别是在处理文本信息时&#xff0c;字符的转换和识别显得尤为重要。大小写字母的转换就是其中一个常见的需求&#xff0c…

STM32作为SPI slave与主机异步通信

背景 最近被测试提了个BUG&#xff0c;说某款产品在用户按下前面板的按键后&#xff0c;对应的按键灯没有亮起来。前面板跟主机是通过SPI口通信&#xff0c;前面板是从机&#xff0c;从机想要主动发送消息&#xff0c;需要通过GPIO中断来通知主机&#xff1a; 上图前面板是ST…

flurl升级之后没有FlurlNewtonsoftJsonSerializer

新建NewtonsoftJsonSerializer.cs /// <summary> /// ISerializer implementation based on Newtonsoft.Json. /// Default serializer used in calls to GetJsonAsync, PostJsonAsync, etc. /// </summary> public class NewtonsoftJsonSerializer : IJsonSerial…

【CSP试题回顾】202312-1-仓库规划

CSP-202312-1-仓库规划 解题思路 定义结构体和变量&#xff1a; 结构体 MyWareHouse&#xff0c;用来存储每个仓库的索引&#xff08;编号&#xff09;和位置编码。定义了整数 n 和 m&#xff0c;分别代表仓库的数量和位置编码的维数。定义了一个 vector<MyWareHouse> 的…

图解Vivado工程的目录结构

一、目录结构 ​在使用Vivado进行工程设计时&#xff0c;创建工程以及运行工程的过程中都会生成大量的目录和文件&#xff0c;下面图将对目录和文件结构及功能进行一个简单说明。 工程示例图 添加图片注释&#xff0c;不超过 140 字&#xff08;可选&#xff09; 二、参考资料…

ShardingJdbc分库分表-浅谈分表原理

文章目录 为什么要分库分表一、分库分表二、不停机分库分表数据迁移 为什么要分库分表 一般的机器&#xff08;4核16G&#xff09;&#xff0c;单库的MySQL并发&#xff08;QPSTPS&#xff09;超过了2k&#xff0c;系统基本就完蛋了。最好是并发量控制在1k左右。这里就引出一个…