Tomcat服务部署和优化

news2024/11/18 11:27:39

目录

一、Tomcat:

1、Tomcat作用:

2、Tomcat的核心组件:

3、servlet作用:

4、Tomcat的核心功能:

二、tomcat配置


一、Tomcat:

是一个开源的web应用服务器,nginx主要处理静态页面,那么静态请求(连接数据库,动态页面)并不是nginx的强项,鼎泰的请求会交给Tomcat进行处理

nginx——转发动态请求——Tomcat

1、Tomcat作用:
  1. 处理动态页面(基于http的请求)
  2. 处理后端请求(调用数据库服务)
  3. 易部署:Tomcat会自动识别配置文件。自动部署运行

Tomcat的缺点:是一个轻量级的服务软件,处理中小架构的网站可以满足需要,大型的交互需求,Tomcat就非长相了

可以替换为Python和node.js、容器化来处理大型架构网站

在容器化部署的项目架构中是不使用Tomcat的,都是jar包直接运行,包括k8s

2、Tomcat的核心组件:

1、web容器:完成web功能,处理的请求也是nginx转发的http(https)请求,处理的是动态页面(基于Java代码编译的页面)

也可以处理后端的请求(转发到数据库的请求)

  1. servlet:cataline是整个Tomcat处理的底层逻辑。处理web请求的动态页面,也处理后端请求(数据库)
  2. jsp:jsp会把动态翻译成serlvet的代码。用编译后的规则,显示代码的静态页面。

静态页面:html

动态页面:php index.php

                  jsp index.jsp    ——由java格式写成的代码,靠jsp翻译,servlet执行编译后的代理,最后在展示结果

容器:容器通常指的是一种虚拟化技术,允许在当前的操作系统中虚拟化的运行多个独立的环境。独立运行的环境就是我们说的容器,彼此之间相互隔离,拥有自己的系统资源。宿主,容器寄生在宿主中,使用的是宿主的资源。

servlet容器:用于开发web应用程序的关键组件

处理http请求生成动态内容以及与客户端之间的交互、和前端交互 、后端数据库服务器交互、和redis缓存交互

类:Java当中调用各种方法,由开发人员自定义

3、servlet作用:

根据类中的方法处理http请求

生成动态页面内容

会话管理,处理用户对话,跟踪用户在互通请求之间的状态。servlet可以在用户访问不同页面时保持用户的状态信息(购物车同步,用户同步登录)

JSP:java server pages 动态网页的开发技术,使用JSP的标签可以在html的网页当中插入java代码。

<% 开头

%> 结尾

实现一个基于Java web应用程序的访问界面。用户界面。或者访问数据库生成页面内容

4、Tomcat的核心功能:

功能部分由两个块组成:

由接收和响应外部请求的连接器connector和负责处理请求的 container组成

engine:引擎,管理多个虚拟主机,一个Tomcat里面只能有一个engine

host:代表站点,也就是虚拟主机,一个engine可以有多个host

context:一个context指向一个web应用

wrapper:最底层,处理和编译代码,运行结果。运行出来的结果在往上层反馈到连接器,最后到用户

java组件:

JDK:开发工具包,开发Java的应用程序。jdk包括编译器、调试器、等等以及java的类库

是开发者用来创建、编译、运行java程序的重要组件

JVM:java的虚拟机负责编译后的java字节码编程本地的机器码。主要就是运行java的代码

运行完之后jvm提供内存管理、垃圾回收机制、线程管理。

二、tomcat配置

安装Tomcat先安装java环境:

安装rpm软件:rpm -ivh 包名

rpm -ivh jdk-8u201-linux-x64.rpm

rpm -ql | tail -n 1

查找rpm安装软件的安装路径

vim /etc/profile.d/java.sh

配置下面:

export JAVA_HOME=/usr/java/jdk1.8.0_201-amd64

export CLASSPATH=.:$JAVA_HOME/lib/tools.jar:$JAVA_HOME/lib/dt.jar

