Linux NGINX^Tomcat 负载均衡 动静分离集群

news2025/2/25 18:03:37

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

        由于NGINX静态页面处理能力强(2-3w并发)资源消耗低,但动态页面处理能力弱,所以将其与Apache结合,使用Apache的动态网页能力补足NGINX的不足,达到动静分离。

NGINX静态页面处理能力为Tomcat6倍 请求量若6000次,Tomcat只有1000次。吞吐量若为3.6M,Tomcat则只有0.6M

并发量:以10分钟有5000万用户平均每人访问2次为例,并发量为每秒(5000w*2)/(60*10)=16.7万,再double下(代理服务器同时连接客户端与后端服务器),每秒25万并发量
吞吐量可以理解成带宽流量,以每个请求0.5KB大小,并发每秒25万,0.5/1024MB*250000=122MB*8bit=977Mbps

  • NGINX作为后端网页的反向代理(client访问proxy,proxy转发给后端多个server)和负载均衡,提升整个站点的负载并发能力(NGINX的负载均衡正是通过反向代理实现)
  • Tomcat作为servlet/jsp容器,处理java语言开发的jsp动态页面程序,这也是tomcat的主要应用场景

Nginx 负载均衡模式

●rr 轮询 (默认负载均衡模式)
每个请求按时间顺序逐一分配到不同的后端服务器,如果超过了最大失败次数后(max_fails,默认1),在失效时间内(fail_timeout,默认10秒),该节点失效权重变为0,超过失效时间后,则恢复正常,或者全部节点都为down后,那么将所有节点都恢复为有效继续探测,一般来说rr可以根据权重来进行均匀分配。

 

●wrr 加权轮询

 weight值越大,被分配到的概率越高,用于后端服务器性能不均的情况。

●least_conn 最少连接
优先将客户端请求调度到当前连接最少的服务器。

rr轮询可能因为开启长连接而负载不均匀,最少连接模式可以缓解这种情况。

●ip_hash 负载均衡模式
每个请求按访问ip的hash结果分配,这样每个访客固定访问一个后端服务器,可以解决session的问题,但是ip_hash会造成负载不均,同一个局域网的客户机(同一个公网IP)全部会分配给同一台服务器。

所以不建议采用ip_hash模式,session 共享问题可用后端服务的 session 共享代替 nginx 的 ip_hash(使用后端服务器自身通过相关机制保持session同步)。

●fair(第三方)负载均衡模式
按后端服务器的响应时间来分配请求,响应时间短的优先分配。(负载小的服务器响应时间自然就短)

●url_hash(第三方)负载均衡模式
基于用户请求的uri做hash。和ip_hash算法类似,是对每个请求按url的hash结果分配,使每个URL定向到同一个后端服务器,但是也会造成分配不均的问题,这种模式后端服务器为缓存时比较好。

配置七层负载均衡^动静分离

服务器IP分配

Nginx 服务器:   192.168.80.101:80
Tomcat服务器1:192.168.80.102:80
Tomcat服务器2:192.168.80.103:8080   192.168.80.103:8081

架构图

1.部署Nginx 负载均衡器

停止防火墙 

systemctl stop firewalld
setenforce 0

安装依赖项 

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

添加NGINX运行用户 

useradd -M -s /sbin/nologin nginx

解压 

cd /opt
tar zxvf nginx-1.24.0.tar.gz -C /opt/

配置软件 

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 \                    #启用 gzip静态压缩
--with-http_flv_module \                            #启用 flv模块,提供对 flv 视频的伪流支持
--with-http_ssl_module                                #启用 SSL模块,提供SSL加密功能
--with-stream                                        #启用 stream模块,提供4层调度
----------------------------------------------------------------------------------------------------------
./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 && make install

 添加入系统路径 以便shell直接调用

ln -s /usr/local/nginx/sbin/nginx /usr/local/sbin/

 编辑service脚本,以便systemctl管理

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.部署2台Tomcat 应用服务器

关闭防火墙 

systemctl stop firewalld
setenforce 0

 解压jdk

tar zxvf jdk-8u91-linux-x64.tar.gz -C /usr/local/

添加jdk环境变量 

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

解压tomcat

tar zxvf apache-tomcat-8.5.16.tar.gz

 移动文件到安装目录

tomcat服务器1如下

mv /opt/apache-tomcat-8.5.16/ /usr/local/tomcat

tomcat服务器2如下

mkdir /usr/local/tomcat
mv apache-tomcat-8.5.16 /usr/local/tomcat/tomcat1
cp -a /usr/local/tomcat/tomcat1 /usr/local/tomcat/tomcat2

启动停止服务 

/usr/local/tomcat/bin/shutdown.sh
/usr/local/tomcat/bin/startup.sh
netstat -ntap | grep 8080

