Nginx分布式框架

Nginx

是一个高性能的HTTP和反向代理web服务器。

提供的服务:

  • 动静分离(web 服务)
  • 负载均衡 (反向代理)
  • web 缓存
  • 内存少,并发能力强(支持50,000 个并发)

安装

下载地址:nginx.org/en/download...

  1. 下载完上传Linux服务器上,一般安装在/usr/local下,进行解压

    linux 复制代码
    tar -zxvf nginx-1.18.0.tar.gz
  2. 进行配置,在nginx根目录下执行

    linux 复制代码
    # 1.安装编译工具文件库
    yum -y install make zlib zlib-devel gcc-c++ libtool openssl openssl-devel
    
    # 方式1:
    # 2.使用默认配置
    ./configur
    
    # 3.然后回车,进行编译
    make
    
    # 4.然后回车,安装
    make install
    
    # 方式2:注意:如果自定义安装
    # 1. 创建nginx临时目录
    mkdir -p /var/temp/nginx
    
    # 2. 进入nginx安装目录,指定配置文件
    ./configure \
    # 安装在哪个目录下
    --prefix=/usr/local/nginx/nginx \
    --conf-path=/usr/local/nginx/nginx.conf  \
    --pid-path=/var/run/nginx/nginx.pid \
    --lock-path=/var/lock/nginx.lock \
    --error-log-path=/var/log/nginx/error.log \
    --http-log-path=/var/log/nginx/access.log \
    --with-http_gzip_static_module \
    --http-client-body-temp-path=/var/temp/nginx/client \
    --http-proxy-temp-path=/var/temp/nginx/proxy \
    --http-fastcgi-temp-path=/var/temp/nginx/fastcgi \
    --http-uwsgi-temp-path=/var/temp/nginx/uwsgi \
    --http-scgi-temp-path=/var/temp/nginx/scgi \
    --with-http_stub_status_module \
    --with-http_ssl_module 
    # --with-http_ssl_module 是配置支持https
    
    # 3.编译、安装
    make
    make install
  3. 查找安装路径:

    linux 复制代码
    whereis nginx
    # 默认在/usr/local/nginx

    启动Nginx,默认是80端口,在浏览器输入服务器IP地址,就能访问Nginx默认页面,说明安装成功。

卸载Nginx:

linux 复制代码
# 关闭nginx进程
./nginx -s stop
rm -rf /user/local/nginx
make clean

常用命令

启动/停止/退出nginx:

linux 复制代码
# 启动
cd /usr/local/nginx/sbin/
./nginx
start nginx
# 指定配置文件启动
/usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf
或者
./nginx -c /usr/local/nginx/conf/nginx.conf

# 停止
./nginx -s stop

# 安全退出,优雅退出
./nginx -s quit

# 重新加载配置文件
./nginx -s reload

# 查看配置文件是否错误
./nginx -t

# 查看nginx进程
ps aux|grep nginx

设置nginx开机启动:

linux 复制代码
vim /etc/rc.local
然后在底部增加
/usr/local/nginx/sbin/nginx

其他命令:

linux 复制代码
# 开启防火墙
service firewalld start
# 关闭防火墙
service firewalld stop
# 查询端口是否开放
firewall-cmd --query-port=8080/tcp
# 开放80端口
firewall-cmd --permanent --add-port=80/tcp
# 移除端口
firewall-cmd --permanent --remove-port=8080/tcp

Nginx目录结构有哪些:

conf 复制代码
/usr/local/nginx
├── client_body_temp
├── conf                             # Nginx所有配置文件的目录
│   ├── fastcgi.conf                 # fastcgi相关参数的配置文件
│   ├── fastcgi.conf.default         # fastcgi.conf的原始备份文件
│   ├── fastcgi_params               # fastcgi的参数文件
│   ├── fastcgi_params.default       
│   ├── koi-utf
│   ├── koi-win
│   ├── mime.types                   # 媒体类型
│   ├── mime.types.default
│   ├── nginx.conf                   # Nginx主配置文件
│   ├── nginx.conf.default
│   ├── scgi_params                  # scgi相关参数文件
│   ├── scgi_params.default  
│   ├── uwsgi_params                 # uwsgi相关参数文件
│   ├── uwsgi_params.default
│   └── win-utf
├── fastcgi_temp                     # fastcgi临时数据目录
├── html                             # Nginx默认站点目录
│   ├── 50x.html                     # 错误页面优雅替代显示文件,例如当出现502错误时会调用此页面
│   └── index.html                   # 默认的首页文件
├── logs                             # Nginx日志目录
│   ├── access.log                   # 访问日志文件
│   ├── error.log                    # 错误日志文件
│   └── nginx.pid                    # pid文件,Nginx进程启动后,会把所有进程的ID号写到此文件
├── proxy_temp                       # 临时目录
├── sbin                             # Nginx命令目录
│   └── nginx                        # Nginx的启动命令
├── scgi_temp                        # 临时目录
└── uwsgi_temp                       # 临时目录