export PATH=$JAVA_HOME/bin:$PATH

source

java -version

查看java版本

安装Tomcat:解压即可

tar -xf apache-tomcat-9.0.16.tar.gz

将软件剪切到local目录下面去

mv apache-tomcat-9.0.16 /usr/local/tomcat

进入/usr/local/tomcat

目录文件:

bin:存放启动或者关闭Tomcat的脚本文件startup.sh shoutdow.sh

conf:配置文件目录,server.xml主配置文件

webapps:Tomcat默认的web应用的部署目录

work:Tomcat的工作目录,存放jsp编译之后产生的class文件。清缓存会用到

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

或者./startup.sh 启动Tomcat

如何对Tomcat配置虚拟主机:
1、配置工作目录

在公司中运行多个项目,一台部署Tomcat太多会浪费资源,所以会在Tomcat中配置多个主机

通过不同域名访问不通的内容

www.test.com

www.koeda.com

1.创建 kgc 和 benet 项目目录和文件

mkdir /usr/local/tomcat/webapps/kgc   

mkdir /usr/local/tomcat/webapps/benet

echo "This is kgc page\!" > /usr/local/tomcat/webapps/kgc/index.jsp

echo "This is benet page\!" > /usr/local/tomcat/webapps/benet/index.jsp

然后conf server.xml中配置:

148行 host 默认主机删除

160行重新添加host

Host name="www.test.com" 指定站点(虚拟主机的域名)

appBase="webapps" 站点的工作目录在webapps 存放web应用的目录

unpackWARs="true" 启动webapps时,对WAR包进行展开

autoDeploy="true" 放置在默认应用目录的程序文件,自动进行部署

xmIValidation="false" 是否验证xml文件执行的有效性标志,false不检查

xmINamespaceAware="false" 是否启用xml文件的命令空间,false不启用

docBase="/usr/local/tomcat/webapps/kgc":  web应用程序的具体部署位置,也就是Context所属的Host中具体的工作目录

path为空,默认就是webapps

reloadable="true"  允许重新加载Context相关的web应用程序的类。

这里和nginx的虚拟主机配置方法一样,只不过换了一个写法:

2.修改 Tomcat 主配置文件 server.xml

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

--165行前--插入

<Host name="www.kgc.com" appBase="webapps" unpackWARs="true" autoDeploy="true" xmlValidation="false" xmlNamespaceAware="false">

<Context docBase="/usr/local/tomcat/webapps/kgc" path="" reloadable="true" />

</Host>   

<Host name="www.benet.com" appBase="webapps" unpackWARs="true" autoDeploy="true" xmlValidation="false" xmlNamespaceAware="false">

<Context docBase="/usr/local/tomcat/webapps/benet" path="" reloadable="true" />

</Host>

开启关闭Tomcat:

/usr/local/tomcat/bin/shutdown.sh 关闭

/usr/local/tomcat/bin/startup.sh 开启

每次重启之后都要检查端口8080

netstat -antp | grep 8080

端口没起,重启

3.客户端浏览器访问验证

echo "192.168.233.71 www.kgc.com www.benet.com" >> /etc/hosts

浏览器访问 http://www.kgc.com:8080/   页面显示This is kgc page\!

浏览器访问 http://www.benet.com:8080/   页面显示This is benet page\!

启动

去虚拟机浏览器访问:
www.test/koeda.com:8080         访问

总结:

  1. 请求到连接器:连接器端口8080,连接器接收请求
  2. 虚拟主机的host www.test.com 引擎engine管理虚拟主机———找host——www.test.com——找Context 访问的该主机的工作目录——webapps/test/index.jsp——wrapper——servlet来解析index.jsp内容
  3. 响应的内容返回到客户端

Tomcat的优化:

默认配置并不适合生产环境,频繁出现假死