3.动静分离配置


(1)Tomcat1 server 配置

准备动态页面1

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>   #指定为 test1 页面
</head>
<body>
<% out.println("动态页面 1,http://www.test1.com");%>
</body>
</html>

更改service配置

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)Tomcat2 server 配置

准备2个动态页面

准备tomcat server2 实例2页面

mkdir -p /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>

·······················

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

更改server2 实例1 server配置

vim /usr/local/tomcat/tomcat1/conf/server.xml

#删除已经存在的 同样的 HOST 配置(注意范围,不要漏删后面的</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

准备tomcat server2 实例2页面

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>   #指定为 test3 页面
</head>
<body>
<% out.println("动态页面 3,http://www.test3.com");%>
</body>
</html>

更改server2 实例2 server配置 修改 tomcat2 中的 server.xml 文件中的 三个 端口号  8080  8005  8009,要求各 tomcat 实例配置不能有重复的端口号

vim /usr/local/tomcat/tomcat2/conf/server.xml

#删除已经存在的 同样的 HOST 配置(注意范围,不要漏删后面的</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>
 
<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

重启服务 

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


(3)Nginx server 配置

#准备静态页面和静态图片
echo '<html><body><h1>this is static page</h1><img src="1.gif"/></body></html>' > /usr/local/nginx/html/index.html

mkdir /usr/local/nginx/html/img
cp /opt/1.gif /usr/local/nginx/html/img
vim /usr/local/nginx/conf/nginx.conf
......
http {
......
    #gzip on;
    
    #配置负载均衡的服务器列表,weight参数表示权重,权重越高,被分配到的概率越大
    upstream tomcat_server {
        server 192.168.80.102:8080 weight=1;
        server 192.168.80.103:8080 weight=1;
        server 192.168.80.103:8081 weight=1;
    }
    
    server {
        listen 80;
        server_name www.xue.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/img;
            expires 10d;
        }
        
        location / {
            root html;
            index index.html index.htm;
        }
......
    }
......
}

systemctl restart nginx

4.测试效果

测试静态页面效果
浏览器访问 http://192.168.80.101/
浏览器访问 http://192.168.80.101/1.gif

测试负载均衡效果,不断刷新浏览器测试
浏览器访问 http://192.168.80.101/index.jsp


 配置四层+七层负载均衡^动静分离

服务器IP分配

Nginx 四层服务器:   192.168.80.104:80

Nginx 七层服务器:   192.168.80.101:80

Nginx 七层服务器:   192.168.80.105:80
Tomcat服务器1:192.168.80.102:80
Tomcat服务器2:192.168.80.103:8080   192.168.80.103:8081

架构图

1.初始化服务器,新加的两台NGINX服务器上安装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.24.0.tar.gz -C /opt/
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 \                    #启用 gzip静态压缩
--with-http_flv_module \                            #启用 flv模块,提供对 flv 视频的伪流支持
--with-http_ssl_module                              #启用 SSL模块,提供SSL加密功能
--with-stream                                      ✨启用 stream模块,提供4层调度
----------------------------------------------------------------------------------------------------------
./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 && make install
ln -s /usr/local/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

七层负载均衡NGINX服务器105配置,与101相同

准备静态网页文件

echo '<html><body><h1>this is NGINX 7 server 2</h1><img src="1.gif"/></body></html>' > /usr/local/nginx/html/index.html

mkdir /usr/local/nginx/html/img
cp /opt/1.gif /usr/local/nginx/html/img

编辑轮询,转发到 两台7层负载均衡NGINX服务器的80端口的请求 负载均衡反向代理到后面三台tomcat主机

设置与101主机相同(两台7层NGINX nginx.conf设置均相同) 

vim /usr/local/nginx/conf/nginx.conf
......
http {
......
    #gzip on;
    keepalive_timeout  0;  ✨长连接,三台NGINX服务器都要关!!!如果默认65表示65秒后连接断开才能下一次轮循
    #配置负载均衡的服务器列表,weight参数表示权重,权重越高,被分配到的概率越大
    upstream tomcat_server {
        server 192.168.80.101:8080 weight=1;
        server 192.168.80.105:8080 weight=1;
    }
    
    server {
        listen 80;
        server_name www.xue.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/img;
            expires 10d;
        }

        location / {
            root html;
            index index.html index.htm;
        }
......
    }
......
}

四层负载均衡NGINX服务器104配置

 配置4层均衡负载 和http同等级:所以一般只在http上面一段设置

访问80端口反向代理到后面两台7层NGINX上的html静态、jsp动态页面

vim /usr/local/nginx/conf/nginx.conf

stream {
    
    upstream appserver {
        server 192.168.80.101:80 weight=1;
        server 192.168.80.105:80 weight=1;
    }
    server {
        listen 8080;
        proxy_pass appserver;
    }
}

