# 利刃出鞘_Tomcat 核心原理解析(八)-- Tomcat 集群

news2024/12/23 13:22:22

利刃出鞘_Tomcat 核心原理解析(八)-- Tomcat 集群

一、Tomcat专题 - Tomcat集群 - 介绍及准备工作

1、Tomcat集群 简介

由于单台Tomcat的承载能力是有限的,当我们的业务系统用户量比较大,请求压力比较大时,单台Tomcat是扛不住的,这个时候,就需要搭建Tomcat的集群,而目前比较流程的做法就是通过Nginx来实现Tomcat集群的负载均衡。

tomcat-40.png

2、Tomcat 集群环境准备–准备 Tomcat

1)在服务器上, 安装两台 tomcat, 然后分别改 Tomcat 服务器的端口号 :

8005 ‐‐‐‐‐‐‐‐‐> 8015 ‐‐‐‐‐‐‐‐‐> 8025
8080 ‐‐‐‐‐‐‐‐‐> 8888 ‐‐‐‐‐‐‐‐‐> 9999
8009 ‐‐‐‐‐‐‐‐‐> 8019 ‐‐‐‐‐‐‐‐‐> 8029

2)新建一个目录 D:\java-test\tomcat-colony\

3)解压 apache-tomcat-8.5.42-windows-x64.zip 到 目录 D:\java-test\tomcat-colony\ 下,并命名为 D:\java-test\tomcat-colony\tomcat-8888\

4)再次解压 apache-tomcat-8.5.42-windows-x64.zip 到 目录 D:\java-test\tomcat-colony\ 下,并命名为 D:\java-test\tomcat-colony\tomcat-9999\

5)修改 D:\java-test\tomcat-colony\tomcat-8888\conf\server.xml 配置文件 端口。


<?xml version="1.0" encoding="UTF-8"?>

<Server port="8015" shutdown="SHUTDOWN">

  <Listener className="org.apache.catalina.startup.VersionLoggerListener" />
  <Listener className="org.apache.catalina.core.AprLifecycleListener" SSLEngine="on" /> 
  <Listener className="org.apache.catalina.core.JreMemoryLeakPreventionListener" />
  <Listener className="org.apache.catalina.mbeans.GlobalResourcesLifecycleListener" />
  <Listener className="org.apache.catalina.core.ThreadLocalLeakPreventionListener" />
 
  <GlobalNamingResources>  
    <Resource name="UserDatabase" auth="Container"
              type="org.apache.catalina.UserDatabase"
              description="User database that can be updated and saved"
              factory="org.apache.catalina.users.MemoryUserDatabaseFactory"
              pathname="conf/tomcat-users.xml" />
  </GlobalNamingResources>
 
  <Service name="Catalina">   
    <Connector port="8888" protocol="HTTP/1.1"
               connectionTimeout="20000"
               redirectPort="8443" />

    <Connector port="8019" protocol="AJP/1.3" redirectPort="8443" />
	
    <Engine name="Catalina" defaultHost="localhost">
      <Realm className="org.apache.catalina.realm.LockOutRealm">      
        <Realm className="org.apache.catalina.realm.UserDatabaseRealm"
               resourceName="UserDatabase"/>
      </Realm>
      <Host name="localhost"  appBase="webapps"
            unpackWARs="true" autoDeploy="true">      
        <Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
               prefix="localhost_access_log" suffix=".txt"
               pattern="%h %l %u %t &quot;%r&quot; %s %b" />
      </Host>
    </Engine>
  </Service>
</Server>
<!-- D:\java-test\tomcat-colony\tomcat-8888\conf\server.xml -->

6)修改 D:\java-test\tomcat-colony\tomcat-9999\conf\server.xml 配置文件 端口。


<?xml version="1.0" encoding="UTF-8"?>

