Nginx+Tomcat负载均衡、动静分离

2023-11-06

一.Tomcat多实例部署

 Tomcat的多实例部署简单的讲就是基于端口的虚拟主机设置

1.1.安装jdk

1)安装jdk
#某rpm包尚未安装,我们可以通过该命令查询其说明信息、安装以后会生成的文件;
rpm -qpl jdk-8u201-linux-x64.rpm 
 
#安装并以#显示安装进度以及显示详细过程
rpm -ivh jdk-8u201-linux-x64.rpm 
 
#查看jdk环境
java -version
2)设置全局的环境变量,一般会有两种方式(本次部署采用第二种方式):

方式一:直接对 /etc/profile(全局变量配置文件进行改变)

方式二:在/etc/profile.d/  目录下创建相关的 .sh 脚本,profile有默认调用的功能。(推荐使用,便于变量的管理)

vim /etc/profile.d/java.sh
export JAVA_HOME=/usr/java/jdk1.8.0_201-amd64
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)编写一个java 简易的源代码,进行环境测试
vim Hello.java
#类名、接口名命令:英文大小写字母、数字字符、$和_,不能使用关键字和数字开头;
一个单词命名时第一个单词的首字母要大写;多单词组成时,所有单词的首字母大写:XxxYyyZzz(大驼峰命名法)
public class Hello {			
  public static void main(String[] args){
    System.out.println("Hello world!");
  }
}


#编译源代码
javac Hello.java
#运行源代码
java Hello

1.2.安装启动tomcat

1)安装tomcat
cd /opt
tar zxvf apache-tomcat-9.0.16.tar.gz
mkdir /usr/local/tomcat
mv apache-tomcat-9.0.16 /usr/local/tomcat/tomcat1
cp -a /usr/local/tomcat/tomcat1 /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

echo  $CATALINA_HOME1

echo  $CATALINA_HOME2

3)修改多实例tomcat中的 server.xml 文件

该操作是为了修改tomcat的端口号,避免多实例启动tomcat,因为端口号重复占用启动失败。

该操作中,我们让tomcat1为默认端口设置,所以只需要修改tomcat2的端口号即可。针对更改的端口分别为 8080  8005  8009 

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

8005 为成tomcat运用程序关闭端口

第一个连接器默认监听8080端口,负责建立HTTP连接。在通过浏览器访问Tomcat服务器的Web应用时,使用的就是这个连接器。


第二个连接器默认监听8009端口,AJP端口,即容器使用,如Apache能通过AJP协议访问Tomcat的8009端口。
 

4)修改多实例tomcat的开启与关闭配置文件,添加相关的tomcat全局变量 
vim /usr/local/tomcat/tomcat1/bin/startup.sh 

#在21行添加以下内容
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

vim /usr/local/tomcat/tomcat2/bin/startup.sh 
#在21行添加以下内容
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)启动多实例的tomcat
/usr/local/tomcat/tomcat1/bin/startup.sh 
/usr/local/tomcat/tomcat2/bin/startup.sh 
6)访问测试多实例的部署 

tomcat1:

tomcat2:

二.Nginx+Tomcat负载均衡、动静分离 

2.1.nginx常见介绍

1)反向代理两种模式

①七层反向代理

基于七层的http/https/mail等应用协议的代理
他是在http模块里面添加以upstream模块,在upstream里面定义服务器组名称,添加ip,端口号,权重(如果不添加的话,默认是1),可以在添加一个调度算法。并在http模块里面添加server模块,在里面用location来匹配URL路径,定义proxy_pass http://服务器组名称,用来将以。。。为结尾的请求转发给tomcat服务器集群。并且后端服务器需要获取真实的客户端的ip地址。
http{
 
​     upstream 服务器组名称{
 
​            server IP1:PORT [weight=1 ...];
 
​            server IP2:PORT;
 
​            ..........
 
​          调度算法(rr轮询/加权轮询,least_conn最小连接,ip_hash,url_hash,faire);
 
}
 
​    server {
 
​        location ~ ...{
 
​            #将以***为结尾的请求转发给tomcat服务器集群
 
​             proxy_pass http://服务器组名称;  
 
​           #用于后端服务器获取真实的客户端ip地址
 
​            proxy_set_header HOST $host;
 
​            proxy_set_header X-Real-IP $remote_addr;
 
​            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
 
​          }
 
​     }
 
}