http {
......
    keepalive_timeout  0;  ✨长连接,三台NGINX服务器都要关!!!如果默认65表示65秒后连接断开才能下一次轮循

配置静态网页, 写在http块内

访问8080端口导向4层负载主机(本机)静态页面

......
http {
......
    #gzip on;


    server {
        listen 8080;
        server_name www.xue.com;
    }

keepalive_timeout  0;  ✨长连接,三台NGINX服务器都要关!!!如果默认65表示65秒后连接断开才能下一次轮循 

 访问服务器测试

访问四层均衡nginx 80口反向代理负载均衡给7层服务器,

7层服务器再根据是静态页面还是动态页面选择自己处理,或是再反向代理负载均衡给更后面的三台tomcat服务器。

访问四层均衡nginx 8080口 直接返回本主机的静态页面。

总结

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

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

相关文章

哨兵2号(Sentinel-2)卫星数据批量处理

李国春 2021 10 11 哨兵2号&#xff08;Sentinel-2&#xff09;数据广受欢迎&#xff0c;数据质量好&#xff0c;还免费。人家欧空局有自己的处理软件&#xff0c;也有控制台命令行的批量处理。RSD也来凑凑热闹沾个光&#xff0c;指不定有人喜欢不同的操作风格&#xff0c;愿意…

毫米波雷达IWR1642和DCA1000 EVM环境搭建

本文以毫米波雷达IWR1642和DCA1000进行环境搭建以及数据采集。 介绍 mmWaveStudio GUI设计用于表征和评估TI Radar器械。mmWaveStudio通过SPI向mmWave设备发送命令来配置和控制mmWave设备。使用DCA 1000 EVM或TSW 1400 EVM板捕获ADC数据&#xff0c;并在Matlab中处理数据&…

RL - 强化学习 马尔可夫奖励过程 (MRP) 的状态价值

欢迎关注我的CSDN&#xff1a;https://spike.blog.csdn.net/ 本文地址&#xff1a;https://blog.csdn.net/caroline_wendy/article/details/131084795 GitHub 源码: https://github.com/SpikeKing/Reinforcement-Learning-Algorithm 马尔可夫奖励过程 (MRP) 的状态价值是指在某…

【unity细节】Default constructor not found for type Player(找不到默认构造函数)

&#x1f468;‍&#x1f4bb;个人主页&#xff1a;元宇宙-秩沅 hallo 欢迎 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! 本文由 秩沅 原创 收录于专栏&#xff1a;unity细节和bug ⭐Default constructor not found for type Player ⭐ 文章目录 ⭐Default const…

python爬虫入门,10分钟就够了,这可能是我见过最简单的基础教学

一、基础入门 1.1什么是爬虫 爬虫(spider&#xff0c;又网络爬虫)&#xff0c;是指向网站/网络发起请求&#xff0c;获取资源后分析并提取有用数据的程序。 从技术层面来说就是 通过程序模拟浏览器请求站点的行为&#xff0c;把站点返回的HTML代码/JSON数据/二进制数据&…

Fabric.js 使用自定义字体

theme: smartblue 本文简介 点赞 关注 收藏 学会了 如果你使用 Fabric.js 做编辑类的产品&#xff0c;有可能需要给用户配置字体。 这次就讲讲在 Fabric.js 中创建文本时怎么使用自定义字体、在项目运行时怎么修改字体、以及推荐一个精简字体库的工具。 学习本文前&#xff…

征稿|IJCAI‘23大模型论坛,DeepMind EleutherAI Oxford主题报告

第一届LLMIJCAI’23 Symposium征稿中&#xff0c;优秀投稿论文推荐《AI Open》&#xff08;EI检索&#xff09;和 《JCST》(CCF-B)发表。 大规模语言模型&#xff08;LLMs&#xff09;&#xff0c;如ChatGPT和GPT-4&#xff0c;以其在自然语言理解和生成方面的卓越能力&#xf…

调用腾讯API实现人脸美颜

目录 1. 作者介绍2. 人脸美颜基本原理2.1 获取人脸关键点信息2.2 基于皮肤区域的祛斑算法2.3 脸部器官美型处理2.4 美妆处理 3. 实验流程&#xff08;附代码&#xff09;及结果3.1 调用腾讯API流程3.2 安装依赖库3.3 代码实现3.4 实现结果 常见问题报错以及解决方案 1. 作者介绍…

【备战秋招】JAVA集合

集合 前言 一方面&#xff0c; 面向对象语言对事物的体现都是以对象的形式&#xff0c;为了方便对多个对象 的操作&#xff0c;就要 对对象进行存储。 另一方面&#xff0c;使用Array存储对象方面具有一些弊端&#xff0c;而Java 集合就像一种容器&#xff0c;可以动态地把多…

Towards Blockchain-Based Reputation-Aware Federated Learning

Towards Blockchain-Based Reputation-Aware Federated Learning FINE-GRAINED FEDERATED LEARNINGA. Problem StatementB. DefinitionC. Requirements BLOCKCHAIN-BASED REPUTATION-AWARE FL 论文地址&#xff1a;https://www.researchgate.net/profile/Muhammad-Habib-Ur-Reh…

ChatGPT中文版写日报神器【AI使用技巧】

写日报对于打工人来说是一件枯燥无味又不得不做的工作。有了ChatGPT写日报不再是一件苦差事&#xff0c;分分钟搞掂&#xff0c;你不来试一下吗&#xff1f; ChatGPT中文站https://ai-cn.co提问&#xff1a;我是一名服务端程序员&#xff0c;负责维护商城系统&#xff0c;帮我…

HTTPS安全连接的建立过程

HTTP (Hypertext Transfer Protocol) 和 HTTPS (Hypertext Transfer Protocol Secure) 都是用于在 Web 浏览器和服务器之间传输数据的协议。它们之间的主要区别在于安全性。 HTTP 是一种不安全的协议&#xff0c;因为它在传输过程中不对数据进行加密。这意味着如果有人截取了数…

【立体视觉(二)】之对极几何与关键矩阵

【立体视觉&#xff08;二&#xff09;】之对极几何与关键矩阵 一、对极几何二、关键矩阵一&#xff09;本质矩阵与基础矩阵二&#xff09;本质矩阵的求解三&#xff09;本质矩阵的分解三&#xff09;单应矩阵及其求解 此为个人学习笔记&#xff0c;在各处借鉴了不少好图好文&a…

Ubuntu18.04利用astra pro相机实现ORB—SLAM3实时点云稠密建图—上

Ubuntu18.04利用astra pro相机实现ORB—SLAM3实时点云稠密建图—上 前言前期准备—ROS完整安装 OpenCV的安装&#xff08;4.2.0&#xff09;安装依赖C11特性的编译器Pangolin测试pangolin程序 EigenboostORB-SLAM3 前言 建议编译ORB-SLAM3的硬件设备内存配置至少4GB以上&#…

LinuxSCP和SSH命令

scp命令 cp命令&#xff0c;是拷贝的作用&#xff0c;可以实现将文件或者目录拷贝到另外一个位置。 scp命令&#xff0c;也是拷贝的作用&#xff0c;但是是远程拷贝&#xff0c;可以实现将文件或者目录拷贝到另外的一台机器上。 命令格式 # scp file 远程用户名远程服务器:目标…

Midjourney竞品Leap免费试用; Google 刚刚发布10门独立AI课程

&#x1f989; AI新闻 &#x1f680; Midjourney竞品&#xff0c;免费试玩AI图片生成工具Leap&#xff0c;细节还需提升 摘要&#xff1a;Leap是一款免费试玩的AI图片生成工具&#xff0c;用户可以选择不同的生成模型和步长及数量。功能上尚需提高细节把握能力&#xff0c;但…

【genius_platform软件平台开发】第九十七讲:linux设备驱动中信号(signal函数)的异步通知机制

1. 信号的异步通知 意思是:一旦设备就绪,则主动通知应用程序&#xff0c;这样应用程序根本就不需要查询设备状态&#xff0c;这一点非常类似于硬件上“中断”的概念&#xff0c;比较准确的称谓是“信号驱动的异步I/O”。信号是在软件层次上对中断机制的一种模拟&#xff0c;在…

创新升级!深度学习算法注入机器视觉应用,助力工业领域智慧生产

随着人工智能在算力、算法、大数据等方面的技术突破&#xff0c;基于神经网络的深度学习算法在各行各业加速渗透。而制造业作为AI融合创新的主要场景之一&#xff0c;在机器视觉技术的加持下&#xff0c;持续赋能生产线的自动化、智能化升级&#xff0c;赋予工业生产“感知”能…

【Java se】为什么大部分小数在计算机中是不精确的

目录 一、什么是小数 二、浮点数在计算机中的转换规则 &#xff08;1&#xff09;整数部分转换步骤 &#xff08;2&#xff09; 小数部分转换步骤 三、使用代码说明 四、手动转换小数 一、什么是小数 在计算机中&#xff0c;也称小数为浮点数&#xff0c;因为在使用科学计…

程序员的炫技代码写法

程序员的炫技代码写法 程序员&#xff0c;这个职业总是让人感到神秘而又充满魅力。他们手中的代码常常充满了令人惊叹的炫技操作&#xff0c;让人不禁感叹他们的技术能力之高。在这篇博客中&#xff0c;我想和大家分享一些我所知道的程序员的炫技代码写法。 一、代码美感——…