<Server port="8025" shutdown="SHUTDOWN">

  <Listener className="org.apache.catalina.startup.VersionLoggerListener" />
  <Listener className="org.apache.catalina.core.AprLifecycleListener" SSLEngine="on" /> 
  <Listener className="org.apache.catalina.core.JreMemoryLeakPreventionListener" />
  <Listener className="org.apache.catalina.mbeans.GlobalResourcesLifecycleListener" />
  <Listener className="org.apache.catalina.core.ThreadLocalLeakPreventionListener" />
 
  <GlobalNamingResources>  
    <Resource name="UserDatabase" auth="Container"
              type="org.apache.catalina.UserDatabase"
              description="User database that can be updated and saved"
              factory="org.apache.catalina.users.MemoryUserDatabaseFactory"
              pathname="conf/tomcat-users.xml" />
  </GlobalNamingResources>
 
  <Service name="Catalina">   
    <Connector port="9999" protocol="HTTP/1.1"
               connectionTimeout="20000"
               redirectPort="8443" />

    <Connector port="8029" protocol="AJP/1.3" redirectPort="8443" />
	
    <Engine name="Catalina" defaultHost="localhost">
      <Realm className="org.apache.catalina.realm.LockOutRealm">      
        <Realm className="org.apache.catalina.realm.UserDatabaseRealm"
               resourceName="UserDatabase"/>
      </Realm>
      <Host name="localhost"  appBase="webapps"
            unpackWARs="true" autoDeploy="true">      
        <Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
               prefix="localhost_access_log" suffix=".txt"
               pattern="%h %l %u %t &quot;%r&quot; %s %b" />
      </Host>
    </Engine>
  </Service>
</Server>
<!-- D:\java-test\tomcat-colony\tomcat-9999\conf\server.xml -->

3、Tomcat 集群环境准备–安装配置 Nginx

1)在当前服务器上 , 安装 Nginx :解压 nginx-1.8.1.zip 到 D:\java-test\tomcat-colony\ 目录下。

2)修改 D:\java-test\tomcat-colony\nginx-1.8.1\conf\nginx.conf 配置文件,配置 nginx。


# D:\java-test\tomcat-colony\nginx-1.8.1\conf\nginx.conf

worker_processes  1;

events {
    worker_connections  1024;
}

http {
    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;
        }
    }
	
	upstream serverpool{
		server localhost:8888;
		server localhost:9999;
	}
	
	server {
		listen 99;
		server_name localhost;
		location / {
			proxy_pass http://serverpool/;
		}
	}
}

# D:\java-test\tomcat-colony\nginx-1.8.1\conf\nginx.conf

二、Tomcat专题 - Tomcat集群 - 负载均衡策略

1、修改 D:\java-test\tomcat-colony\tomcat-8888\webapps\ROOT\index.jsp 区别主页访问

......
    <body>
        <div id="wrapper">
            <div id="navigation" class="curved container">
                <span id="nav-home"><a href="${tomcatUrl}">Home-8888</a></span>
				......

2、修改 D:\java-test\tomcat-colony\tomcat-9999\webapps\ROOT\index.jsp 区别主页访问

......
    <body>
        <div id="wrapper">
            <div id="navigation" class="curved container">
                <span id="nav-home"><a href="${tomcatUrl}">Home-9999</a></span>
				......

3、启动 两个 tomcat 和 nginx 浏览器访问测试。

1)启动 端口 8888 的 tomcat

D:\java-test\tomcat-colony\tomcat-8888\bin\startup.bat

2)启动 端口 9999 的 tomcat

D:\java-test\tomcat-colony\tomcat-9999\bin\startup.bat

3)启动 nginx

D:\java-test\tomcat-colony\nginx-1.8.1\nginx.exe

4)浏览器访问测试

http://localhost:8888/ 访问 Home-8888

http://localhost:9999/ 访问 Home-9999

http://localhost:99/ 发现 轮询访问 Home-8888 和 Home-9999

tomcat-41.png

4、负载均衡策略

1) 轮询

最基本的配置方法,它是 upstream 模块默认的负载均衡默认策略。每个请求会按时间顺序逐一分配到不同的后端服务器。

  • 修改 D:\java-test\tomcat-colony\nginx-1.8.1\conf\nginx.conf 配置文件,配置 nginx 负载均衡策略–轮询。