核心配置文件结构

配置文件默认是放在/usr/local/nginx/conf/nginx.conf,配置文件中默认有三大块:全局块、events块、http块。

conf 复制代码
# 一般几个CPU,配置几个工作线程
worker_processes  1;

events {
   # 一个线程最大的连接数1024个
    worker_connections  1024;
}

http {
    # 在配置文件 conf/mime.types 下有配置,文件后缀对应的打开匹配文件后缀的配置
    include       mime.types;
    default_type  application/octet-stream;
    sendfile        on;
    keepalive_timeout  65;

    server {
        listen       80;
        server_name  localhost;
        location / {
            root   html;
            index  index.html index.htm;
        }
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }
    }
}

全局块

user指令:

用于配置运行Nginx服务器的worker进程的用户和用户组。我们最开始创建Nginx时,执行./configure --user=user --group=group,在配置文件添加

conf 复制代码
user 用户名;

然后再Linux命令行,创建一个用户

conf 复制代码
useradd 用户名
user 用户名
# 然后该用户有/home/用户名/`目录下访问权限,其他目录没有权限

work process指令

nginx是进程模型,分为主进程、工作进程。

master_process:用来指定是否开启工作进程。

worker_processes:配置Nginx生成工作进程的数量,一般与CPU的内核数-1数保存一致。

conf 复制代码
# 设置工作进程
worker_processes  2;

events块

accept_mutex指令:

配置:accept_mutex on|off ;用来设置Nginx网络连接序列化。

worker_connections指令:

默认是 worker_commections 512;用来配置单个worker进程最大的连接数;

(单个worker进程最大的连接数 * N个worker线程),这个值不能大于操作系统支持打开的最大文件句柄数量。(Linux一般是65535)

conf 复制代码
# 修改操作系统支持打开的最大文件句柄数量,临时修改
ulimit -HSn 2048
# 永久修改
vi /etc/security/limits.conf

http块

include指令:

包含和导入外部文件,进行模块化的划分。

conf 复制代码
include mime.types;
default_type application/octet-stream;

sendfile指令:

启用文件的高效传输,打开有利于文件传输的性能。

conf 复制代码
sendfile   on;  # 启用高效传输,与tcp_nopush联合使用
tcp_nopush on;  # 当请求累积一定大小的时候,在进行发送

keepalive_requests指令:

用来设置一个keep-alive连接使用的次数,客户端连接服务的超时时间。

gzip指令:

开启它有利于文件和请求数据的传输。

conf 复制代码
gzip on

server块:

listen指令:

用来配置监听端口。

server_name指令:

用来设置虚拟主机服务名称。

conf 复制代码
server {
	listen 80;
	server_name www.xx1.cn www.xx2.cn;
	# 可以配置多个,也可以通配符进行配置 *.itcast.cn www.itcast.* 注意*只能在首尾部分
}

location指令:

用来设置请求的URI。

conf 复制代码
server {
	...
	server_name xxx.cn
	# 可以在location后面加=(精确匹配)~(支持正则)~*(支持正则,支持大写)
	location /abc{
		default_type text/plain;
		return 200 "access success";
	}
}
# 例子:请求:http://127.0.0.1/bbs,会匹配这里,页面存放路径在html/bbs目录下
location /bbs {
       root html;
}
# 可以模糊匹配,动静分离这里就是模糊匹配

error_page指令:

设置网站的错误页面。

conf 复制代码
server {
	error_page 404 http://www.404.cn;
}
或者
server{
	error_page 404 /50x.html;
	error_page 500 502 503 504 /50x.html;
	location =/50x.html{
		root html;
	}
}

gzip_static指令:

解决Gzip和sendfile共存问题,需要添加ngx_http_gzip_static_module模块,才能使用gzip_static指令。

conf 复制代码
# 1.查询当前Nginx的配置参数
nginx -V
# 2.清楚编译内容
cd /root/nginx/core/nginx-xxx
make clean
# 3.使用configure来配置参数
./configure (...之前的内容) --with-http_gzip_static_module
# 4.进行编译
make
# 5.将objs目录下的nginx二进制执行文件移动到nginx安装目录下的sbin下
mv objs/nginx /usr/local/nginx/sbin
# 6.执行更新命令
make upgrade
# 7.在配置文件http块下添加
gzip_static on

proxy块:

反向代理模块

proxy_pass指令:

令用来设置被代理服务器地址。

proxy_set_header指令:

该指令可以更改Nginx服务器接收到的客户端请求的请求头信息,然后 将新的请求头发送给代理的服务器。

conf 复制代码
server {
	listen 8080;
	server_name localhost;
	# 设置DNS的IP,用来解析proxy_pass域名
	resolver 8.8.8.8;
	location /server {
		proxy_pass http://192.168.xx.xx:8080/;
		proxy_set_header username TOM;
	}
}

配置文件案例:

基本部署:

conf 复制代码
# 全局块
# 配置允许运行Nginx工作进程的用户和用户组
user www;
# 一般是CPU核数-1
worker_processes 2; 

# 配置Nginx服务器运行对错误日志存放的路径
error_log logs/error.log;
pid logs/nginx.pid;