需要通过压力测试不断优化,提高稳定。

  1. 配置文件优化
  2. jvm Java虚拟机优化
  3. 操作系统优化(内核优化)

  1. 配置文件优化(面试题,记3-5个)

在71行左右

maxThreads="200"

#Tomcat使用线程来处理接受的每个请求,可以创建的最大连接数。支持的最大并发连接数200足够

miniSpareThreads="200"

#最小空闲线程数,Tomcat启动时初始化的线程数,表示即使每人请求也要打开这些空的线程等待请求,默认10,配置200足矣

maxSpareThreads

#最大备用线程数,创建的线程如果超过这个值,Tomcat会关闭不再需要的线程,默认是-1(对创建的线程不做限制)不需要更改默认就好

connectionTimeout="20000"

#网络连接超时。设置为20000毫秒

enableLookups="false"

#是否反向解析域名,false不解析,提高处理效率

disableUploadTimeout="true"

#上传文件时是否启用超时限制,true开启

connectionUploadTimeout=

#上传文件的超时时间,没有固定的值,根据需求自定

accpetCount="100"

#如果所有的可以使用的线程都被占用,可以传入的队列长度的最大值,默认100,超过100个排队之后后面的进不来了

compression="on"  (off,false是所有的情况下都进行压缩)

#是否对响应的数据进行gzip压缩,一般来说打开on就可以了,压缩之后大小减小1/3

noCompressionUserAgents="gozilla/chrom"

#对指定访问的浏览器不进行压缩

以上配置位置:

先shutdown再startup 重启之后一定要看端口

2、jvm优化

要把server status打开

/usr/local/tomcat/webapps/manager/META-INF/context.xml

进入/usr/local/tomcat/conf/tomcat-users.xml

<role rolename="manager-gui"/>

<user username="tomcat" password="tomcat" roles="manager-gui"/>

JAVA_OPTS="$JAVA_OPTS -server -Xms2048m -Xmx2046m -Xx:PermSize-1024

m -XX:MaxPermSize=1024m -Xmn768m -Djava.awt.headless=true -XX:Disab

leExplicitGC"

-server:一定要作为第一个参数

-Xms2048m: java初始化堆的大小,是分配jvm的最小内存。cpu性能高,可以值再设高一点

-Xmx2048m: 最大java堆的大小,是分配jvm的最大内存,取决于物理内存有多大。建议-xms和xmx的值设置成一样的,推荐是你物理内存的一半

目的:java的垃圾回收机制清理完堆区之后,必须要重新分隔计算堆区的大小

-Xmn768m:新生代内存的大小。官方推荐整个堆大小的3/8

新生代:java中每新建一个新的对象,占用的内存就是新生代

中生代:对象创建完毕之后占用的内存就是中生代

老年代:java垃圾回收机制进行资源回收之后,中生代中剩余的部分就是老年代

-XX:ParallelGCThreads=2 配置并行收集器的线程数,有多少个线程一起进程垃圾回收,官方推荐与cpu的数目相同

-XX:PermSize=1024m 设置非堆内存的初始值,也就是java中的持久代内存的大小,一般设置为物理内存的1/4

-XX:MaxPermSize=1024m:最大非堆内存的大小,持久代内存的最大值,一般设置成物理内存的1/4

-Djava.awt.headless=true :避免在nginx环境下web页面不能展示图片

-XX:+DisableExplicitGC":禁止调用system.gc(),误调用gc方法,会导致整个jvm响应的速度降低

堆:存储新创建的对象。

非堆:存储编译之后的代码,或者是压缩后的类,或者是类的元数据

如何配置上面的配置:

进入/usr/local/tomcat/bin/catalina.sh

重启 看端口

ajp-nio-8009:

连接器当中的一种类型: ajp : 协议名称就叫ajp。nio: 异步非阻塞通信

8009是ajp协议的监听端口

ajp:Tomcat服务器和前端web服务器(Apache nginx)进行连接