upstream serverpool{
	server localhost:8888;
	server localhost:9999;
}
  • 参数说明:
参数描述
fail_timeout与max_fails结合使用
max_fails设置在fail_timeout参数设置的时间内最大失败次数,如果在这个时间内,所有针对该服务器的请求都失败了,那么认为该服务器会被认为是停机了
fail_time服务器会被认为停机的时间长度,默认为10s
backup标记该服务器为备用服务器。当主服务器停止时,请求会被发送到它这里
down标记服务器永久停机了

2) weight 权重

  • 权重方式,在轮询策略的基础上指定轮询的几率。

upstream serverpool{
	server localhost:8888 weight=3;
	server localhost:9999 weight=1;
}
  • weight 参数用于指定轮询几率,weight的默认值为1;weight的数值与访问比率成正比,
  • 比如8888服务器上的服务被访问的几率为9999服务器的三倍。
  • 此策略比较适合服务器的硬件配置差别比较大的情况。

3) ip_hash

指定负载均衡器按照基于客户端IP的分配方式,这个方法确保了相同的客户端的请求一直发送到相同的服务器,以保证 session 会话。这样每个访客都固定访问一个后端服务器,可以解决 session 不能跨服务器的问题。


upstream serverpool{
	ip_hash;
	server 192.168.192.133:8080;
	server 192.168.192.137:8080;
}

三、Tomcat专题 - Tomcat集群 - session共享问题及方案

1、Session 共享问题

在 Tomcat 集群中,如果应用需要用户进行登录,那么这个时候,用于 tomcat 做了负载均衡,则用户登录并访问应用系统时,就会出现问题 。

tomcat-42.png

2、Session 共享方案

1) ip_hash 策略

一个用户发起的请求,只会请求到 tomcat1 上进行操作,另一个用户发起的请求只在 tomcat2 上进行操作 。那么这个时候,同一个用户发起的请求,都会通过 nginx 的 ip_hash 策略,将请求转发到其中的一台 Tomcat 上。

2) Session 复制

四、Tomcat专题 - Tomcat集群 - Session复制

1、在 servlet_demo01 工程模块中,创建 session.jsp 页面,


<%--
  D:\java-test\idea2019\project_tomcat\servlet_demo01\web\session.jsp

  Created by IntelliJ IDEA.
  User: Administrator
  Date: 2024/8/24
  Time: 21:15
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>

    TOMCAT9999<br/>
    sessionID : <%= session.getId()%>
    <br/>

    <%
        Object loginUser = session.getAttribute("loginUser");
        if(loginUser != null && loginUser.toString().length()>0){
            out.println("session 有值, loginUser = " + loginUser);
        }else{
            session.setAttribute("loginUser","dgz168");
            out.println("session 没有值");
        }
    %>
</body>
</html>

2、servlet_demo01 工程模块 创建,请点击:

# 利刃出鞘_Tomcat 核心原理解析(六)

3、打包 servlet_demo01 工程模块成 servlet_demo01.war 包。


idea --> File 
--> Project Structure 
--> Artifacts 
--> 点击 【+--> 选择【Web Application Archive--> Name : ( servlet_demo01 )
	点击 servlet_demo01.war
	右键 'servlet_demo01'compile output
	Put into /WEB-INF/classes
	右键 Java EE...
	Put into /WEB-INF/lib
	右键 Web facet resources 
	Put into Output Root	
--> Apply --> OK


idea --> Build 
--> Build Artifact
--> servlet_demo01
--> Build 
-->...\out\artifacts\servlet_demo01\ 文件夹,找到 servlet_demo01.war

4、复制 servlet_demo01.war 到 tomcat 目录中。并启动两个 tomcat 服务。

D:\java-test\tomcat-colony\tomcat-8888\webapps\servlet_demo01.war

D:\java-test\tomcat-colony\tomcat-9999\webapps\servlet_demo01.war

