详解七层反向代理与四层反向代理【Nginx+Tomcat负载均衡、动静分离】

news2024/11/17 7:41:06

文章目录

  • 1. 反向代理和正向代理概述
  • 2.七层反向代理实例
    • 2.1 实验环境描述
    • 2.2 部署Nginx负载均衡器
    • 2.3 部署2台Tomcat应用服务器
      • 2.3.1 部署CentOS 7-5 Tomcat服务器
      • 2.3.2 部署CentOS 7-6 Tomcat多实例服务器
  • 3.四层反向代理实例
    • 3.1 实验环境描述
    • 3.2 部署Nginx负载均衡器(CentOS 7-3)
    • 3.3 部署Nginx服务器(转发)(CentOS 7-2)

1. 反向代理和正向代理概述

1.代理服务器如果配置在客户端即为正向代理,如果配置在服务端即为反向代理,和机器个数没有关系。
2.正向代理代替客户端去发送请求,反向代理代替服务端接受请求。
3.正是因为正向代理代替客户端发送请求,正向代理服务器和客户端对外表现为一个客户端,所以正向代理隐藏了真实的客户端;反向代理代替服务端接受请求,反向代理服务器和真实服务器对外表现为一个服务端,所以反向代理服务器隐藏真实的服务端。

综上,本质上代理服务器还是那个代理服务器,如果替客户端干活就是正向代理,如果替服务端干活就是反向代理。

2.七层反向代理实例

在这里插入图片描述

2.1 实验环境描述

  • Nginx服务器CentOS 7-4:192.168.80.40:80

  • Tomcat服务器CentOS 7-5:192.168.80.50:80

  • Tomcat服务器CentOS 7-6:192.168.80.60:8080 192.168.80.60:8081

2.2 部署Nginx负载均衡器

###关闭和禁止防火墙开机自启功能
systemctl stop firewalld
systemctl disable firewalld
setenforce 0
vim /etc/selinux/config
SELINUX=disabled

(1)安装依赖包

yum -y install pcre-devel zlib-devel openssl-devel gcc gcc-c++ make

(2)创建运行nginx用户、组

useradd -M -s /sbin/nologin nginx

(3)编译安装nginx

cd /opt
rz -E 
tar xf nginx-1.24.0.tar.gz 
cd nginx-1.24.0/
./configure --prefix=/usr/local/nginx --user=nginx --group=nginx --with-file-aio --with-http_stub_status_module --with-http_gzip_static_module --with-http_flv_module --with-stream        

make -j2 && make install                                                                                                   

详解configue配置模块;

./configure \
--prefix=/usr/local/nginx \
--user=nginx \
--group=nginx \
--with-file-aio \									#启用文件修改支持
--with-http_stub_status_module \					#启用状态统计
--with-http_gzip_static_module \					#启用gzip静态压缩
--with-http_flv_module \							#启用flv模块,提供对 flv 视频的伪流支持
--with-http_ssl_module								#启用SSL模块,提供SSL加密功能
--with-stream										#启用stream模块,提供4层调度

(4)将nginx服务链接到/usr/local/sbin/系统环境变量中

ln -s /usr/local/nginx/sbin/nginx /usr/local/sbin/		#让系统识别nginx的操作命令

(5)在/lib/systemd/system/目录中,添加nginx.service文件,便于能够使用systemctl启动和关闭nginx服务

vim /lib/systemd/system/nginx.service

[Unit]
Description=nginx
After=network.target
[Service]
Type=forking
PIDFile=/usr/local/nginx/logs/nginx.pid
ExecStart=/usr/local/nginx/sbin/nginx
ExecrReload=/bin/kill -s HUP $MAINPID
ExecrStop=/bin/kill -s QUIT $MAINPID
PrivateTmp=true
[Install]
WantedBy=multi-user.target                              

(6)修改nginx.service的执行权限并启动服务