提供负载均衡和高效的请求转发,提高并发处理能力

http-nio-8080

用于处理http协议的网络请求

端口: 8080

内核优化

Linux内核优化中主要针对两个配置文件   /etc/security/limits.conf 和/etc/sysctl.conf

通常是利用调用内核参数的程序sysctl -a 查询出最优内核参数,然后写入 /etc/sysctl.conf 文件内的。

[root@www opt]# sysctl -a |grep fs.file-max

fs.file-max = 197221     #查询出的文件句柄数量上限。

sysctl: reading key "net.ipv6.conf.all.stable_secret"

sysctl: reading key "net.ipv6.conf.default.stable_secret"

sysctl: reading key "net.ipv6.conf.ens33.stable_secret"

sysctl: reading key "net.ipv6.conf.lo.stable_secret"

sysctl: reading key "net.ipv6.conf.virbr0.stable_secret"

sysctl: reading key "net.ipv6.conf.virbr0-nic.stable_secret"

文件句柄(File Handle)是操作系统用于跟踪和管理打开的文件或资源的数据结构。

在操作系统中,每个打开的文件、网络连接、设备等都会被分配一个唯一的句柄,

操作系统通过这个句柄来标识和访问这些资源。

句柄数是指操作系统能够同时管理的句柄的数量。在一个计算机系统中,

许多应用程序和进程需要打开和使用文件、网络连接等资源。每个资源都需要一个句柄来进行操作。

如果系统的句柄数限制太低,就可能导致应用程序无法打开足够的文件、网络连接或其他资源,

从而影响系统的性能和可用性。

因此,调整句柄数的设置是确保系统能够处理并发连接和资源请求的重要一环。

在高负载的服务器环境中,适当地增加句柄数的限制可以提高系统的并发能力和性能。

但是过于激进地增加句柄数可能会消耗过多的系统资源,因此需要根据实际需求和硬件配置进行调整。

永久配置:

注意:设置保存后,需要重新ssh连接才会看到配置更改的变化

vim  /etc/security/limits.conf

# 65535 为Linux系统最大打开文件数

* soft nproc 65535

* hard nproc 65535

* soft nofile 65535

* hard nofile 65535

* soft nproc 65535: 最大进程数软限制为 65535,即可以使用 ulimit -u 命令查看和修改的值。

* hard nproc 65535: 最大进程数硬限制为 65535,即最大可分配的进程数。

* soft nofile 65535:最大打开文件数软限制为 65535,即可以使用 ulimit -n 命令查看和修改的值。

* hard nofile 65535:最大打开文件数硬限制为 65535,即最大可分配的文件数。

这里使用的通配符 * 表示对所有用户生效。

其他调试内核参数的查看: sysctl -a

kernel.sysrq = 0: 禁用了内核的SysRq功能,SysRq允许在系统崩溃或出现问题时执行一些调试操作。

kernel.core_uses_pid = 1: 设置核心转储文件名中包含进程ID,有助于标识是哪个进程导致了核心转储。

kernel.msgmnb 和 kernel.msgmax: 增加IPC消息队列的默认和最大大小,用于进程间通信。

kernel.shmmax 和 kernel.shmall: 调整共享内存的最大大小和分配页面数。

net.ipv4.ip_forward = 0: 禁用IP数据包的转发功能,通常用于不充当路由器的系统。

net.ipv4.conf.default.rp_filter 和 net.ipv4.conf.all.rp_filter: 控制反向路径过滤,提高网络安全性。

net.ipv4.icmp_echo_ignore_all: 允许或禁止系统响应ping请求。

net.ipv4.icmp_echo_ignore_broadcasts: 禁止系统对广播和多播地址的ICMP回显和时间戳请求作出响应。

net.ipv4.conf.default.accept_source_route: 不接受源路由,增加网络安全性。

net.ipv4.tcp_syncookies = 1: 启用SYN Cookies,保护系统免受TCP SYN 攻击。