②四层反向代理

基于四层的ip+tcp/upd端口的代理
他是http块同一级,一般配置在http块上面。
他是需要用到stream模块的,一般四层里面没有自带,需要编译安装一下。并在stream模块里面添加upstream +服务器名称,添加ip地址及端口号。定义server模块,里面添加listen 监听端口号,server_name 网站主机名,proxy_pass 服务器组名称。
 
stream{
 
​     upstream fuwu服务器名称{
 
​          server IP1:PORT;
 
​          server IP2:PORT;
 
​          server IP3:PORT;
 
​          ........
 
​      }
 
​      server{
 
​          listen 监听端口;
 
​          server_name  网站主机名; 
 
​          proxy_pass   服务器组名称;
 
​     }
 
}
 
2)Nginx 负载均衡模式(调度算法)
●rr 轮询 负载均衡模式:
每个请求按时间顺序逐一分配到不同的后端服务器,如果超过了最大失败次数后(max_fails,默认1),在失效时间内(fail_timeout,默认10秒),该节点失效权重变为0,超过失效时间后,则恢复正常,或者全部节点都为down后,那么将所有节点都恢复为有效继续探测,一般来说rr可以根据权重来进行均匀分配。
 
●加权轮询 WRR :
 
weight的值越大分配到的访问概率越高,主要用于后端每台服务器性能不均衡的情况下。或者仅仅为在主从的情况下设置不同的权值,达到合理有效的地利用主机资源。
 
●least_conn 最少连接:
优先将客户端请求调度到当前连接最少的服务器。
 
●ip_hash 负载均衡模式:
每个请求按访问ip的hash结果分配,这样每个访客固定访问一个后端服务器,可以解决session的问题,但是ip_hash会造成负载不均,有的服务请求接受多,有的服务请求接受少,所以不建议采用ip_hash模式,session 共享问题可用后端服务的 session 共享代替 nginx 的 ip_hash(使用后端服务器自身通过相关机制保持session同步)。
 
●fair(第三方)负载均衡模式:
按后端服务器的响应时间来分配请求,响应时间短的优先分配。
 
●url_hash(第三方)负载均衡模式:
基于用户请求的uri做hash。和ip_hash算法类似,是对每个请求按url的hash结果分配,使每个URL定向到同一个后端服务器,但是也会造成分配不均的问题,这种模式后端服务器为缓存时比较好
3)nginx的会话保持
## 1.ip_hash,url_hash
基于ip缓存或者url路径的缓存来进行的
ip_hash简单易用,但有如下问题:
 
- 当后端服务器宕机后,session会丢失;
- 来自同一局域网的客户端会被转发到同一个后端服务器,可能导致负载失衡;
- 不适用于CDN网络,不适用于前段还有代理的情况。
 
## 2.sticky_cookie_insert
基于客户端的cookie缓存来进行
 
使用sticky_cookie_insert启用会话亲缘关系,这会导致来自同一客户端的请求被传递到一组服务器在同一台服务器。与ip_hash不同之处在于,它不是基于IP来判断客户端的,而是基于cookie来判断。因此可以避免上述ip_hash中来自同一局域网的客户端和前段代理导致负载失衡的情况。
 
说明:
 
- expires:设置浏览器中保持cookie的时间
- domain:定义cookie的域
- path:为cookie定义路径
 