1)启动 端口 8888 的 tomcat

D:\java-test\tomcat-colony\tomcat-8888\bin\startup.bat

2)启动 端口 9999 的 tomcat

D:\java-test\tomcat-colony\tomcat-9999\bin\startup.bat

3)启动两个 tomcat 服务后,会生成两个文件夹:

D:\java-test\tomcat-colony\tomcat-8888\webapps\servlet_demo01\

D:\java-test\tomcat-colony\tomcat-9999\webapps\servlet_demo01\

5、修改 D:\java-test\tomcat-colony\tomcat-8888\webapps\servlet_demo01\session.jsp 页面,

重启两台 tomcat 和 nginx 进行测试。

<%--
  D:\java-test\tomcat-colony\tomcat-8888\webapps\servlet_demo01\session.jsp

  Created by IntelliJ IDEA.
  User: Administrator
  Date: 2024/8/24
  Time: 21:15
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>

    TOMCAT8888<br/>
    sessionID : <%= session.getId()%>
    <br/>

    <%
        Object loginUser = session.getAttribute("loginUser");
        if(loginUser != null && loginUser.toString().length()>0){
            out.println("session 有值, loginUser = " + loginUser);
        }else{
            session.setAttribute("loginUser","dgz168");
            out.println("session 没有值");
        }
    %>
</body>
</html>

1)启动 端口 8888 的 tomcat

D:\java-test\tomcat-colony\tomcat-8888\bin\startup.bat

2)启动 端口 9999 的 tomcat

D:\java-test\tomcat-colony\tomcat-9999\bin\startup.bat

3)启动 nginx

D:\java-test\tomcat-colony\nginx-1.8.1\nginx.exe

4)浏览器访问测试

http://localhost:8888/ 访问 Home-8888

http://localhost:9999/ 访问 Home-9999

http://localhost:99/

tomcat-43.png

tomcat-44.png

5)访问到的两台 Tomcat 出现的 sessionID 是不一样的,说明两台 Tomcat 的 Session 各是各的,并没有进行同步,这在集群环境下是存在问题的。

6、Session 同步的配置如下:

1) 在 Tomcat 的 conf/server.xml 配置如下:

<Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster"/>
  • D:\java-test\tomcat-colony\tomcat-8888\conf\server.xml

<?xml version="1.0" encoding="UTF-8"?>

<Server port="8015" shutdown="SHUTDOWN">

  <Listener className="org.apache.catalina.startup.VersionLoggerListener" />
  <Listener className="org.apache.catalina.core.AprLifecycleListener" SSLEngine="on" /> 
  <Listener className="org.apache.catalina.core.JreMemoryLeakPreventionListener" />
  <Listener className="org.apache.catalina.mbeans.GlobalResourcesLifecycleListener" />
  <Listener className="org.apache.catalina.core.ThreadLocalLeakPreventionListener" />
 
  <GlobalNamingResources>  
    <Resource name="UserDatabase" auth="Container"
              type="org.apache.catalina.UserDatabase"
              description="User database that can be updated and saved"
              factory="org.apache.catalina.users.MemoryUserDatabaseFactory"
              pathname="conf/tomcat-users.xml" />
  </GlobalNamingResources>
 
  <Service name="Catalina">   
    <Connector port="8888" protocol="HTTP/1.1"
               connectionTimeout="20000"
               redirectPort="8443" />
			   
    <Connector port="8019" protocol="AJP/1.3" redirectPort="8443" />
		
    <Engine name="Catalina" defaultHost="localhost">
	
	  <!-- Session 同步的配置 -->
	  <Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster"/>
		
      <Realm className="org.apache.catalina.realm.LockOutRealm">      
        <Realm className="org.apache.catalina.realm.UserDatabaseRealm"
               resourceName="UserDatabase"/>
      </Realm>
      <Host name="localhost"  appBase="webapps"
            unpackWARs="true" autoDeploy="true">      
        <Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
               prefix="localhost_access_log" suffix=".txt"
               pattern="%h %l %u %t &quot;%r&quot; %s %b" />
      </Host>
    </Engine>
  </Service>