net.ipv4.tcp_max_tw_buckets = 6000: 设置允许的TIME_WAIT套接字最大数量,避免服务器性能下降。

net.ipv4.tcp_sack = 1: 启用有选择的应答(SACK)来提高TCP性能。

net.ipv4.tcp_window_scaling = 1: 启用TCP窗口缩放功能,允许大窗口的TCP传输。

net.ipv4.tcp_rmem, net.ipv4.tcp_wmem: 调整TCP套接字读取和写入缓冲区大小。

net.ipv4.tcp_mem: 设置TCP缓冲区的最小、默认和最大值。

net.core.wmem_default, net.core.rmem_default, net.core.rmem_max, net.core.wmem_max: 调整网络核心

缓冲区的大小。

net.core.netdev_max_backlog: 控制网络接口接收数据包的排队队列大小。

net.ipv4.tcp_max_orphans: 设置系统允许的孤立TCP连接最大数量。

net.ipv4.tcp_max_syn_backlog: 控制系统允许的三次握手队列长度。

net.ipv4.tcp_synack_retries 和 net.ipv4.tcp_syn_retries: 设置SYN-ACK和SYN请求的重试次数。

net.ipv4.tcp_tw_recycle 和 net.ipv4.tcp_tw_reuse: 启用TIME_WAIT套接字快速回收和重用。

net.ipv4.tcp_fin_timeout: 设置TCP连接FIN(关闭连接)的超时时间。

net.ipv4.tcp_keepalive_time: 设置TCP keepalive探测包发送频率,以检测连接状态。

net.ipv4.ip_local_port_range: 设置本地端口范围,用于分配本地应用程序端口。

net.ipv6.conf.all.disable_ipv6 和 net.ipv6.conf.default.disable_ipv6: 禁用IPv6。

net.netfilter.nf_conntrack_max 和其他 net.netfilter.nf_conntrack_*: 控制连接跟踪和防火墙相关设置。

net.nf_conntrack_max: 设置最大连接跟踪项数。

vm.overcommit_memory = 0: 控制内存超额分配策略,避免OOM killer杀掉进程。

vm.swappiness = 0: 设置内存交换行为,降低内存交换。

fs.file-max = 999999: 设置进程可以同时打开的最大文件句柄数。

net.ipv4.tcp_max_tw_buckets = 6000: 设置操作系统允许的TIME_WAIT套接字最大数量。

net.ipv4.ip_local_port_range = 1024 65000: 设置系统允许的本地端口范围。

net.ipv4.tcp_tw_recycle = 1: 启用TIME_WAIT套接字快速回收。

net.ipv4.tcp_tw_reuse = 1: 允许TIME-WAIT套接字重用。

net.ipv4.tcp_syncookies = 1: 启用SYN Cookies,防止TCP SYN 攻击。

net.core.somaxconn = 40960: 设置最大监听队列长度,用于控制最大并发连接数。

net.core.netdev_max_backlog = 262144: 设置每个网络接口接收数据包队列的最大大小。

net.ipv4.tcp_max_syn_backlog = 262144: 设置接受SYN请求队列的最大长度。

net.ipv4.tcp_rmem, net.ipv4.tcp_wmem: 设置TCP套接字读取和写入缓冲区的最小、默认和最大大小。

net.core.rmem_default, net.core.wmem_default, net.core.rmem_max, net.core.wmem_max: 设置内核套接字接收和

发送缓冲区大小。

net.ipv4.tcp_syncookies = 1: 设置启用SYN Cookies,用于解决TCP SYN 攻击。

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

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

相关文章

不再受害:如何预防和应对.mallab勒索病毒攻击

导言&#xff1a; 我们的数据成了我们的珍宝&#xff0c;但也成了黑客们追逐的目标。其中&#xff0c;.mallab勒索病毒就是一个充满阴谋和神秘的数字威胁&#xff0c;它采用高度复杂的方法将您的数据锁在数字牢笼中。本文91数据恢复将深入探讨.mallab勒索病毒的起源、工作方式…