chmod 754 /lib/systemd/system/nginx.service
systemctl start nginx.service
systemctl enable nginx.service
netstat -lntp | grep nginx

(7)制作nginx服务的网页数据内容;

mkdir -p /usr/local/nginx/html/test
vim /usr/local/nginx/html/test/index.html
<html>
<head>
<title>HTML test page!</title>
</head>
<body>
<h1>IP:192.168.80.40!this is jingtai nginx html web!</h1>
</body>
</html>

(8)浏览器访问,验证nginx服务是否正确启动

http://192.168.80.40/test/index.html

在这里插入图片描述

(9)修改Nginx服务的主配置文件nginx.conf,添加upstream模块

vim /usr/local/nginx/conf/nginx.conf
----------------------在http的server块中添加以下内容--------------------------------------
http {
------------------------------------------------------------------------------------------------------- 
    keepalive_timeout  0;
#定义后端服务器组的名称和节点配置
    upstream back_server {
                server 192.168.80.50:8080 weight=1;
                server 192.168.80.60:8080 weight=1;
                server 192.168.80.60:8081 weight=1;
        }
        
------------------------------------------------------------------------------------------------------- 
    server {
        listen       80;
        server_name  localhost;

#使用location匹配用户发来的.html动态页面请求,由本地nginx主机服务器解析
        location / {
            root   html;
            index  index.html index.htm;
        }
------------------------------------------------------------------------------------------------------- 

#使用location匹配用户发来的.jsp动态页面请求给后端服务器组
        location ~* .*\.jsp$ {
                proxy_pass http://back_server;
                #在转发报文里添加头部记录真实的客户端地址
                proxy_set_header HOST $host;
                proxy_set_header X-Real-IP $remote_addr;
                proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        }

在这里插入图片描述
(10)重新启动所有服务,包括重新启动后端tomcat服务器

###启动nginx服务器
systemctl restart nginx
netstat -lntp | grep nginx

###启动tomcat服务器
systemctl restart tomcat 
netstat -natp | grep java

###启动tomcat多实例服务器
/usr/local/tomcat/tomcat1/bin/startup.sh
/usr/local/tomcat/tomcat2/bin/startup.sh
netstat -natp | grep java

(11)浏览服务器,分别访问动静页面,验证结果是否正确;

http://192.168.80.40/test/index.html
http://192.168.80.40/test/index.jsp

在这里插入图片描述
以.jsp结尾的动态页面,实现动态轮询tomcat服务器的效果;
在这里插入图片描述

至此,七层反向代理实验,已圆满结束!

2.3 部署2台Tomcat应用服务器

2.3.1 部署CentOS 7-5 Tomcat服务器

###关闭和禁止防火墙开机自启功能
systemctl stop firewalld
systemctl disable firewalld
setenforce 0
vim /etc/selinux/config
SELINUX=disabled

(1)将安装Tomcat所需软件包传到/opt目录下

cd  /opt
rz -E
tar xf jdk-8u91-linux-x64.tar.gz -C /usr/local/

(2)设置JDK环境变量

vim /etc/profile.d/java.sh
export JAVA_HOME=/usr/local/jdk1.8.0_91
export JRE_HOME=$JAVA_HOME/jre
export CLASSPATH=.:$JAVA_HOME/lib:$JRE_HOME/lib
export PATH=$JAVA_HOME/bin:$JRE_HOME/bin:$PATH

source /etc/profile.d/java.sh
java -version

(3)安装启动Tomcat

cd /opt
rz -E
tar xf apache-tomcat-9.0.16.tar.gz 
ls
apache-tomcat-9.0.16  apache-tomcat-9.0.16.tar.gz  jdk-8u91-linux-x64.tar.gz  rh
mv apache-tomcat-9.0.16 /usr/local/tomcat

(4)在/lib/systemd/system/目录中,添加tomcat.service文件,便于能够使用systemctl启动和关闭tomcat服务

vim /usr/lib/systemd/system/tomcat.service
[Unit]
Description=tomcat server
Wants=network-online.target
After=network.target
[Service]
Type=forking
Environment="JAVA_HOME=/usr/local/jdk1.8.0_91"
Environment="PATH=$JAVA_HOME/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin"
Environment="CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar"
ExecStart=/usr/local/tomcat/bin/startup.sh
ExecStop=/usr/local/tomcat/bin/shutdown.sh
Restart=on-failure
[Install]
WantedBy=multi-user.target

systemctl daemon-reload
systemctl start tomcat
netstat -natp | grep 8080
tcp6       0      0 :::8080                 :::*                    LISTEN      4213/java       

在这里插入图片描述
(5)动静分离配置
制作tomcat服务的网页数据内容;

mkdir /usr/local/tomcat/webapps/test
vim /usr/local/tomcat/webapps/test/index.jsp

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<html>
<head>
<title>JSP test1 page!</title>
</head>
<body>
<% out.println("IP:192.168.80.50:8080 JSP动态页面1 http://www.test1.com");%>
</body>
</html>

在主配置文件server.xml中,修改网页根目录地址;

vim /usr/local/tomcat/conf/server.xml
#由于主机名name配置都为localhost,需要删除前面的HOST配置(删除148和149两行)
<Host name="localhost" appBase="webapps" unpackWARs="true" autoDeploy="true" xmlValidation="false" xmlNamespaceAware="false">
	<Context docBase="/usr/local/tomcat/webapps/test" path="" reloadable="true">
	</Context>
</Host>

systemctl restart tomcat         
netstat -natp | grep java

(6)浏览器访问,验证是否成功

http://192.168.80.50:8080/test/index.jsp

在这里插入图片描述

2.3.2 部署CentOS 7-6 Tomcat多实例服务器

###关闭和禁止防火墙开机自启功能
systemctl stop firewalld
systemctl disable firewalld
setenforce 0
vim /etc/selinux/config
SELINUX=disabled

(1)安装jdk环境和tomcat服务

cd /opt
 rz -E
 mkdir /usr/local/tomcat
tar xf apache-tomcat-9.0.16.tar.gz
mv apache-tomcat-9.0.16 /usr/local/tomcat/tomcat1
 mv apache-tomcat-9.0.16 /usr/local/tomcat/tomcat2

(2)配置tomcat环境变量

vim /etc/profile.d/tomcat.sh
#tomcat1
export CATALINA_HOME1=/usr/local/tomcat/tomcat1
export CATALINA_BASE1=/usr/local/tomcat/tomcat1
export TOMCAT_HOME1=/usr/local/tomcat/tomcat1

#tomcat2
export CATALINA_HOME2=/usr/local/tomcat/tomcat2
export CATALINA_BASE2=/usr/local/tomcat/tomcat2
export TOMCAT_HOME2=/usr/local/tomcat/tomcat2

source /etc/profile.d/tomcat.sh

(3)修改tomcat2中的server.xml文件,要求各tomcat实例配置不能有重复的端口号

vim /usr/local/tomcat/tomcat2/conf/server.xml
<Server port="8006" shutdown="SHUTDOWN">		#22行,修改Server prot,默认为8005 -> 修改为8006
<Connector port="8081" protocol="HTTP/1.1"		#69行,修改Connector port,HTTP/1.1  默认为8080 -> 修改为8081
<Connector port="8010" protocol="AJP/1.3" redirectPort="8443" />	#116行,修改Connector port AJP/1.3,默认为8009 -> 修改为8010

(4)修改各tomcat实例中的startup.sh和shutdown.sh文件,添加tomcat环境变量

修改tomcat1实例startup.sh和shutdown.sh文件中的环境变量;

vim /usr/local/tomcat/tomcat1/bin/startup.sh 
# ---------------------------------------------------------------------------
# Start Script for the CATALINA Server
# ---------------------------------------------------------------------------
##添加以下内容
export CATALINA_BASE=$CATALINA_BASE1
export CATALINA_HOME=$CATALINA_HOME1
export TOMCAT_HOME=$TOMCAT_HOME1

vim /usr/local/tomcat/tomcat1/bin/shutdown.sh
# ---------------------------------------------------------------------------
# Stop script for the CATALINA Server
# ---------------------------------------------------------------------------
export CATALINA_BASE=$CATALINA_BASE1
export CATALINA_HOME=$CATALINA_HOME1
export TOMCAT_HOME=$TOMCAT_HOME1

修改tomcat2实例startup.sh和shutdown.sh文件中的环境变量;

vim /usr/local/tomcat/tomcat2/bin/startup.sh 
# ---------------------------------------------------------------------------
# Start Script for the CATALINA Server
# ---------------------------------------------------------------------------
export CATALINA_BASE=$CATALINA_BASE2
export CATALINA_HOME=$CATALINA_HOME2
export TOMCAT_HOME=$TOMCAT_HOME2


vim /usr/local/tomcat/tomcat2/bin/shutdown.sh
# ---------------------------------------------------------------------------
# Stop script for the CATALINA Server
# ---------------------------------------------------------------------------
export CATALINA_BASE=$CATALINA_BASE2
export CATALINA_HOME=$CATALINA_HOME2
export TOMCAT_HOME=$TOMCAT_HOME2

(5)动静分离配置

制作多实例tomcat1的网页数据内容;

mkdir /usr/local/tomcat/tomcat1/webapps/test /usr/local/tomcat/tomcat2/webapps/test
vim /usr/local/tomcat/tomcat1/webapps/test/index.jsp

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<html>
<head>
<title>JSP test2 page</title>
</head>
<body>
<% out.println("IP:192.168.80.60:8080 JSP动态页面2 http://www.test2.com");%>
</body>
</html>

制作多实例tomcat2的网页数据内容;

vim /usr/local/tomcat/tomcat2/webapps/test/index.jsp

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<html>
<head>
<title>JSP test3 page</title>
</head>
<body>
<% out.println("IP:192.168.80.60:8081 JSP动态页面3 http://www.test3.com");%>
</body>
</html>

在多实例tomcat1的主配置文件server.xml中,修改网页根目录地址;

vim /usr/local/tomcat/tomcat1/conf/server.xml
#删除前面的HOST配置(删除148和149行内容)
<Host name="localhost" appBase="webapps" unpackWARs="true" autoDeploy="true" xmlValidation="false" xmlNamespaceAware="false">
	<Context docBase="/usr/local/tomcat/tomcat1/webapps/test" path="" reloadable="true" />
</Host>

/usr/local/tomcat/tomcat1/bin/shutdown.sh 
/usr/local/tomcat/tomcat1/bin/startup.sh 

在多实例tomcat2的主配置文件server.xml中,修改网页根目录地址;

[root@localhost /opt]# vim /usr/local/tomcat/tomcat2/conf/server.xml
#删除前面的HOST配置(删除148和149行内容)
<Host name="localhost" appBase="webapps" unpackWARs="true" autoDeploy="true" xmlValidation="false" xmlNamespaceAware="false">
	<Context docBase="/usr/local/tomcat/tomcat2/webapps/test" path="" reloadable="true" />
</Host>

(6)启动各tomcat中的/bin/startup.sh

/usr/local/tomcat/tomcat1/bin/startup.sh 
/usr/local/tomcat/tomcat2/bin/startup.sh 
netstat -natp | grep java
tcp6       0      0 127.0.0.1:8005          :::*                    LISTEN      3530/java           
tcp6       0      0 127.0.0.1:8006          :::*                    LISTEN      3590/java           
tcp6       0      0 :::8009                 :::*                    LISTEN      3530/java           
tcp6       0      0 :::8010                 :::*                    LISTEN      3590/java           
tcp6       0      0 :::8080                 :::*                    LISTEN      3530/java           
tcp6       0      0 :::8081                 :::*                    LISTEN      3590/java           

(7)浏览器访问,验证tomcat服务是否配置成功

http://192.168.80.60:8080/test/index.jsp
http://192.168.80.60:8081/test/index.jsp

在这里插入图片描述
在这里插入图片描述

3.四层反向代理实例

在这里插入图片描述

3.1 实验环境描述

  • Nginx服务器(转发)CentOS 7-2:192.168.80.20:80

  • Nginx服务器CentOS 7-3:192.168.80.30:80

  • Nginx服务器CentOS 7-4:192.168.80.40:80

  • Tomcat服务器CentOS 7-5:192.168.80.50:80

  • Tomcat服务器CentOS 7-6:192.168.80.60:8080 192.168.80.60:8081

3.2 部署Nginx负载均衡器(CentOS 7-3)

注意:该四层反向代理实例,是在上面实验七层反向代理实例的基础之上完成的!!!!!

###关闭和禁止防火墙开机自启功能
systemctl stop firewalld
systemctl disable firewalld
setenforce 0
vim /etc/selinux/config
SELINUX=disabled

(1)此处采用yum安装nginx服务器

cd /etc/yum.repos.d
mkdir /etc/yum.repos.d/repo.bak
mv  /etc/yum.repos.d/*.repo  /etc/yum.repos.d/repo.bak/
vim /etc/yum.repos.d/nginx.repo
[nginx-stable]
name=nginx stable repo
baseurl=http://nginx.org/packages/centos/7/$basearch/
gpgcheck=0
enabled=1

yum install nginx -y 
nginx -v

(2)启动服务,并使用浏览器访问测试

systemctl start nginx
netstat -lntp | grep nginx
http://192.168.80.30

在这里插入图片描述

(3)制作nginx服务的网页数据内容;
yum安装的nginx服务器的网页根目录位于 /usr/share/nginx/html

mkdir -p  /usr/share/nginx/html/test
vim  /usr/share/nginx/html/test/index.html
<html>
<head>
<title>HTML30  test page!</title>
</head>
<body>
<h1>IP:192.168.80.30!this is jingtai30 nginx html web!</h1>
</body>
</html>

再次重新启动服务,并使用浏览器访问测试

systemctl restart nginx
netstat -lntp | grep nginx
http://192.168.80.30/test/index.html

在这里插入图片描述
(4)修改Nginx服务的默认主配置文件default.conf,添加upstream模块

cp /etc/nginx/conf.d/default.conf /etc/nginx/conf.d/default.conf.bak
vim /etc/nginx/conf.d/default.conf
----------------------在第一行添加以下内容--------------------------------------
#定义后端服务器组的名称和节点配置
    upstream back_server {
                server 192.168.80.50:8080 weight=1;
                server 192.168.80.60:8080 weight=1;
                server 192.168.80.60:8081 weight=1;
        }
        
-------------------------------------------------------------------------------------------------------      
    server {
        listen       80;
        server_name  localhost;

#使用location匹配用户发来的.html动态页面请求,由本地nginx主机服务器解析
        location / {
            root   html;
            index  index.html index.htm;
        }
------------------------------------------------------------------------------------------------------- 

#使用location匹配用户发来的.jsp动态页面请求给后端服务器组
        location ~* .*\.jsp$ {
                proxy_pass http://back_server;
                #在转发报文里添加头部记录真实的客户端地址
                proxy_set_header HOST $host;
                proxy_set_header X-Real-IP $remote_addr;
                proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        }

在这里插入图片描述
(5)重新启动服务,并使用浏览器访问测试

systemctl restart nginx
netstat -lntp | grep nginx
###访问静态
http://192.168.80.30/test/index.html
###访问动态
http://192.168.80.30/test/index.jsp

在这里插入图片描述
以.jsp结尾的动态页面,实现动态轮询tomcat服务器的效果;
在这里插入图片描述

3.3 部署Nginx服务器(转发)(CentOS 7-2)

###关闭和禁止防火墙开机自启功能
systemctl stop firewalld
systemctl disable firewalld
setenforce 0
vim /etc/selinux/config
SELINUX=disabled

(1)安装依赖包

yum -y install pcre-devel zlib-devel openssl-devel gcc gcc-c++ make

(2)创建运行nginx用户、组

useradd -M -s /sbin/nologin nginx

(3)编译安装nginx

cd /opt
rz -E 
tar xf nginx-1.24.0.tar.gz 
cd nginx-1.24.0/
./configure --prefix=/usr/local/nginx --user=nginx --group=nginx --with-file-aio --with-http_stub_status_module --with-http_gzip_static_module --with-http_flv_module --with-stream        

make -j2 && make install                                                                                                   

(4)将nginx服务链接到/usr/local/sbin/系统环境变量中

ln -s /usr/local/nginx/sbin/nginx /usr/local/sbin/		#让系统识别nginx的操作命令

(5)在/lib/systemd/system/目录中,添加nginx.service文件,便于能够使用systemctl启动和关闭nginx服务

vim /lib/systemd/system/nginx.service

[Unit]
Description=nginx
After=network.target
[Service]
Type=forking
PIDFile=/usr/local/nginx/logs/nginx.pid
ExecStart=/usr/local/nginx/sbin/nginx
ExecrReload=/bin/kill -s HUP $MAINPID
ExecrStop=/bin/kill -s QUIT $MAINPID
PrivateTmp=true
[Install]
WantedBy=multi-user.target                              

(6)修改nginx.service的执行权限并启动服务

chmod 754 /lib/systemd/system/nginx.service
systemctl start nginx.service
systemctl enable nginx.service
netstat -lntp | grep nginx

(7)浏览器访问,验证nginx服务是否正确启动

http://192.168.80.20

在这里插入图片描述

(8)修改Nginx服务的主配置文件nginx.conf,添加stream模块

vim /usr/local/nginx/conf/nginx.conf
stream {
        upstream nginx_server {
                server 192.168.80.30:80 weight=1;
                server 192.168.80.40:80 weight=1;
        }

        server {
                listen 80;   #此处设置转发80端口的页面访问
                proxy_pass nginx_server;
        }
}


----------------------在http块上面添加以下内容-----------------------------------------------
http {
------------------------------------------------------------------------------------------------------- 
    keepalive_timeout  0;
    server {
        listen       8080;  #修改本地页面端口为8080
        server_name  localhost;

在这里插入图片描述

(9)重新启动所有服务,包括重新启动后端tomcat服务器

###启动nginx服务器
systemctl restart nginx
netstat -lntp | grep nginx

###启动tomcat服务器
systemctl restart tomcat 
netstat -natp | grep java

###启动tomcat多实例服务器
/usr/local/tomcat/tomcat1/bin/startup.sh
/usr/local/tomcat/tomcat2/bin/startup.sh
netstat -natp | grep java

(10)浏览服务器,分别访问动静页面,验证结果是否正确;

http://192.168.80.20/test/index.html
http://192.168.80.20/test/index.jsp

在这里插入图片描述

以.jsp结尾的动态页面,实现动态轮询tomcat服务器的效果;
在这里插入图片描述

至此,四层反向代理实验,已圆满结束!

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

2023年护网常见面试题汇总!看过的都通过面试啦!

​时间过得很快&#xff0c;回想起去年的这个时候&#xff0c;我也正在准备秋招&#xff0c;今天的我刚刚结束培训。 我的个人情况就读于某双非大学&#xff0c;信息与计算科学&#xff08;大数据方向&#xff0c;校企合作&#xff0c;一个介于数学与计算机之间的专业&#xf…

JVM调优参数+Visual GC 插件安装及使用,jvm分析

调优的目的是什么呢&#xff1f; 1.就是让系统更加的丝滑&#xff0c;让用户体验变得更好。 2.提升系统的性能&#xff0c;提高效率&#xff0c;充分利用jvm内存。 更多参考->JVM常用调优参数 一.JVM参数配置位置 1.java.lang.OutOfMemoryError: Java heap space 解决方…

微信小程序开发之获取用户头像昵称

本文是对另一篇文档 https://blog.csdn.net/duke_ding2/article/details/130674320 的补充。 环境 微信开发者工具 Stable 1.06.2306020调试基础库 2.32.2 背景 在较低版本&#xff08;2.27.0及以下&#xff09;的基础库中&#xff0c;在小程序里可以使用 wx.getUserProfil…

PostgreSQL BTree(B-Link-tree) 索引 基本 实现原理

文章目录 背景BTreeBTreeB-Link-Tree 基本数据结构的插入实现BTree Insert 实现BTree Insert 实现 PostgreSQL BTree实现整体结构BTree 索引创建实现_bt_buildadd_bt_uppershutdown BTree 查询 _bt_search 实现BTree 插入 _bt_doinsert 实现_bt_split 节点分裂_bt_insert_paren…

flyway在Windows下安装及基本使用

文章目录 1. flyway中的SQL脚本命名2. flyway执行SQL脚本演示3. flyway中设置 ${CURRENT_DATE} 为当前时间的值 Flyway是一个开源的数据库迁移工具&#xff0c;用于管理和自动化数据库架构的演进。它允许开发人员和团队对数据库进行版本控制&#xff0c;并通过简单的命令行或脚…

【数据库与身份认证】课程笔记

目标&#xff1a; 知道如何配置MySQL数据库环境认识并使用常见的SQL语句操作数据库在Express中操作MySQL数据库了解Session的实现原理了解JWT的实现原理 目录&#xff1a; 数据库的基本概念安装并配置MySQLMySQL的基本使用在Express中操作MySQL前后端的身份认证 一. 数据库的…

美团一面:OOM后,JVM一定会退出吗?为什么?

说在前面 在40岁老架构师 尼恩的读者社区(50)中&#xff0c;最近有小伙伴拿到了一线互联网企业如美团、拼多多、极兔、有赞、希音的面试资格&#xff0c;遇到一几个很重要的面试题&#xff1a; OOM后&#xff0c;JVM一定会退出吗&#xff1f;为什么&#xff1f; 生产环境&am…

MIT 6.S081 (BOOK-RISCV-REV1)教材第四章内容 -- 上

MIT 6.S081 教材第四章内容 -- 上 引言陷阱指令和系统调用RISC-V陷入机制代码&#xff1a;调用系统调用从用户空间陷入系统调用参数补充 引言 MIT 6.S081 2020 操作系统 本文为MIT 6.S081课程第四章教材内容翻译加整理。 本课程前置知识主要涉及: C语言(建议阅读C程序语言设计…

Django基础入门⑤:模板变量和标签的使用

Django基础入门④&#xff1a;数据表显示和Django模板详讲 模板变量使用模板变量模板标签if标签for标签forloop变量forloop.revcounter 示例forloop.first 和 forloop.last 示例forloop.parentloop 示例 &#x1f3d8;️&#x1f3d8;️个人简介&#xff1a;以山河作礼。 &…

Liunx开发工具:git和gdb

目录 一. git的功能和使用 1.1 git的功能 1.2 git三板斧 1.3 git使用中的其他问题 二. 使用gdb调试代码 2.1 生成带有调试信息的可执行程序 2.2 gdb调试代码的方法 一. git的功能和使用 1.1 git的功能 git是一块开源、免费的版本管理系统&#xff0c;能够高效敏捷地处…

【人工智能】— 神经网络、前向传播、反向传播、梯度下降、局部最小值、多层前馈网络、缓解过拟合的策略

【人工智能】— 神经网络、前向传播、反向传播 前向传播反向传播梯度下降局部最小值多层前馈网络表示能力多层前馈网络局限缓解过拟合的策略 前向传播和反向传播都是神经网络训练中常用的重要算法。 前向传播是指将输入数据从输入层开始经过一系列的权重矩阵和激活函数的计算后…

计算机网络408大题(2009-2019)

必备结构 TCP报文段结构 IP数据报结构 2009年 考察点&#xff1a;子网划分、路由表、路由聚合 2010年 考察点&#xff1a;CSMA/CD协议的相关计算 2011年 考察点&#xff1a;以太网帧格式、IP分组格式、IP地址和MAC地址、ARP协议、HTTP/1.1持续的非流水方式 在转发过程中&am…

Jupyter中使用Pyecharts绘制地图

背景&#xff1a;根据各省频率绘制地图 根据各省频率绘制地图&#xff0c;可以使用 Pyecharts 绘制。下面是详细的步骤&#xff1a; 1、安装 Pyecharts&#xff1a;可以通过 !pip install pyecharts 命令安装。 2、导入相关库 import pandas as pd from pyecharts import o…

设计模式之抽象工厂模式笔记

设计模式之抽象工厂模式笔记 说明Abstract Factory(抽象工厂)目录UML抽象工厂示例类图甜品抽象类甜品提拉米苏类甜品抹茶慕斯类 咖啡抽象类美式咖啡类拿铁咖啡类 甜品工厂接口美式风味的甜品工厂意大利风味的甜品工厂 测试类模式扩展 说明 记录下学习设计模式-抽象工厂模式的写…

SSMP整合案例(2) Spring Boot整合Lombok简化实体类开发

好啊 接着我们上文SSMP整合案例(1) 构建 Spring Boot Vue MySql项目环境 我们继续 接下来 我们要在java项目中 建立出数据库表对应的实体类 我们还是先看看自己上文中 创建的这个 book表 其中四个字段 主键id 数字枚举类型的type 字符串类型name 字符串类型 description 我们…

【设计模式与范式:总结型】74 | 总结回顾23种经典设计模式的原理、背后的思想、应用场景等

到今天为止&#xff0c;23 种经典的设计模式已经全部讲完了。咱们整个专栏也完成了 3/4&#xff0c;马上就要进入实战环节了。在进入新模块的学习之前&#xff0c;我照例带你做一下总结回顾。23 种经典设计模式共分为 3 种类型&#xff0c;分别是创建型、结构型和行为型。今天&…

Floyd 判圈算法(Floyd Cycle Detection Algorithm)

Floyd 判圈算法(Floyd Cycle Detection Algorithm) 前言 Floyd判圈算法属于对指针操作的算法&#xff0c;它一般需要且仅需要两个指针&#xff0c;通过设定不同的指针移动速度&#xff0c;来判定链表或有限状态机中是否存在环。人为规定移动较快的指针称为快速指针(fast poin…

Java官方笔记9Lambda表达式

Lambda Expression 有了Lambda Expression&#xff0c;就不用再写anonymous classes。 写Lambda&#xff0c;首先要找到它的类型。 There is a restriction on the type of a lambda expression: it has to be a functional interface. 函数接口&#xff0c;只有1个抽象方法的接…

Vue中v-text、v-html、v-on的基本语法(二)

文章目录 前言一、vue中data属性定义对象、数组相关数据二、v-text、v-html指令使用三、v-on基本指令使用(一)四、v-on指令基本使用(二)之在函数中获取vue实例本身this五、v-on指令基本使用(二)之在函数中传递参数六、v-on指令基本使用(二)之简化写法绑定函数和事件定义的两种写…

从零搭建一台基于ROS的自动驾驶车-----2.运动控制

系列文章目录 北科天绘 16线3维激光雷达开发教程 基于Rplidar二维雷达使用Hector_SLAM算法在ROS中建图 Nvidia Jetson Nano学习笔记–串口通信 Nvidia Jetson Nano学习笔记–使用C语言实现GPIO 输入输出 Autolabor ROS机器人教程 从零搭建一台基于ROS的自动驾驶车-----1.整体介…