</Server>
<!-- D:\java-test\tomcat-colony\tomcat-8888\conf\server.xml -->

  • D:\java-test\tomcat-colony\tomcat-9999\conf\server.xml

<?xml version="1.0" encoding="UTF-8"?>

<Server port="8025" shutdown="SHUTDOWN">

  <Listener className="org.apache.catalina.startup.VersionLoggerListener" />
  <Listener className="org.apache.catalina.core.AprLifecycleListener" SSLEngine="on" /> 
  <Listener className="org.apache.catalina.core.JreMemoryLeakPreventionListener" />
  <Listener className="org.apache.catalina.mbeans.GlobalResourcesLifecycleListener" />
  <Listener className="org.apache.catalina.core.ThreadLocalLeakPreventionListener" />
 
  <GlobalNamingResources>  
    <Resource name="UserDatabase" auth="Container"
              type="org.apache.catalina.UserDatabase"
              description="User database that can be updated and saved"
              factory="org.apache.catalina.users.MemoryUserDatabaseFactory"
              pathname="conf/tomcat-users.xml" />
  </GlobalNamingResources>
 
  <Service name="Catalina">   
    <Connector port="9999" protocol="HTTP/1.1"
               connectionTimeout="20000"
               redirectPort="8443" />

    <Connector port="8029" protocol="AJP/1.3" redirectPort="8443" />
	
    <Engine name="Catalina" defaultHost="localhost">
		
	  <!-- Session 同步的配置 -->
	  <Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster"/>
	  
      <Realm className="org.apache.catalina.realm.LockOutRealm">      
        <Realm className="org.apache.catalina.realm.UserDatabaseRealm"
               resourceName="UserDatabase"/>
      </Realm>
      <Host name="localhost"  appBase="webapps"
            unpackWARs="true" autoDeploy="true">      
        <Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
               prefix="localhost_access_log" suffix=".txt"
               pattern="%h %l %u %t &quot;%r&quot; %s %b" />
      </Host>
    </Engine>
  </Service>
</Server>
<!-- D:\java-test\tomcat-colony\tomcat-9999\conf\server.xml -->

2) 在 Tomcat 部署的应用程序 servlet_demo01 的 web.xml 中加入如下配置 :

<distributable/>
  • D:\java-test\tomcat-colony\tomcat-8888\webapps\servlet_demo01\WEB-INF\web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
         version="3.1">

    <servlet>
        <servlet-name>bbsServlet</servlet-name>
        <servlet-class>djh.it.web.BbsServlet</servlet-class>
    </servlet>

    <servlet-mapping>
        <servlet-name>bbsServlet</servlet-name>
        <url-pattern>/bbs/findAll</url-pattern>
    </servlet-mapping>

    <context-param>
        <param-name>project_param_01</param-name>
        <param-value>dzs168</param-value>
    </context-param>

    <!-- 会话配置session-config -->
    <session-config>
        <session-timeout>30</session-timeout>
        <cookie-config>
            <name>JESSIONID</name>
            <domain>localhost</domain>
            <path>/</path>
            <comment>Session Cookie</comment>
            <http-only>true</http-only>
            <secure>false</secure>
            <max-age>3600</max-age>
        </cookie-config>
    </session-config>

    <!-- 欢迎页面 -->
   <welcome-file-list>
       <welcome-file>login.jsp</welcome-file>
   </welcome-file-list>

	<!-- Session 同步的配置 -->
	<distributable/>

    <!-- 错误页面 -->
<!--    <error-page>-->
<!--        <error-code>404</error-code>-->
<!--        <location>/404.html</location>-->
<!--    </error-page>-->
<!--    <error-page>-->
<!--        <error-code>500</error-code>-->
<!--        <location>/500.html</location>-->
<!--    </error-page>-->
<!--    <error-page>-->
<!--        <exception-type>java.lang.Exception</exception-type>-->
<!--        <location>/error.jsp</location>-->
<!--    </error-page>-->