【RabbitMQ 实战】12 镜像队列

一、镜像队列的概念 RabbitMQ的镜像队列是将消息副本存储在一组节点上&#xff0c;以提高可用性和可靠性。镜像队列将队列中的消息复制到一个或多个其他节点上&#xff0c;并使这些节点上的队列保持同步。当一个节点失败时&#xff0c;其他节点上的队列不受影响&#xff0c;因…

视频转换器WinX HD Video Converter mac中文特点介绍

WinX HD Video Converter mac是一款功能强大的视频转换器&#xff0c;它可以将各种不同格式的视频文件转换为其他视频格式&#xff0c;以便用户在各种设备上进行播放。WinX HD Video Converter是一个功能强大、易于使用的视频转换器&#xff0c;适用于各种类型的用户&#xff0…

可图性判断(图论)

如图所示&#xff1a; 1.去arr[i]首元素&#xff0c; 后面arr[i]个元素减一 2.排序&#xff0c;以此类推 3.最后如果出现负数则不可图 4.最后元素为0&#xff0c;则可图 问题 L: Degree Sequence of Graph G代码如下&#xff1a;

C#版字节跳动SDK - SKIT.FlurlHttpClient.ByteDance

前言 在我们日常开发工作中对接第三方开放平台&#xff0c;找一款封装完善且全面的SDK能够大大的简化我们的开发难度和提高工作效率。今天给大家推荐一款C#开源、功能完善的字节跳动SDK&#xff1a;SKIT.FlurlHttpClient.ByteDance。 项目官方介绍 可能是全网唯一的 C# 版字节…

基于nodejs+vue全国公考岗位及报考人数分析

目 录 摘 要 I ABSTRACT II 目 录 II 第1章 绪论 1 1.1背景及意义 1 1.2 国内外研究概况 1 1.3 研究的内容 1 第2章 相关技术 3 2.1 nodejs简介 4 2.2 express框架介绍 6 2.4 MySQL数据库 4 第3章 系统分析 5 3.1 需求分析 5 3.2 系统可行性分析 5 3.2.1技术可行性&#xff1a;…

iOS的应用生命周期

在iOS的原生开发中&#xff0c;我们需要特别关注两个东西&#xff1a;AppDelegate和ViewController。我们主要的编码工作就是在AppDelegate和ViewControlle这两个类中进行的。它们的类图如下图所示&#xff1a; AppDelegate是应用程序委托对象&#xff0c;它继承了UIResponder类…

抖音上怎么挂小程序?制作小程序挂载抖音视频

公司企业商家现在已经把抖音作为营销的渠道之一&#xff0c;目前抖音支持短视频挂载小程序&#xff0c;可方便做营销。以下给大家分享这一操作流程。 一、申请自主挂载能力 首先需要在抖音开放平台官网注册一个抖音小程序账号&#xff0c;然后申请短视频自主挂载能力。 二、搭…

Kubernetes技术与架构-存储 2

在Kubernetes集群中&#xff0c;一块持久化存储空间是可以被回收再利用&#xff0c;简称PV&#xff0c;即PersistentVolume&#xff0c;Pod实例需要使用PV的时候&#xff0c;可以使用PVC定义申请PV存储资源&#xff0c;PVC是PersistentVolumeClaim的简称&#xff0c;PV的申请分…

Git(SourceTree)变基操作使用

文章目录 一、变基的使用场景二、Source Tree上的变基操作1. 准备两个分支dev1和master2. 切换到dev1中&#xff0c;并选中master中提交的代码3. 鼠标右键&#xff0c;选择变基&#xff0c;弹出对话框选择确定。 变基就是rebase操作 一、变基的使用场景 假设分支a和分支b 在分…

Day12力扣打卡