# 全局块
events{
	accept_mutex on;
	multi_accept on;
	# 设置Nginx的worker进程最大的连接数
	worker_connections 1024;
}
# http块
http{
	include mime.types;
	default_type application/octet-stream;
	# 配置允许使用sendfile方式运输,开启高效的文件传输
	sendfile on;
	tcp_nopush on;
	tcp_nodelay on;
	# 配置连接超时时间
	keepalive_timeout 65;
	
	# Gzip压缩功能配置
	include /home/www/gzip/nginx_gzip.conf;
	# 配置请求处理日志格式
	log_format server1 '===>server1 access log';
	# log_format server2 '===>server2 access log';
	
	# server块 开始 #
	include /home/www/conf.d/*.conf;
	# server块 结束 #

}

server1的配置文件

conf 复制代码
server{
	listen 8081;
	# 设置虚拟主机服务名称,可以用域名,多个空格隔开,也可以通配符"*"例子:*.good.cn
	server_name localhost;
	# 配置请求处理日志存放路径
	access_log /home/www/myweb/server1/logs/access.log server1;
	
	location /server1/location1{
		root /home/www/myweb;
		index server1.html;
	}
	location /server1/location2{
		root /home/www/myweb;
		index server2.html;
	}
	# 配置错误页面转向
	location = /404.html {
		root /home/www/myweb;
		index 404.html;
	}
}

nginx_gzip.conf的配置文件

conf 复制代码
# 开启gzip功能
gzip on;
# 压缩源文件类型,例 application/javascript application/html;在mine.types里查看。
gzip_types *; 
# 压缩级别 1-9
gzip_comp_level 6; 
# 进行压缩响应页面的最小长度,小于这个数不进行压缩
gzip_min_length 1024k;
# 缓存空间大小,使用默认就好
gzip_buffers 4 16K; 
# 指定压缩响应所需要的最低HTTP请求版,使用默认就好
gzip_http_version 1.1;
# 往头信息中添加压缩标识,默认是off
gzip_vary on;
# 对IE6以下的版本都不进行压缩
gzip_disable "MSIE [1-6]\.";

解决跨域问题:

用add_header指令,该指令可以用来添加一些头信息

conf 复制代码
location /xxx{
	add_header 'Access-Control-Allow-Origin' *;
	add_header 'Access-Control-Allow-Credentials' 'true';
	add_header 'Access-Control-Allow-Methods' GET,POST,PUT,DELETE;
	add_header 'Access-Control-Allow-Headers' *;
	root /home/www/myweb;
	index server1.html;
}

解决静态资源防盗链:

用valid_referers指令,如果在添加上域名或者IP地址,如果该值为1就返回403

conf 复制代码
location /xxx {
	valid_referers none blocked www.baidu.* 127.0.0.1;
	if ($invalid_referer){
		# 返回403
		return 403
		# 如果让该图片显示其他默认图片
		rewrite ^/ /images/图片名.png break;
	}
	root /usr/local/nginx/html;
}

# 如果不算这个域名,会重定向403
valid_referers *.goodysr.cn
if($invalid_referer){
	return 403
}

Rewrite域名跳转:

访问xxx1、xxx2域名 会跳转到zong的域名下。 标记说明: 1、last:本条规则匹配玩成后,继续向后新的location URL规则,一般用在server和if中。 2、break:本条规则匹配完成即终止,不再匹配后面的任何规则,一般使用在location中。 3、redirect:返回302临时重定向,浏览器地址会显示跳转后的URL地址 4、permanent:返回301也就重定向,浏览器地址栏会现实跳转后的URL地址

conf 复制代码
server {
	listen 80;
	server_name www.xxx1.com www.xxx2.cn;
	rewrite ^(.*) http://www.zong.cn$1;
	# 也可以某个路径下进行跳转,没有$1,代表请求后面的参数,不会携带
	location /user {
		rewrite ^/user(.*)$ http://www.user.cn$1;
	}
}

配置SSL:

步驟1:生成证书

1.使用阿里云等平台购买: 或者使用openssl

购买证书,然后创建证书,进行绑定域名,然后审核通过,下载证书。

在服务器上某文件下(nginx/conf下),创建cert目录,存放所下载的证书文件。

conf 复制代码
server {
	listen 80;
	server_name 域名;
	# 将http请求重定向https上
	rewrite ^(.*)$ https://$host$1;
	location / {
		root html;
		index index.html index.htm;
	}
}
server {
	listen 443 ssl;
	server_name 域名;
	root html;
	index index.html index.htm;
	# 证书文件
	ssl_certificate cert/xxx.pem;
	ssl_certificate_key cert/xxx.key;
	ssl_session_cache shared:SSL:1m;
	ssl_session_timeout 5m;
	# 加密规则
	ssl_ciphers HIGH:!aNULL:!MD5;
	# 表示使用TLS协议类型
	ssl_protocols TLSv1 TLSv1.1 TLSv1.2
	ssl_prefer_server_ciphers on;
	location / {
		root html;
		index index.html index.htm;
	}
}

配置负载均衡

负载均衡状态 :

  • down 不参与负载均衡
  • backup 备份服务器,不执行,当主服务挂的时候才执行
  • max_fails 允许请求失败的次数,max_fails =3
  • fail_timeout 经过max_fails失败后,服务暂停时间,fail_timeout=15
  • max_conns 限制最大的接收连接数,当这台机器最大并发是100,也就是值为100

负载均衡策略:

  • 轮询 默认方式

  • weight 权重方式

  • ip_hash 根据ip分配方式 ,这样可以解决session不共享问题

    conf 复制代码
    upstream backend{
    	ip_hash;
    	server 127.0.0.1:9091;
    	server 127.0.0.1:9092;
    }
  • least_conn 根据最少连接方式 ,适合请求处理时间长短不一造成服务器过载。

  • url_hash 根据URL分配方式 ,hash &request_uri;

  • fair 根据响应时间方式

conf 复制代码
# 负载均衡配置
upstream backend {
	server 127.0.0.1:9091 down;
	server 127.0.0.1:9092 max_conns=100 weight=1;
	server 127.0.0.1:9093 weight=2;
}
upstream backend2{
	hash &request_uri;
	server 127.0.0.1:9091;
	server 127.0.0.1:9091;
}
server {
    listen       80;
    server_name  localhost;
    location / {
        #root   html;
        #index  index.html index.htm;
		proxy_pass http://backend;
    }	
    location /backend2/ {
		proxy_pass http://backend2;
	}
}

配置缓存:

conf 复制代码
http{
	# 设置缓存根目录 levels缓存规则 keys_zone缓存名,缓存大小,1m=8000连接地址
 	# inactive缓存多久会被情况 max_size缓存空间最大空间
	proxy_cache_path /usr/local/cache levels=2:1 keys_zone=缓存名:200m inactive=1d max_size=20g;
	
	upstream backend{
		server 192.168.200.146:8080;
	}
	server {
		listen 8080;
		server_name localhost;
		location / {
			# 设置不缓存 如果是js文件不进行缓存
			if ($request_uri ~ /.*\.js$){
				set $nocache 1;
			}
			proxy_no_cache $nocache $cookie_nocache $arg_nocache $arg_comment;
			proxy_cache_bypass $nocache $cookie_nocache $arg_nocache $arg_comment;
			proxy_cache 缓存名;
			proxy_cache_key $scheme$proxy_host$request_uri;
			# 当请求为5次才进行缓存
			proxy_cache_min_uses 5;
			# 当缓存状态码是200 ,缓存时长5天
			proxy_cache_valid 200 5d;
			# 当缓存状态码是404,缓存时长30s
			proxy_cache_valid 404 30s;
			proxy_cache_valid any 1m;
			add_header nginx-cache"$upstream_cache_status";
			proxy_pass http://backend;
		}
	}
}

删除对应的缓存目录:

conf 复制代码
rm -rf /usr/local/proxy_cache/......

动静分离:

conf 复制代码
upstream webservice{
	# tomcat地址
	server 192.168.10.xxx:8080;
}
server {
	listen 80;	
	server_name localhost;
	# 动态资源
	location /demo {
		proxy_pass http://webservice;
	}
	# 静态资源
	location ~/.*\.(png|jpg|gif|js){
		root html/web; # 静态文件地址
		gzip on;
	}
	location / {
		root html/web;
		index index.html index.htm;
	}
}

搭建高可用Nginx集群:

准备两台Nginx机器,需要在这两台机器安装Keepalived,通过 VRRP 协议实现高可 用功能。

安装Keepalived

conf 复制代码
步骤1:从官方网站下载keepalived,官网地址 https://keepalived.org/
步骤2:将下载的资源上传到服务器 
keepalived-2.0.20.tar.gz
步骤3:创建keepalived目录
mkdir keepalived
步骤4:将压缩文件进行解压缩,解压缩到指定的目录
tar -zxf keepalived-2.0.20.tar.gz -C keepalived/
步骤5:对keepalived进行配置,编译和安装
cd keepalived/keepalived-2.0.20
./configure --sysconf=/etc --prefix=/usr/local
make && make install

配置文件

一般在 /etc/keepalived/keepalived.conf ,我们进行配置

conf 复制代码
global_defs {
	# 当keepalived发送切换时需要发email给具体的邮箱地址
	notification_email {
		xx1@xx1.com
		xx2@xx2.com
	}
	# 设置发件人的邮箱信息
	notification_email_from yy@xx3.com
	# 指定smpt邮箱服务地址
	smtp_server 192.168.200.1
	smtp_connect_timeout 30
	# 服务器的一个标识 A机器
	router_id keepalivedA
	vrrp_skip_check_adv_addr
	vrrp_strict
	vrrp_garp_interval 0
	vrrp_gna_interval 0
}
vrrp_instance VI_1 {
	# 两个值可选 MASTER主机 BACKUP从机
	state MASTER
	# 非抢占,这个参数只能用于state为backup
	# 所以我们把state都设置成backup 让其通过priority来竞争,实现主机和从机
	nopreempt
	interface ens33
	virtual_router_id 51
	# 优先级高的将成为主机
	priority 100
	advert_int 1
	authentication {
		# 认证方式
		auth_type PASS
		# 指定认证使用的密码,最多8位
		auth_pass 1111
	}
	virtual_ipaddress {
		# 虚拟IP地址设置虚拟IP地址
		192.168.200.222
	}
}

启用keepalived

conf 复制代码
cd /usr/local/sbin
./keepalived

编写脚本实现自动切换

  1. 在keepalived配置文件中添加对应的配置像

    conf 复制代码
    gloval_defs{
    	....
    }
    
    # ck_n为脚本名称
    vrrp_script ck_n{
    	script "脚本位置"
    	interval 3 #执行时间间隔
    	weight -20 #动态调整vrrp_instance的优先级
    }
    
    vrrp_instance VI_1 {
    	...
    	virtual_ipaddress {
    		192.168.200.111
    	}
    	# 使用Shell脚本
    	track_script {
    		ck_n
    	}
    }
  2. 编写脚本

    内容:监听nginx运行状态,如果nginx启动失败,尝试再次启动,如果启动失败,关掉keepalived进程。

    conf 复制代码
    #!/bin/bash
    num=`ps -C nginx --no-header | wc -l`
     if [ $num -eq 0 ];then
     /usr/local/nginx/sbin/nginx
     sleep 2
    if [ `ps -C nginx --no-header | wc -l` -eq 0 ]; then
     killall keepalived
    fi
    fi
  3. 为脚本文件设置权限

    conf 复制代码
    chmod 755 ck_nginx.sh

常见问题

启动失败找不到pid文件

解决:

linux 复制代码
mkdir -p /var/run/nginx/
# 指定配置文件进行重启
nginx -C /usr/local/nginx/conf/nginx.conf
# 重启
nginx -s reload

配置环境变量:

linux 复制代码
vim /etc/profile
# 在文件末尾加上
export NGINX_HOME=/usr/local/nginx
export PATH=$NGINX_HOME/sbin:$PATH

设置开机自动启动:

linux 复制代码
vim /lib/systemd/system/nginx.service
# 在文件添加
[Unit]
#描述服务
Description=nginx
#描述服务类别
After=network.target
 
#服务运行参数的设置,注意【Service】的启动、重启、停止命令都要用绝对路径
[Service]
#后台运行的形式
Type=forking
#服务具体运行的命令
ExecStart=/usr/local/nginx/sbin/nginx
#重启命令
ExecReload=/usr/local/nginx/sbin/nginx -s reload
#停止命令
ExecStop=/usr/local/nginx/sbin/nginx -s quit
#表示给服务分配独立的临时空间
PrivateTmp=true
 
#运行级别下服务安装的相关设置,可设置为多用户,即系统运行级别为3
[Install]
WantedBy=multi-user.target

# 然后 修改文件权限
chmod 755 /usr/lib/systemd/system/nginx.service
# 设置开机自启动
systemctl enable nginx.service

防火墙的配置:

ini 复制代码
---- 常用防火墙配置
# 查看防火墙状态
systemctl status firewalld
# 开启防火墙
systemctl start firewalld
# 开机启动
systemctl enable firewalld
# 开机关闭
systemctl disable firewalld

-- 设置对应开放的端口号
# 查询打开的端口有哪些
firewall-cmd --zone=public --list-ports
# 关闭端口9002
firewall-cmd --zone=public --remove-port=9002/tcp --permanent
# 重新载入一下防火墙设置,使设置生效
firewall-cmd --reload

-- 设置nginx可对外网访问,服务端的tomcat不对外网方法,他们可以内网访问
# 允许某ip访问9002端口 ip地址一般是nginx的ip地址
firewall-cmd --permanent --add-rich-rule="rule family="ipv4" source address="172.27.0.45" port protocol="tcp" port="9002" accept"
# 移出某ip访问9002端口 ip地址一般是nginx的ip地址
firewall-cmd --permanent --remove-rich-rule="rule family="ipv4" source address="172.27.0.45" port protocol="tcp" port="9002" accept"
# 重新载入一下防火墙设置,使设置生效
firewall-cmd --reload
# 查看已设置规则
firewall-cmd --zone=public --list-rich-rules
相关推荐
修己xj2 分钟前
SpringBoot解析.mdb文件实战指南
java·spring boot·后端
lpfasd12320 分钟前
Spring Boot 定时任务详解(从入门到实战)
spring boot·后端·python
moxiaoran575323 分钟前
Go语言的文件操作
开发语言·后端·golang
赴前尘40 分钟前
记一次golang进程执行卡住的问题排查
开发语言·后端·golang
码农小卡拉1 小时前
Prometheus 监控 SpringBoot 应用完整教程
spring boot·后端·grafana·prometheus
计算机毕设VX:Fegn08951 小时前
计算机毕业设计|基于springboot + vue球鞋购物系统(源码+数据库+文档)
数据库·vue.js·spring boot·后端·课程设计
苏渡苇1 小时前
用 Spring Boot 项目给工厂装“遥控器”:一行 API 控制现场设备!
java·人工智能·spring boot·后端·网络协议·边缘计算
短剑重铸之日2 小时前
《设计模式》第五篇:策略模式
java·后端·设计模式·策略模式
步步为营DotNet3 小时前
深入理解ASP.NET Core Middleware:管道执行机制与高效应用
后端·asp.net
独断万古他化3 小时前
【Spring 事务】事务隔离级别与事务传播机制:从理论到业务落地实操
java·后端·spring·事务隔离·事务传播