</web-app>
<!-- D:\java-test\tomcat-colony\tomcat-8888\webapps\servlet_demo01\WEB-INF\web.xml -->

  • D:\java-test\tomcat-colony\tomcat-9999\webapps\servlet_demo01\WEB-INF\web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
         version="3.1">

    <servlet>
        <servlet-name>bbsServlet</servlet-name>
        <servlet-class>djh.it.web.BbsServlet</servlet-class>
    </servlet>

    <servlet-mapping>
        <servlet-name>bbsServlet</servlet-name>
        <url-pattern>/bbs/findAll</url-pattern>
    </servlet-mapping>

    <context-param>
        <param-name>project_param_01</param-name>
        <param-value>dzs168</param-value>
    </context-param>

    <!-- 会话配置session-config -->
    <session-config>
        <session-timeout>30</session-timeout>
        <cookie-config>
            <name>JESSIONID</name>
            <domain>localhost</domain>
            <path>/</path>
            <comment>Session Cookie</comment>
            <http-only>true</http-only>
            <secure>false</secure>
            <max-age>3600</max-age>
        </cookie-config>
    </session-config>

    <!-- 欢迎页面 -->
   <welcome-file-list>
       <welcome-file>login.jsp</welcome-file>
   </welcome-file-list>
   
   <!-- Session 同步的配置 -->
   <distributable/>

    <!-- 错误页面 -->
<!--    <error-page>-->
<!--        <error-code>404</error-code>-->
<!--        <location>/404.html</location>-->
<!--    </error-page>-->
<!--    <error-page>-->
<!--        <error-code>500</error-code>-->
<!--        <location>/500.html</location>-->
<!--    </error-page>-->
<!--    <error-page>-->
<!--        <exception-type>java.lang.Exception</exception-type>-->
<!--        <location>/error.jsp</location>-->
<!--    </error-page>-->

</web-app>
<!-- D:\java-test\tomcat-colony\tomcat-9999\webapps\servlet_demo01\WEB-INF\web.xml -->

3) 配置完毕之后, 再次重启两个 Tomcat 服务,进行测试。

  • 启动 端口 8888 的 tomcat

D:\java-test\tomcat-colony\tomcat-8888\bin\startup.bat

  • 启动 端口 9999 的 tomcat

D:\java-test\tomcat-colony\tomcat-9999\bin\startup.bat

  • 启动 nginx

D:\java-test\tomcat-colony\nginx-1.8.1\nginx.exe

  • 浏览器访问测试

http://localhost:8888/ 访问 Home-8888

http://localhost:9999/ 访问 Home-9999

http://localhost:99/

tomcat-45.png

7、Session 同步的配置 注意事项:

Session 同步的配置 只适用于较小的集群环境(节点数不超过4个),如果集群的节点数比较多的话,通过这种广播的形式来完成 Session 的复制,会消耗大量的网络带宽,影响服务的性能。

五、Tomcat专题 - Tomcat集群 - SSO解决Session共享问题

1、SSO-单点登录

单点登录(Single Sign On),简称为 SSO,是目前比较流行的企业业务整合的解决方案之一。SSO的定义是在多个应用系统中,用户只需要登录一次就可以访问所有相互信任的应用系统,也是用来解决集群环境Session共享的方案之一 。

2、SSO-单点登录 示意图

tomcat-46.png

上一节关联链接请点击
# 利刃出鞘_Tomcat 核心原理解析(七)

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

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

相关文章

i.MX6裸机开发(8):中断

相比STM32的NVIC&#xff0c;i.MX 6ULL的中断控制系统更复杂&#xff0c;它的中断管理器使用的是GIC V2&#xff0c;GIC V2的实现方式与我们熟知的NVIC差别较大。 本章重点讲解i.MX 6U的GIC基本结构以及实现方法&#xff0c;更详细的介绍可以参考《ARM Generic Interrupt Contr…

快速学习初阶“堆“(数据结构C语言)