## 3.后端服务器做session共享,来实现会话保持
4)为什么使用动静分离
nginx比较擅长处理静态页面,其效率是tomcat的6倍左右,但是nginx不善于处理动态页面。 而tomcat 更擅长处理动态页面。
静态页面内容相对稳定,容易被检索,同时,由于用户浏览是不需要经过程序的处理,所以浏览速度最快。但是,制作和维护工作量比较大。
当网站内容更新频繁时访问量非常大,内容变动频繁时,就需要使用动态。但是动态页面需要访问数据库,当访问量非常大,对程序需要处理的数据量就非常大,容易造成网站不稳定甚至瘫痪
因此,我们需要使用动静分离来管理网站。
5)为什么使用负载均衡
动态网站的页面上的信息都必须从数据库中读取,每打开一个页面就读取数据库一次,如果访问网站的人数很多,这会对服务器增加很大的荷载,从而影响这个网站的运行速度。所以,我们可以利用负载均衡集群,降低服务器的负载。
 
6)正向代理和反向代理的区别
# 正向代理
 
是一个`位于客户端和目标服务器之间的服务器`,为了从目标服务器取得内容,客户端向代理发送一个请求并指定目标服务器,然后代理向目标服务器转交请求并将获得的内容返回给客户端。`代理服务器和客户端处于同一个局域网内。
 
比如说我要访问谷歌,于是我就告诉它让它帮我转发。
 
# 反向代理
 
实际运行方式是代理服务器接受网络上的连接请求。它将请求转发给内部网络上的服务器,并将从服务器上得到的结果返回给网络上请求连接的客户端 。代理服务器和目标服务器处于同一个局域网内。
 
比如说我要访问taobao,对我来说不知道图片、json、css 是不是同一个服务器返回回来的,但是我不关心,是反向代理 处理的,我不知道目标服务器。

2.2.Nginx+Tomcat负载均衡的组合原因

1)Nginx实现负载均衡的原理 

Nginx实现负载均衡是通过反向代理实现Nginx服务器作为前端,Tomcat服务器作为后端,web页面请求由Nginx服务来进行转发。 但是不是把所有的web请求转发,而是将静态页面请求Ncinx服务器自己来处理,动态页面请求,转发给后端的Tomcat服务器来处理。据了解,Tomcat是属于轻量级的应用服务器,可接受访问量可能会不足,所以我们需要多台Tomcat服务器。并且Tomcat并发量处理能力弱(约Nginx的六分之一),所以需要Nginx方向代理时,进行合理的调用分配。

2)Nginx实现负载均衡的主要配置项

upstream 服务池名 {   }
作用:配置后端服务器池,以提供响应数据

proxy_pass http:// 服务池名
作用:配置将访问请求转发给后端服务器池的服务器处理

3)Nginx+Tomcat负载均衡的组合的优点

Nginx 静态处理优势:Nginx 处理静态页面的效率远高于 Tomcat 的处理能力若 Tomcat 的请求量为1000次,则 Nginx 的请求量为6000次Tomcat 每秒的吞吐量为0.6M,Nginx 的每秒吞吐量为3.6MNginx 处理静态资源的能力是 Tomcat 处理的6倍

 动静分离原理:服务端接收来自客户端的请求中,既有静态资源也有动态资源,静态资源由 Nginx 提供服务,动态资源由 Nginx 转发至后端。

2.3.Nginx+Tomcat负载均衡的实验设计

实验需求:某公司中有一台nginx服务器,两台tomcat服务器。要求部署出用户访问服务,静态资源由Nginx自行处理,jsp动态资源移交给tomcat服务器处理,且达到负载均衡的效果

实验布置:

实验实现步骤 :

1)部署Nginx 负载均衡器(部署主机IP为192.168.47.102 )

安装Nginx:

systemctl stop firewalld
setenforce 0
 
yum -y install pcre-devel zlib-devel openssl-devel gcc gcc-c++ make
 
useradd -M -s /sbin/nologin nginx
 
cd /opt
tar zxvf nginx-1.12.0.tar.gz -C /opt/
 
cd nginx-1.12.0/
./configure \
--prefix=/apps/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层调
 
 
 
make && make install
 
ln -s /apps/nginx/sbin/nginx /usr/local/sbin/
 
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
 
chmod 754 /lib/systemd/system/nginx.service
systemctl start nginx.service
systemctl enable nginx.service
2)搭建所有tomcat1和2的服务(2.1中的   标题6) 已完成配置,192.168.47.103)

搭建第三台tomcat(部署主机为192.168.47.104):

systemctl stop firewalld
setenforce 0
 
 
#软件包的方式安装jdk环境
tar zxvf jdk-8u91-linux-x64.tar.gz -C /usr/local/
 
vim /etc/profile
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
 
tar zxvf apache-tomcat-8.5.16.tar.gz
 
mv /opt/apache-tomcat-8.5.16/ /usr/local/tomcat
 
/usr/local/tomcat/bin/shutdown.sh 
/usr/local/tomcat/bin/startup.sh
 
netstat -ntap | grep 8080

3)tomcat的配置设置

(1)Tomcat server(192.168.47.104) 配置:

 
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 test3 page</title>   #指定为 test3 页面
</head>
<body>
<% out.println("动态页面 3,http://www.test3.com");%>
</body>
</html>
 
 
vim /usr/local/tomcat/conf/server.xml
#由于主机名 name 配置都为 localhost,需要删除前面的 HOST 配置
<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>
 
/usr/local/tomcat/bin/shutdown.sh 
/usr/local/tomcat/bin/startup.sh 
 

(2)Tomcat server  (192.168.47.103) 配置:

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>   #指定为 test2 页面
</head>
<body>
<% out.println("动态页面 2,http://www.test2.com");%>
</body>
</html>
 
 
vim /usr/local/tomcat/tomcat1/conf/server.xml
#删除前面的 HOST 配置
<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设置: 

vim /usr/local/tomcat/tomcat2/webapps/test/index.jsp
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<html>
<head>
<title>JSP test1  page</title>  
</head>
<body>
<% out.println("动态页面 1,http://www.test1.com");%>
</body>
</html>
 
 
vim /usr/local/tomcat/tomcat2/conf/server.xml
#删除前面的 HOST 配置
<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>
 
/usr/local/tomcat/tomcat2/bin/shutdown.sh 
/usr/local/tomcat/tomcat2/bin/startup.sh 
4)Nginx进行负载均衡和动静分离设置 

编写Nginx静态资源测试网页 :

vim /apps/nginx/html/index.html
<html>
<body>
<h1> this is Nginx static test !</h2>
<img src="test.png"/>
</body>
</html>

进行负载均衡和动静分离配置:

vim /apps/nginx/conf/nginx.conf
......
http {
......
	#gzip on;
	
	#配置负载均衡的服务器列表,weight参数表示权重,权重越高,被分配到的概率越大
	upstream tomcat_server {
		server 192.168.47.103:8080 weight=1;
		server 192.168.47.103:8081 weight=1;
		server 192.168.47.104:8080 weight=1;
	}
	
	server {
		listen 80;
		server_name www.yang.com;
	
		charset utf-8;
	
		#access_log logs/host.access.log main;
		
		#配置Nginx处理动态页面请求,将 .jsp文件请求转发到Tomcat 服务器处理
		location ~ .*\.jsp$ {
			proxy_pass http://tomcat_server;
#设置后端的Web服务器可以获取远程客户端的真实IP
##设定后端的Web服务器接收到的请求访问的主机名(域名或IP、端口),默认HOST的值为proxy_pass指令设置的主机名。如果反向代理服务器不重写该请求头的话,那么后端真实服务器在处理时会认为所有的请求都来自反向代理服务器,如果后端有防攻击策略的话,那么机器就被封掉了。
			proxy_set_header HOST $host;
##把$remote_addr赋值给X-Real-IP,来获取源IP
			proxy_set_header X-Real-IP $remote_addr;
##在nginx 作为代理服务器时,设置的IP列表,会把经过的机器ip,代理机器ip都记录下来
			proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
		}
		
		#配置Nginx处理静态图片请求
		location ~ .*\.(gif|jpg|jpeg|png|bmp|swf|css)$ {
			root /usr/local/nginx/html;
			expires 10d;
		}
		
		location / {
			root html;
			index index.html index.htm;
		}
......
	}
......
}

访问测试:

访问动态资源tomcat  (192.168.47.105/index.jsp)

访问静态资源:192.168.47.105  和   192.168.47.105/test.png


本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Nginx+Tomcat负载均衡、动静分离 的相关文章

随机推荐

  • Xmind 2020 for Mac(思维导图软件)支持Big Sur V10.3.1中文版介绍

    Xmind ZEN 2020现已改名为Xmind 2020 是一款由XMind官方最新推出的一款功能强大的思维导图软件 XMind 2020的界面经过重新设计 变得非常清爽 软件采用全新的内核 内置多款优秀的字体 ZEN 模式 隐藏页面内多
  • 数据库事务详解:ACID四性、隔离级别、日志、事务控制语句

    目录 事务的特性 事务的隔离级别 事务日志 事务控制语句 数据库中的事务用来管理增 删 改操作 查询不需要事务管理 因为它并不会修改数据库中的数据 在 MySQL 中只有使用了InnoDB 数据库引擎 的数据库或表才支持事务 事务的特性 事
  • 【SAM模型超级进化】MobileSAM轻量化的分割一切大模型出现,模型缩小60倍,速度提高40倍,效果不减

    目录 前言 1 研究背景 2 模型改进思路与对比说明 2 1 MobileSAM与SAM速度对比 2 2 MobileSAM与SAM不同分割结果对比 3 模型使用说明 3 1 一键全景分割代码示例 3 2 提示点分割代码示例 4 总结 论文
  • 利用Python实现推荐系统&架构

    作者 禅与计算机程序设计艺术 1 简介 什么是推荐系统 作为互联网产品的基础设施 推荐系统通过分析用户行为 偏好 兴趣 为用户提供个性化的推荐 是非常重要的增值服务之一 根据维基百科定义 推荐系统是一个建立在用户行为数据上的信息过滤系统 它
  • 4*4(齐次)矩阵

    4 4矩阵一般也叫齐次矩阵 主要有两个作用 描述平移变换 描述透视投影变换 4 4平移矩阵 3 3矩阵可以用来旋转 缩放坐标系 但不能移动坐标系 需要在4维空间切变实现3维平移 比较容易理解的是在3维空间实现2维平移 而4 4平移矩阵不会影
  • 微信公众号开发笔记9(微信小程序、公众号网页实现上拉加载下拉刷新)

    目录 微信公众号网页WEUI mescroll js实现上拉加载下拉刷新 最终效果图 HTML页面代码 js部分 CSS样式 需要引用的前端资源 有其他问题请联系我 微信公众号网页WEUI mescroll js实现上拉加载下拉刷新 使用m
  • 苹果Mac OS X 10.6 Snow Leopard雪豹操作系统BT种子(.torrent)下载,6.13G个人版和Sever服务器版

    之前说过 苹果Mac OS X 10 6 Snow Leopard雪豹操作系统8月28日上市 今天从网上找到了苹果电脑Mac OS X 10 6 Snow Leopard雪豹操作系统BT种子 torrent文件 没装BT下载软件的苹果用户请
  • 三大涉黄APP被端!7000名女主播直播果聊内幕曝光

    关注后回复 进群 拉你进程序员交流群 作者丨Seven 7 来源丨扩展迷EXTFANS 随着网络的不断发展 直播也越来越受到大众的欢迎 自然而然 一些不法分子也从中嗅到商机 小哥哥 你想看什么 给我点赞 给我打赏 你想看啥都可以 果聊直播
  • js打砖块

    需求分析 1 小球在触碰到大盒子上 左 右边框 以及滑块后沿另一方向反弹 在碰到底边框后游戏结束 2 小球在触碰到方块之后 方块消失 3 消除所有方块获得游戏胜利 4 可通过鼠标与键盘两种方式移动滑块 代码分析 HTML代码 左边提示框盒子
  • 2023电工杯数学建模B题分析

    本次电工杯的A专业性较强 建议入门从B开始 本题目看上去一眼非常简单 实则考验数据的处理能力 分析能力以及如何在简单题目下能做得更加出众 讲论文写好抓住评委眼球 如果您阅读过往年国赛题目 您可以发现2021 BC 和2022C基本都是一眼就
  • GPIO操作0基础

    1 1GPIO结构 1 2固件库组织代码步骤 1 3IO口操作步骤 常用技巧总结 1 4IO口位操作 1 1 GPIO结构 1 基本结构 2 工作模式 3 寄存器地址 typedef struct stm32f10x h 定位到 GPIO
  • 【C语言】【猜数字】【极简】

    include
  • 登录注册,文件增删查改实现

    登录注册文件增删查改实现 需求 实现登录功能 注册功能 登录后文件可以进行增加删除修改查看等基本功能的操作 知识点 mybatis Tomcat servlet asion json req resp session 前提准备 pom xm
  • 对话量子链创始人帅初:区块链发展目标是构建协同进化的生命体

    有人说 区块链没有春节 只有春天 2月17日 大年初二 Qtum量子链创始人帅初在社区分享了自己关于区块链的25个看法 涵盖了公有链技术演进 区块链项目估值模型 区块链领域投资机会 区块链技术未来畅想等方方面面 引发了热议 ETH最大的风险
  • cocos 2.4.10升级到3.7

    Cocos Creator 3D v1 2 0 新版本中的cc找不到的解决办法 NZD Target的博客 CSDN博客 https www cnblogs com creator star p 17041314 html
  • 农夫和奶牛-二分(未完成没搞懂题目)

    农夫 John 建造了一座很长的畜栏 它包括N 2 lt N lt 100 000 个隔间 这些小隔间依次编号为x1 xN 0 lt xi lt 1 000 000 000 但是 John的C 2 lt C lt N 头牛们并不喜欢这种布局
  • c++11 std::enable_if在模板偏特化的妙用

    1 模板自动推导功能 先看个例子 在调用TestTemplate函数时 我们可以在函数后面加上 lt 类型 gt 无歧义地指定调用的版本 结果如下 由于模板参数在函数参数中的位置是固定的 编译器其实可以推导出参数的类型 这样程序员们就可以不
  • 无线网络几种攻击方式

    Evil Twin Attack 双面恶魔攻击 攻击者使用相同的SSID创建一个欺诈性接入点 因为与受害者常用SSID名称一样 并且具有更强的型号 因此可以轻易欺骗受害者与之连接 建立连接后 攻击者可以替换网页 比如亚马逊付费界面替换成攻击
  • 字符串转换成数字的方法【C#】

    在C 中 经常需要将字符串转换成数字 简单总结三种方法 一 Convert 将一个基本数据类型转换成另一个基本数据类型 比如 将用户输入的数学成绩进行转换 int math Convert ToInt32 Console ReadLine
  • Nginx+Tomcat负载均衡、动静分离

    一 Tomcat多实例部署 Tomcat的多实例部署简单的讲就是基于端口的虚拟主机设置 1 1 安装jdk 1 安装jdk 某rpm包尚未安装 我们可以通过该命令查询其说明信息 安装以后会生成的文件 rpm qpl jdk 8u201 li