打卡记录 找出满足差值条件的下标 II&#xff08;双指针维护最大最小&#xff09; 链接 采用双指针保留间隔 indexDifference 进行遍历&#xff0c;求出慢指针对应一路遍历过来的最大值和最小值。 class Solution { public:vector<int> findIndices(vector<int>…

【排序】js简单实现前端数组排序,多字段数组对象排序,字符串排序,数字排序等

数组对象排序&#xff08;多字段排序&#xff09; 排序前&#xff1a; 排序后&#xff1a; data() {return {list: [{ks: 外科,child_ks: 泌尿外科,xz: 外科一组,doctor: 小明,num: 18,num2: 19,num3: 20},{ks: 中医科,child_ks: 中医男科,xz: 外科一组,doctor: 小红,num: …

当生成式AI遇到业务流程管理,大语言模型正在变革BPM

生成式AI对各领域有很大影响&#xff0c;一个方面在于它改变了很多固有业务的工作流。 工作流&#xff08;Workflow&#xff09;是业务流程的一种实现方式&#xff0c;一个业务流程往往包含多个工作流范式以及相关的数据、组织和系统。 因此&#xff0c;提及工作流必然离不开业…

(el-Table)操作(不使用 ts):Element-plus 中 Table 多选框的样式等的调整

Ⅰ、Element-plus 提供的 Table 表格组件与想要目标情况的对比&#xff1a; 1、Element-plus 提供 Table 组件情况&#xff1a; 其一、Element-ui 自提供的 Table 代码情况为(示例的代码)&#xff1a; // Element-plus 自提供的代码&#xff1a; // 此时是使用了 ts 语言环境…

Java练习题2020-2

"统计1到N的整数中,除了1和自身之外&#xff0c;至少还能被两个数整除的数的个数 输入说明&#xff1a;整数 N(N<10000)&#xff1b; 输出说明&#xff1a;符合条件的数的个数 输入样例&#xff1a;10 输出样例&#xff1a;3 (说明&#xff1a;样例中符合条件的3个数是…

一个比较特别的串口工具

这是08年写的一个 并网带电池逆变器 的通讯工具&#xff0c;和普通的串口调试器相比&#xff0c;多了一个【脚本】功能。能够通过【脚本】完成通讯测试。 PC发给DSP的01命令 01 10 1B 00 CF A3 00 00 90 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 电…

开源移动核心网Magma架构设计启示

Magma是由Meta Connectivity开发并开源给Linux基金会的开源移动核心网项目&#xff0c;目的是构建灵活、低成本、可扩展的移动核心网。本文介绍了Magma架构设计的基本理念和取舍。原文: Implications of the Magma Architecture: Interoperability, Scale and Resilience 简介 …

Steger算法实现结构光光条中心提取(python版本)

Steger算法原理 对结构光进行光条中心提取时,Steger算法是以Hessian矩阵为基础的。它的基础步骤如下所示: 从Hessian矩阵中求出线激光条纹的法线方向在光条纹法线方向上将其灰度分布按照泰勒多项式展开,求取的极大值即为光条在该法线方向上的亚像素坐标。对于二维离散图像来…

Java之JavaConfig

Java-JavaConfig 一&#xff0c;什么是JavaConfig 1.介绍 JavaConfig是一种用于配置Java应用程序的方法。它是Spring框架提供的一种替代XML配置的方式&#xff0c;旨在简化和增强应用程序的配置过程。 传统上&#xff0c;Spring框架使用XML文件来定义应用程序的配置信息&am…

神经网络与深度学习第四章前馈神经网络习题解答

[习题4-1] 对于一个神经元 &#xff0c;并使用梯度下降优化参数时&#xff0c;如果输入恒大于0&#xff0c;其收敛速度会比零均值化的输入更慢。 首先看一下CSDN的解释&#xff1a; 如果输入x恒大于0&#xff0c;使用sigmoid作为激活函数的神经元的输出值将会处于饱和状态&a…