前言&#xff1a; 二叉树是什么&#xff1f; 同样也和之前的"栈"跟"队列"是一样的&#xff0c;是一种存储数据的方式&#xff0c;只不过二叉树的结构更为复杂。 那么为什么要用二叉树存储数据呢&#xff1f;真的多此一举吗&#xff1f; 它的实际作用是什么…

买对不买贵,宠物空气净化器应该怎么选才能选到好的产品

你是否还在为家中无处不在的猫毛而烦恼&#xff1f;每当有风吹来&#xff0c;就把四处躲藏的猫毛给吹出来&#xff0c;不经意间就可能让这些”蒲公英“悄悄附在你的食物上&#xff0c;或是不经意间吸入鼻腔&#xff0c;让人既无奈又尴尬。你是否每天下班回家后的第一件事&#…

AnyV2V:一种用于各种视频编辑任务的即插即用框架

人工智能咨询培训老师叶梓 转载标明出处 视频编辑任务通常涉及根据额外的控制信息&#xff08;如文本提示、主题、风格等&#xff09;编辑源视频&#xff0c;以生成与源视频和提供的控制信息相符的新视频。然而&#xff0c;现有方法往往局限于特定类型的编辑任务&#xff0c;难…

面向对象06:super关键字详解

本节内容视频链接&#xff1a;面向对象10&#xff1a;Super详解_哔哩哔哩_bilibilihttps://www.bilibili.com/video/BV12J41137hu?p69&vd_sourceb5775c3a4ea16a5306db9c7c1c1486b5 Java中的‌super关键字是一个特殊的引用&#xff0c;‌用于指代父类对象‌。‌在子…

搜维尔科技:Xsens通过其先进的动作捕捉技术和惯性跟踪传感器,实现了与机器人的高效互动,提高了机器人的操作精度、自然性和稳定性

‌Xsens通过实时动作捕捉技术和MTI惯性跟踪传感器与机器人进行互动‌&#xff0c;这些技术为机器人提供了高精度的运动数据和稳定的导航能力&#xff0c;从而实现了机器人操作的精确性和效率的提升。 Xsens的技术主要应用于两大领域&#xff1a;人类物理交互行为的建模和分析&a…

如何使用ssm实现基于java的小型超市管理系统+vue

TOC ssm195基于java的小型超市管理系统vue 绪论 1.1 研究背景 现在大家正处于互联网加的时代&#xff0c;这个时代它就是一个信息内容无比丰富&#xff0c;信息处理与管理变得越加高效的网络化的时代&#xff0c;这个时代让大家的生活不仅变得更加地便利化&#xff0c;也让…

Git 的配置

1. 忽略特殊文件 在⽇常开发中&#xff0c;我们有些⽂件不想或者不应该提交到远端&#xff0c;⽐如保存了数据库密码的配置⽂件&#xff0c;那怎么让 Git 知道呢&#xff1f;在 Git ⼯作区的根⽬录下创建⼀个特殊的 .gitignore ⽂件&#xff0c;然后把要忽略的⽂件名填进去&am…

【中仕公考怎么样】2025年山东各考试汇总

准备同时备考山东多项考试的考生看过来啦!本篇文章带大家了解一下2025年山东省各项考试时间节点! ①国考 公告发布:2024年10月14日(参考去年) 笔试时间:11月下旬 笔试内容:行测申论&#xff0c;部分有专业科目;面试形式:结构化 ②省考 公告发布:2024年11月 笔试时间:202…

Unet改进8:在不同位置添加SpatialGroupEnhance||空间群智能增强:改进卷积网络中的语义特征学习

本文内容:在不同位置添加SpatialGroupEnhance 论文简介 卷积神经网络(Convolutional Neural Networks, cnn)通过收集分层的、不同部分的语义子特征来生成复杂对象的特征表示。这些子特征通常以分组的形式分布在每一层的特征向量中[43,32],代表各种语义实体。然而,这些子特征…

python --cnlunar(黄历)

import datetime import cnlunara cnlunar.Lunar(datetime.datetime(2024, 8, 26, 10, 30), godType8char) # 常规算法 # a cnlunar.Lunar(datetime.datetime(2022, 2, 3, 10, 30), godType8char, year8CharbeginningOfSpring) # 八字立春切换算法 dic {日期: a.date,农历…

如何使用ssm实现毕业生就业管理平台

TOC ssm192毕业生就业管理平台jsp 绪论 1.1 研究背景 当前社会各行业领域竞争压力非常大&#xff0c;随着当前时代的信息化&#xff0c;科学化发展&#xff0c;让社会各行业领域都争相使用新的信息技术&#xff0c;对行业内的各种相关数据进行科学化&#xff0c;规范化管理…

如何使用ssm实现保险业务管理系统设计与实现

TOC ssm131保险业务管理系统设计与实现jsp 绪论 1.1 研究背景 当前社会各行业领域竞争压力非常大&#xff0c;随着当前时代的信息化&#xff0c;科学化发展&#xff0c;让社会各行业领域都争相使用新的信息技术&#xff0c;对行业内的各种相关数据进行科学化&#xff0c;规…

Pytorch构建网络模型结构都有哪些方式

目录 前言 1.使用nn.Module基类 2.使用nn.Sequential容器 3. 使用nn.ModuleList 4. 使用nn.ModuleDict 5. 混合使用nn.Module和原生Python代码 6.表格总结 前言 nn.Module&#xff1a;最通用、最灵活的方式&#xff0c;适用于几乎所有场景。nn.Sequential&#xff1a;适…

基于Springboot/Vue的企业内部培训考试系统

本系统不开源&#xff01; 本系统不开源&#xff01; 本系统不开源&#xff01; 前言&#xff1a; 时间宝贵的朋友直接跳过这段进入主题吧。 首先&#xff0c;好久没有静心写点东西了&#xff0c;有些经验之谈、生活经历以及一些规划和感悟吧&#xff0c;大体写一下就当自我…

Linux下编译安装PETSc

本文记录在Linux编译安装PETSc的流程。 1 下载代码 git clone https://gitlab.com/petsc/petsc.git cd ./petsc git checkout v3.21.4 2 安装依赖 3 PETSc Without MPI 3.1 Debug版本 3.1.1 配置 export PETSC_ARCHarch-linux-c-debug-dto python3 ./configure --prefix/…

水凝胶与柔性电子啥关系?能用来干啥?

大家好&#xff0c;今天我们来聊一聊一篇关于水凝胶在柔性电子领域应用的文章——《Smart materials for flexible electronics and devices: hydrogel》发表于《RSC Advances》。随着科技的不断发展&#xff0c;柔性电子设备越来越受到关注&#xff0c;而水凝胶作为一种具有独…

python-小理和01串(赛氪OJ)

[题目描述] 小理有一个 01 串&#xff0c;串中只包含 0 和 1 &#xff0c;小理要把这个串划分成连续的 m 段&#xff0c;使得每一段至少包含一个 0 和一个 1 。小理想最大化 m &#xff0c;m 最大是多少呢&#xff1f;输入格式&#xff1a; 输入包含一行一个 01 串 S 。保证中至…

OpenCV绘图函数详解及其用法示例

MFC类库中的CDC类有划线,画矩形,画椭圆,画多边形,文字等绘图函数,OpenCV也有类似的绘图函数。二者的区别在于MFC画图是在一定的区域内绘制图形,而OpenCV则是在图像上绘制,主要用于图像标注。 OpenCV的常用绘图函数有arrowedLine,circle ,drawContours, drawMarker, dra…

Date.now()与performance.now()

前言 Date.now() 和 performance.now() 都是 JS 中用于获取当前时间的方法&#xff0c;本文将讲述二者的区别与优劣。 Date.now() 返回自 Unix 时间纪元&#xff08;1970年1月1日 00:00:00 UTC&#xff09;以来的毫秒数。 在大多数环境下&#xff0c;Date.now() 的精度为 1毫…