-
Tomcat集群原理通过Nginx负载均衡进行请求转发Tomcat集群能带来什么提高服务的性能, 并发能力, 以及高可用性提供项目架构的横向扩展能力Tomcat集群产生什么问题Session登录信息存储以及读取的问题服务器定时任务并发的问题Tomcat 单服务体系架构在这个架构图中,一层Nginx,首先Nginx主要职责给Tomcat一层反向代理。比如,我们的登录的时候登录了A服务器,session信息存储到A服务器上了,假设我们使用的负载均衡策略是ip hash,那么登录信息还可以从A服务器上访问,但是这个有可能造成某些服务器压力过大,某些服务器又没有什么压力,这个时候压力过大的机器(包括网卡带宽)有可能成为瓶颈,并且请求不够分散。首先要解决Session共享的问题这时候我们使用轮询或者最小连接负载均衡策略,就导致了,第一次访问A服务器,第二次可能访问到B服务器,这个时候存储在A服务器上的session信息在B服务器上读取不到。典型负载均衡策略分析打个比方,我们有轮询,权重,地址散列,地址散列又分为原ip地址散列hash,目标ip地址散列hash,最少连接,加权最少连接,还有继续升级的很多种策略轮询:优点:实现简单,缺点:不考虑每台服务器处理能力权重:优点:考虑了服务器处理能力的不同地址散列:优点:能实现同一个用户访问同一个服务器最少连接:优点:使集群中各个服务器负载更加均匀加权最少连接:在最少连接的基础上,为每台服务器加上权值。算法为(活动连接数*256+非活动连接数)/权重,计算出来的值小的服务器优先被选择。Session管理-Session Sticky粘滞会话:对于同一个连接中的数据包,负载均衡会将其转发至后端固定的服务器进行处理。解决了我们session共享的问题,但是它有什么缺点呢?一台服务器运行的服务挂掉,或者重启,上面的 session 都没了负载均衡器成了有状态的机器,为以后实现容灾造成了羁绊Session管理-Session 复制就是每一个Tomcat都存储我们的Session,不同的tomcat之间进行拷贝复制。解决了我们session共享的问题,但是它有什么缺点呢?应用服务器间带宽问题,因为需要不断同步session数据大量用户在线时,服务器占用内存过多Session管理-基于Cookie主要用于我们将session会话如同token一般存储在我们的前端解决了我们session共享的问题,但是它有什么缺点呢?cookie 的长度限制cookie存于浏览器,安全性是一个问题Session管理-Session 服务器就是通过一个专门管理session会话的管理器服务,进行集中化存储和管理session解决了我们session共享的问题,这种方案需要思考哪些问题呢?保证 session 服务器的可用性,session服务器单点如何解决?我们在写应用时需要做调整存储session的业务逻辑打个比方,我们为了提高session server的可用性,可以继续给session server做集群Tomcat单机部署多应用解压2个tomcat, 分别命名为tomcatA和tomcatB分别设置2个tomcat的URIEncoding, 将tomcat的conf/server.xml里的port修改为两个不同端口。作者:浩宇天尚链接:https://www.jianshu.com/p/02459aefbef1来源:简书
-
大家好,本篇文章主要讲的是安装tomcat后可能出现的问题介绍,感兴趣的同学赶快来看一看吧,对你有帮助的话记得收藏一下,方便下次浏览 1. 没有开tomcat服务 在浏览器的地址栏中输入localhost:8080 回车会出现如下界面 tomcat没有开服务。在cmd中输入startup.bat。不要关闭开启的tomcat窗口。 2.输入url路径错误 在浏览器中输入url显示404,可能是输入的路径不存在或输入错误路径。 3. Java JDK环境变量未设置好 在cmd输入startup.bat时,报错。 如图: 解决方案: 这个是Java jdk的环境变量名设置不规范,将jdk的路径设置变量名必须是JAVA_HOME。 找到系统变量界面,更改错误的jdk变量名。 更改完后: 修改完之后,重新打开cmd在输入startup.bat就可以正常启动了 4.重复开启服务 服务已经开启,不需要重复打开。 5.端口被占用 通过网页访问出现 Access Error错误,端口被占用 打开cmd输入指令:将占用你所指定的端口号进程删掉netstat -ano :查看所有端口信息netstat ano | findstr "8080" :查看端口8080占用信息tasklist :查看所有进程tasklist | findstr "1": 查看某进程taskkill /f /pid 进程号: 删除某进程号转载自https://www.jb51.net/article/233667.htm
-
【摘要】 前几天部门的技术经理给我分配了一个任务,叫我一个人去维护之前上古时期的Java Wbe项目,这个项目其实是一个前置机程序,负责消息的`加解密、加签验签`和消息的`转发`;这个程序部署于Servlet容器中,用的是Tomcat服务,并且这个Tomcat服务我们公司的运维人员不知道怎么操作链接:https://bbs.huaweicloud.com/blogs/344107@[TOC]前言:前几天部门的技术经理给我分配了一个任务,叫我一个人去维护之前上古时期的Java Wbe项目,这个项目其实是一个前置机程序,负责消息的加解密、加签验签和消息的转发;这个程序部署于Servlet容器中,用的是Tomcat服务,并且这个Tomcat服务我们公司的运维人员不知道怎么操作,说配置的步骤太多了,之前有一个人配置成功了,但是离职了,写的文档也模糊不清,现在他们都不知道咋配置,1000-9999人的公司,这个运维人员不大行,算了不吐槽了(⊙﹏⊙)!运维人员和笔者说,这个前置机程序是运行在客户那边的,最好是不需配置环境变量等其他操作,做到一键点击即可启动Tomcat服务。这样古老项目的维护难度又提高了亿丢丢。笔者解压缩了之前项目的压缩包后,看了一下,发现启动的步骤是用的Tomcat的startup.bat批处理文件(Windows系统)进行启动的,下面会详细讲。好了,下面进入正文:1.idea自动反编译class文件,在idea中我们也可以查看字节码的源代码首先之前开发的源码已经丢失了,只有编译后的class文件;当我拿到程序编译后的class文件后,用idea打开,idea自带反编译功能,如下是小demo(公司的代码不能向外界提供,所以这里提供了一个小demo):比如我打开JDK中的Integer类,上面说到过用idea打开是自动进行了反编译的结果,如下:那么如何查看反编译前的字节码文件呢,我们在idea中也可以查看,如下操作:(点击View–>Show Bytecode)字节码文件的内容如下:好说到这里,咋们就打住,关于如何查看字节码的内容,这个咋们之后再聊(会写一篇关于这个的博文)。回到主题,刚开始说了,idea自动进行的反编译,还好之前的项目写的代码不多,看了半天代码后,理清思路,然后又花费一天时间,写代码,自测,修改,又自测,终于写好了,自测通过;接下来的任务就是之前运维提到的,去掉项目启动前环境变量配置的过程,优化一系列的操作,做到点击startup.bat批处理文件即可一键启动Tomcat服务。2.如何做到一键点击startup.bat批处理文件启动Tomcat服务2.1startup.bat批处理文件如下是Tomcat的文件目录,关于Tomcat目录的讲解,可以参考笔者之前的博文:https://blog.csdn.net/MrYushiwen/article/details/113383917因为是点击startup.bat批处理文件进行启动的,我第一反应就是用文本编辑器打开startup.bat文件,点击进入bin目录下,bin目录如下,等会讲解红色框中的三个批处理文件:找到startup.bat批处理文件,用文本编辑器打开,具体内容如下(嘿嘿,之前有写过批处理脚本的我还是看得懂的哈,看不懂的小伙伴可以参看下面的章节三,关于批处理文件的讲解零基础快速入门):第一个红色框这条语句是检测CATALINE_HOME的值,如果不为空,就跳转到gotHome标记出执行。可以看到在这个批处理文件中,多次用到了CATALINA_HOME变量,这个变量我们可以在环境变量中进行配置,关于环境变量深入的理解,可以参考笔者这篇博文:https://blog.csdn.net/MrYushiwen/article/details/120509711,因为在批处理文件中用到了这个CATALINE_HOME变量,它可以取自环境变量,也可以用set命令给CATALINE_HOME变量赋值;所以之前我们需要设置如下环境变量才可以运行:第二个红框设置变量EXECUTABLE的值为CATALINE_HOME变量下的bin包下的catalina.bat批处理文件,这个EXECUTABLE在第三步中会用到。第三个红框用call命令进行调用,启动EXECUTABLE环境变量所指向的程序,即catalina.bat。好了,startup.bat批处理文件讲解完了,如果我们不想配置环境变量CATALINE_HOME的值,根据上面提到的我们只需要在startup.bat批处理文件头部加上set CATALINE_HOME=xxx(注意等号后面不允许有空格,本人踩过坑)即可,这样就不会从环境变量值获取该值了,直接在批处理文件中就有定义,如下(笔者的路径就是本项目的Tomcat,即就是解压缩之后的文件所在的路径):2.2catalina.bat批处理文件上面提到过startup.bat批处理文件会用call命令调用catalina.bat批处理文件,我们用文本编辑器打开catalina.bat批处理文件,如下:第一个红色框,可以看到在catalina.bat批处理文件中也同样用到了CATALINE_HOME这个变量,如果我们不想配置环境变量,同样也可以在文件的开始处加上set CATALINE_HOME=xxx即可。第二个红色框,用call命令调用了setclasspath.bat批处理文件。同样我们不想配置环境变量,在文件的开始处加上set CATALINE_HOME=xxx即可,如下:2.3setclasspath.bat批处理文件接下来我们点进setclasspath.bat批处理文件中查看,如下:第一个红框中可以看到setclasspath.bat批处理文件用到了JAVA_HOME和JRE_HOME这两个变量,如果们配置了环境变量,可以从环境变量中取,我们也可以用set命令在文件头部指定(如下图一),我们指定了就不需要配置Java的环境变量了,当然JDK需要放到Tomcat的目录中去(如下图二),虽然文件大了点,但是方便了用户。这样就做到了不需要配置环境变量,通过startup.bat批处理文件一键启动Tomcat服务。<image src=https://img-blog.csdnimg.cn/ffc9fc72cbbf43d88184f302119217a4.png > </image>图一<image src=https://img-blog.csdnimg.cn/224af50a00b14161ae3f0ebc85a17aad.png > </image>图二2.4复盘根据上面的2.1 、2.2、2.3的分析,我们现在总结一下:bin目录下的startup.bat—调用—>catalina.bat—调用—>setclasspath.bat说明:tomcat的startup.bat脚本主要用来判断环境,找到catalina.bat脚本源路径,将启动命令参数传递给catalina.bat执行;setclasspath.bat检查各种变量是否赋值,验证tomcat启动停止需要涉及到的文件,保障tomcat顺利启动停止;catalina.bat脚本使用了大量的判断,使用if作为参数的输入判断,核心的启动命令其实就是java命令。我们在startup.bat、catalina.bat和setclasspath.bat这三个批处理文件中用set操作对需要用到的变量进行赋值,这样就不需要再去配置环境变量了。3.bat批处理文件零基础快速入门我们以Tomcat中的startup.bat为例进行讲解:(其中rem为注释,大部分rem已被笔者删掉),文件内容如下:对上述的脚本一行行的分析(大家耐心看完,绝对会有很大的收获,如果对命令不是很了解的话,可以看下该篇文章进行学习:批处理命令教程;然后在过来看笔者这里写的,妥妥地保姆级别分析源码):@echo off默认情况下,批处理文件将在运行时显示其命令。 这第一个命令的目的是关闭这个显示。 “echo off”命令会关闭整个脚本的显示,除了“echo off”命令本身之外。前面的“@”符号使命令也适用于自己。if "%OS%"=="Windows_NT" setlocal这是个if语句。在命令行中执行help if就可以打印出if语句的使用帮助,大家可以多看下手册。这里这条语句的作用是检查OS环境变量的值是否是Windows_NT,如果条件成立,则执行setlocal。setlocal这是开始批处理文件中环境改动的本地化操作。在执行SETLOCAL之后所做的环境改动只限于批处理文件。要还原原先的设置,必须执行ENDLOCAL。达到批处理文件结尾时,对于该批处理文件的每个尚未执行的SETLOCAL命令,都会有一个隐含的ENDLOCAL被执行。set CURRENT_DIR = %cd%这条语句是设置变量CURRENT_DIR 的值为当前目录(两个百分号可以取变量的值),比如C:\Users\yushiwenif not "%CATALINE_HOME%"=="" goto gotHome这条语句是检测CATALINE_HOME的值,如果不为空,就跳转到gotHome标记(标签)处执行。(用冒号+字符表示标记,比如第8条的 :gotHome)set CATALINA_HOME=%CURRENT_DIR%把CATALINA_HOME的值设置为CURRENT_DIR变量的值,两个百分号可以取变量的值。if exist "%CATALINA_HOME%\bin\catalina.bat" goto okHomecd ..set CATALINA_HOME=%cd%cd %CURRENT_DIR%6、7、8、9一起讲:如果catalina.bat是存在的,就跳转到okHome标记处开始往下继续执行,如果catalina.bat不存在,先cd到当前目录的上级目录,然后设置CATALINA_HOME变量为cd变量所对应的值(注意上一步已经执行了cd …,返回了上级目录,此时的目录是之前目前的上级目录)。:gotHome标记,goto命令用来跳转,上面的第4条语句用到了该标记。if exist "%CATALINA_HOME%\bin\catalina.bat" goto okHome判断指定的文件是否存在,存在就跳转到okHomeecho The CATALINA_HOME environment variable is not defined correctlyecho命令用于在命令行中显示echo后面的字符内容echo This .....echo命令用于在命令行中显示echo后面的字符内容goto end和上面的11.if exist "%CATALINA_HOME%\bin\catalina.bat" goto okHome一起看,如果if条件不成立,就跳转到end标记处,继续往下执行,其实就是结束了此次批处理命令。:okHome标记,goto命令用来跳转,上面的第11条语句用到了该标记。set EXECUTABLE=%CATALINA_HOME%\bin\catalina.bat设置EXECUTABLE变量的值if exist "%CATALINA_HOME%\bin\catalina.bat" goto okHomeecho Cannot find ......eco This file ......goto end:okExec17、18、19、20、21一起看:如果catalina.bat还是不存在的话,就在命令行窗口回显两句话,然后跳转到end标记处,继续往下执行,其实就是结束了此次批处理命令。如果catalina.bat存在,就跳转到okExec标记(标签)处,继续往下执行。set CMD_LINE_ARGS=清空CMD_LINE_ARGS变量的值:setArgs标记,goto命令用来跳转,下面的第27条语句用到了该标记,起到了循环的作用。if ""%1""=="""" goto doneSetArgs检查%1是否为空,如果为空就表示没有参数了,设置参数结束,跳转至doneSetArgs标记处;如果不为空就把%1指向的参数追加到CMD_LINE_ARGS这个环境变量中。图A图B图C图Dset CMD_LINE_ARGS=%CMD_LINE_ARGS% %1把%1指向的参数追加到CMD_LINE_ARGS这个环境变量中shiftshift指令是移位参数,使%1指向了下个参数goto setArgs跳转到setArgs,检查%1是否为空,如果不空,继续追加参数。:doneSetArgs标记(标签),goto命令用来跳转,上面的第24条语句用到了该标记,起到了结束循环的作用。call "%EXECUTABLE%" start %CMD_LINE_ARGS%调用EXECUTABLE环境变量所指向的程序,即catalina.bat,其后跟的第一个参数是start,表示启动Tomcat,如果是stop,则停掉Tomcat,第二个参数是把CMD_LINE_ARGS作为参数传递进去;:end标记,可以用goto命令跳转到此处,直接结束此处批处理命令。能坚持到这里,相信大家一定会有所收获,另外,如果觉得笔者写得还八错,期待后续的博文可以点波关注哈!知我所能,我所能者,尽善尽美; 知我所不能,我所不能者,虚怀若谷!我是喜欢分享知识、喜欢写博客的YuShiwen,与大家一起学习,共同成长!咋们下篇博文见。
-
# 【HCS Servciestage】如何通过servicestage部署基于Nginx的前端应用 ## 背景 HCS ServiceStage部署前端应用组件时,希望通过nginx代理来访问部署的前端应用。 ## 问题 如何通过Servicestage部署基于Nginx的前端应用?
-
优化连接配置.这里以tomcat7的参数配置为例,需要修改conf/server.xml文件,修改连接数,关闭客户端dns查询。参数解释:URIEncoding=”UTF-8″ :使得tomcat可以解析含有中文名的文件的url,真方便,不像apache里还有搞个mod_encoding,还要手工编译。maxSpareThreads: 如果空闲状态的线程数多于设置的数目,则将这些线程中止,减少这个池中的线程总数。minSpareThreads: 最小备用线程数,tomcat启动时的初始化的线程数。enableLookups: 这个功效和Apache中的HostnameLookups一样,设为关闭。connectionTimeout : connectionTimeout为网络连接超时时间毫秒数。maxThreads : maxThreads Tomcat使用线程来处理接收的每个请求。这个值表示Tomcat可创建的最大的线程数,即最大并发数。acceptCount : acceptCount是当线程数达到maxThreads后,后续请求会被放入一个等待队列,这个acceptCount是这个队列的大小,如果这个队列也满了,就直接refuse connection。maxProcessors与minProcessors: 在 Java中线程是程序运行时的路径,是在一个程序中与其它控制线程无关的、能够独立运行的代码段。它们共享相同的地址空间。多线程帮助程序员写出CPU最 大利用率的高效程序,使空闲时间保持最低,从而接受更多的请求。通常Windows是1000个左右,Linux是2000个左右。
-
1.1 Tomcat简介Tomcat 服务器是一个免费的开放源代码的Web 应用服务器,属于轻量级应用服务器,在中小型系统和并发访问用户不是很多的场合下被普遍使用,是开发和调试JSP 程序的首选。1.2 物理机调优方法1.2.1 Tomcat参数调优目的:通过修改tomcat的配置文件,可以有效提高tomcat性能方法:按照如下所示信息,配置/home/apache-tomcat-9.0.20/conf/server.xml的各个参数。<Connector executor="tomcatThreadPool" port="10000" protocol="HTTP/1.1" acceptCount="10000" maxConnections="10000" connectionTimeout="20000" compression="off" compressionMinSize="2048" URIEncoding="utf-8" tcpNoDelay="true" enableLookups="false" useURIValidationHack="false" disableUploadTimeout="false" connectionUploadTimeout="150000" keepAliveTimeout="12000" maxKeepAliveRequests="1000"redirectPort="8443" /> 1.2.2 Tomcat 亲和性设置Tomcat支持cpu绑核,利用cpu亲和性设置,可以使用taskset或numctl工具进行绑核操作方法:taskset -c N ./startup.sh或numactl -C N ./startup.shN表示要指定核的序号,例如 将tomcat进程绑定到0-3core上:taskset -c 0-3 ./startup.sh1.2.3 容器场景调优方法容器与物理机共享网口,在物理机上执行绑核脚本。以4core的http短连接场景的绑核脚本为例,脚本内容如下,如果要修改绑核脚本,只需修改要绑定的网口名eth1,以及要绑定的core,然后在关闭irqbalance.service的情况下使用脚本即可:#!/bin/bashcnt=2eth1=enp3s0ethtool -L $eth1 combined $cntirq1=`cat /proc/interrupts| grep -E ${eth1} | head -1 | awk -F ':' '{print $1}'`irq1=`echo $irq1`i=0while(( $i < 1))do for cpunum in 2 3 do echo $cpunum "->" $irq1 echo $cpunum > /proc/irq/$irq1/smp_affinity_list let "irq1++" done let "i++"done脚本中参数及命令说明参数及命令名称参数及命令解释cnt 网口队列数eth1使用的网口名irq1网口eth1对应的中断号cpunum分配给网口eth1用于处理网卡中断的核ethtool -L $eth1 combined $cnt设置网口队列长度为核数cat /proc/interrupts | grep $eth1 | awk -F ':' '{print $1}'查询网口中断数echo $cpunum > /proc/irq/$irq/smp_affinity_list根据中断号,将每个中断各绑定在一个核上此脚本只是容器场景下网卡调优方法1.3 虚拟机调优方法虚拟机采用网卡直通的模式,每个虚拟机配置一个虚拟网口,在虚拟机内部执行绑核脚本。以4core的http短连接场景的绑核脚本为例,脚本内容如下,若要修改绑核脚本,只需修改要绑定的网口eth1,以及要绑定的core,在关闭irqbalance.service的情况下使用脚本即可。#!/bin/bashcnt=2eth1=enp5s0ethtool -L $eth1 combined $cntirq1=`cat /proc/interrupts| grep -E ${eth1} | head -1 | awk -F ':' '{print $1}'`irq1=`echo $irq1`i=0while(( $i < 2))do for cpunum in 3 do echo $cpunum "->" $irq1 echo $cpunum > /proc/irq/$irq1/smp_affinity_list let "irq1++" done let "i++"done脚本中参数名称及解释参数名称参数解释cnt网口队列数eth1实际使用的网口名irq1网口eth1对应的中断号cpunum分配给网口eth1用于处理网卡中断的核此脚本只是虚拟机场景下的网卡调优,虚拟机场景下的亲和性设置与物理机一致.
chuangzhijian@汪汪队 发表于2021-11-26 14:38:31 2021-11-26 14:38:31 最后回复 JammySate 2021-11-26 14:41:58
1900 1 -
【功能模块】华为云连接【操作步骤&问题现象】1、在本地使用tomcat搭建了服务器,开发的鸿蒙app无法与tomcat连接。连接使用的是模拟机。2、如果使用安卓的模拟机,其默认的外部地址是10.0.2.2,所以连接地址就是http://10.0.2.2:8080/..../....,但在鸿蒙的模拟器上地址就不对了。10.0.0.2和127.0.0.1都试过了,无法连接。请教一下,哪位知道地址是什么或者应该如何连接吗?【代码】连接部分代码如下:new Thread(new Runnable() { @Override public void run() { try { URL url = new URL(path); HttpURLConnection httpURLConnection = (HttpURLConnection) url.openConnection(); httpURLConnection.setRequestMethod("GET"); httpURLConnection.setConnectTimeout(5000); int responseCode = httpURLConnection.getResponseCode(); if (200 == responseCode) { InputStream inputStream = httpURLConnection.getInputStream(); BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream, "UTF-8")); responseMsg = bufferedReader.readLine(); if(responseMsg==null){ message = "空的"; } HiLog.warn(LABEL,"connect successfully","info"); } else { System.out.println("responseCode = " + responseCode); //连接服务器出错,错误代码为:responseCode 根据代码值告诉用户出错的原因 //.... } } catch (Exception e) { e.printStackTrace(); } }}).start();【其他信息】(可选,上传日志内容或者附件)相关网络权限已经开启。这段代码在安卓上是可以运行的,可以连接到本地的服务器。
-
通过服务构建器申请安装一个WordPress服务# 1. 软件介绍 **Tomcat** 服务器是一个免费的开放源代码的Web 应用服务器,属于轻量级应用服务器,在中小型系统和并发访问用户不是很多的场合下被普遍使用,是开发和调试JSP 程序的首选。 # 2.任务目标 此任务是利用服务构建器的资源编排功能,一键式自动化实现虚拟机的创建以及`Tomcat`服务的安装,并通过`EIP`可以直接访问**Tomcat**首页。 # 3.任务准备 1. 我们选用`Tomcat9.0`版本,由于环境与`Tomcat`官网的网络不通,所以我们可以先手动讲软件包放置到`软件仓库`,虚拟机与软件仓库的网络互通,可以直接从软件仓库下载软件。 2. 由于`Tomcat`的运行依赖`JDK`,所以我们也需要准备`JDK`的安装包,我们这里选用`JDK1.8`版本。 3. 软件包准备如下图所示,都已经提前上传到**软件仓库**。  ## 4.执行步骤 ### 1. 编写Tomcat安装脚本 由于我们是通过在申请完虚拟机后,通过执行脚本来安装`Tomcat`的,所以我们需要提前编写好`Tomcat`的安装脚本。 **步骤:** 1. 登录`ManageOne`的租户面,依次点击 **资源->脚本资源->创建脚本**。 来到创建脚本界面:  2. 创建脚本 我们的脚本是在`linux`操作系统下的`shell`脚本,所以这里系统类型选择`Linux`,脚本类型选择`Shell`,脚本名称和分类可以自定义。 我们编写脚本内容: ```shell #!/bin/bash -v JDK_SOURCE_URL=jdk_source_url TOMCAT_SOURCE_URL=tomcat_source_url LOCAL_TEMP=/opt/tmp JDK_INSTALL_PATH=/usr/local/java TOMCAT_INSTALL_PATH=/opt/tomcat LOG_PATH=/var/log/tomcat_install.log echo "Start to execute tomcat install script. " >>${LOG_PATH} firewall-cmd --zone=public --add-port=8080/tcp --permanent firewall-cmd --reload [ ! -d ${LOCAL_TEMP} ] && mkdir -p ${LOCAL_TEMP} cd ${LOCAL_TEMP} JDK_PACKAGE_NAME=${JDK_SOURCE_URL##*/} wget -qc ${JDK_SOURCE_URL} -O ${JDK_PACKAGE_NAME} echo "Download jdk package success. JDK_PACKAGE_NAME=${JDK_PACKAGE_NAME} " >>${LOG_PATH} [ ! -d ${JDK_INSTALL_PATH} ] && mkdir -p ${JDK_INSTALL_PATH} tar -zxvf ${JDK_PACKAGE_NAME} -C ${JDK_INSTALL_PATH} rm ${JDK_PACKAGE_NAME} JDK_ROOT_FOLDER=$(echo ${JDK_PACKAGE_NAME} | awk -F- '{print $2}' | awk -Fu '{print "jdk1."$1".0_"$2}') cp /etc/profile /etc/profile.$(date +%Y%m%d%H%M%S)bak cat >/etc/profile export JAVA_HOME=${JDK_INSTALL_PATH}/${JDK_ROOT_FOLDER} export JRE_HOME=${JDK_INSTALL_PATH}/${JDK_ROOT_FOLDER}/jre export CLASSPATH=.:${JDK_INSTALL_PATH}/${JDK_ROOT_FOLDER}/lib:${JDK_INSTALL_PATH}/${JDK_ROOT_FOLDER}/jre/lib:$CLASSPATH export PATH=${JDK_INSTALL_PATH}/${JDK_ROOT_FOLDER}/bin:${JDK_INSTALL_PATH}/${JDK_ROOT_FOLDER}/jre/bin:$PATH EOF source /etc/profile echo "Export environment variable success. JAVA_HOME=${JAVA_HOME}" >>${LOG_PATH} TOMCAT_PACKAGE_NAME=${TOMCAT_SOURCE_URL##*/} wget -qc ${TOMCAT_SOURCE_URL} -O ${TOMCAT_PACKAGE_NAME} echo "Download tomcat package success. TOMCAT_PACKAGE_NAME=${TOMCAT_PACKAGE_NAME} " >>${LOG_PATH} [ ! -d ${TOMCAT_INSTALL_PATH} ] && mkdir -p ${TOMCAT_INSTALL_PATH} tar -zxvf ${TOMCAT_PACKAGE_NAME} -C ${TOMCAT_INSTALL_PATH} rm ${TOMCAT_PACKAGE_NAME} TOMCAT_ROOT_FOLDER=${TOMCAT_PACKAGE_NAME%.tar.gz} cd ${TOMCAT_INSTALL_PATH}/$TOMCAT_ROOT_FOLDER/bin chmod +x *.sh ./startup.sh echo "Start tomcat success. " >>${LOG_PATH} ``` 3. 参数设置 脚本可以设置参数,这里假设我们只需要用户传入`JDK`和`Tomcat`的下载地址即可,其他参数我们就在脚本中指定了。如果脚本内容中某一个变量是参数,需要在执行时用户传入,我们就需要给脚本设置参数。 点击创建脚本页面的 **参数配置** 就可以给脚本设置参数了:  我们给脚本设置两个参数,参数名称一定要和脚本内容中定义的名称一致。如我们脚本内容中的参数分别叫`jdk_source_url`和`tomcat_source_url`,所以我们定义的参数也必须一致,如下所示:   4. 保存脚本 我们脚本信息填写完成后,点击 **确定** 就可以保存脚本了。 ### 2.绘制服务模板 创建好脚本后,我们就可以创建服务模板了。 1. 登录`ManageOne`的租户面,依次点击 **系统 -> 服务构建->服务模板** 来到服务模板管理界面后,点击左上角的 **创建按钮**,选择 **资源编排图形化设计器** ,带到服务模板绘制界面。 2. 绘制模板 `Tomcat`是一个`Web`服务器,需要对外提供服务,所以我们需要一个**弹性IP**资源,用来暴露外界访问地址,其次我们需要一台**ECS**资源,并且要在`ECS`执行我们的`Tomcat`安装脚本,所以需要一个**脚本配置绑定**资源,其次拖入我们刚刚创建的**Tomcat安装脚本**资源。 最终我们的模板绘制如下:  * 输入参数: 输入参数主要包括虚拟机的基本参数以及脚本需要的基本参数。 * 输出参数: 我们安装好后的`Tomcat`需要暴露`Tomcat首页地址`,Tomcat首页地址格式:`http://弹性IP:8080`. 这里我们把虚拟机的弹性IP和私有IP也暴露出来,方便其他需求使用。  --- 绘制好模板后,点击**保存服务模板**,然后填写模板的一些基本信息后,点击**确定**即可保存模板成功。 ### 3.创建服务 创建好服务模板后,我们服务模板列表页面找到刚刚创建的模板,点击**创建服务**,来到创建服务界面:   在创建服务界面可以配置很多参数: 1. 服务的基本信息:包括服务的名称、描述、版本、分类等信息。 2. 位置信息:我们可以选择服务创建的`region`以及资源集信息。 3. 使用策略:可以配置服务发布后的可见范围,可以选择全部可见(当前VDC及下级VDC可见),或者部分可见,选择发布到的VDC信息。 4. 其他参数:剩下的参数就是我们服务模板的参数,这些参数我们可以在创建服务时锁定,如我们想控制虚拟机镜像,那我们可以在创建服务时锁定,并且对用户隐藏,这样以后申请时,用户就看不到镜像的参数,所有虚拟机镜像保持一致。这里我们所有的参数都选择用户自定义,由用户在申请时指定。 参数填写完成后,点击 **立即创建** 创建我们的服务。 --- ### 4.申请服务 服务创建完成后,就可以立即在左上角导航栏看到。  我们点击我们刚刚创建的服务,来到服务申请页面,填写对应的参数:  参数填写完成后,点击立即申请,申请服务是异步的,需要几分钟的时间,我们耐心等待一会,喝口水,就可以看到服务申请完成了。  --- ### 5. 服务测试 当我们的服务申请完成后,我们点击**申请到的服务名称**,进入详情界面,可以看到我们之前定义的输出参数:  点击`Tomcat欢迎页`,可以正确跳转到`Tomcat`的欢迎页。  --- ## 5. 总结 服务构建器提供了非常丰富的资源编排功能,用户通过编排,可以实现各种场景的软件安装、集群配置、资源组合等功能,欢迎体验。
-
1、下载openjdkwget https://github.com/AdoptOpenJDK/openjdk8-binaries/releases/download/jdk8u252-b09/OpenJDK8U-jdk_aarch64_linux_hotspot_8u252b09.tar.gztar -zxf OpenJDK8U-jdk_aarch64_linux_hotspot_8u252b09.tar.gzmkdir -p /home/data/openjdk/mv jdk8u252-b09 /home/data/openjdk/2、配置环境变量vim /etc/profile在文件末尾添加环境变量配置代码export JAVA_HOME=/home/data/openjdk/jdk8u252-b09export PATH=$JAVA_HOME/bin:$PATH:wq保存并退出。3、检查openjdk是否安装成功java -version 4、下载tomcat在tomcat官网下载相应的版本。wget https://mirrors.bfsu.edu.cn/apache/tomcat/tomcat-8/v8.5.69/bin/apache-tomcat-8.5.69.tar.gztar -zxf apache-tomcat-8.5.69.tar.gz#重命名mv apache-tomcat-8.5.69 tomcat-zgshh5、开启8080端口firewall-cmd --state 显示已开启状态。#若没有开启,则输入以下命令开启systemctl start firewalld.service;#开启8080端口firewall-cmd --zone=public --add-port=8080/tcp --permanent;#重启防火墙systemctl restart firewalld.service;#重载配置firewall-cmd --reload; 在华为云控制台查看对应的安全组,将8080端口加入入方向规则。6、开启tomcat服务/home/data/tomcat-zgssh/bin/startup.sh至此tomcat安装完成。
-
1、尽量使用缓存技术, 包括用户缓存,信息缓存还有静态页面缓存,多花点内存来做缓存,可以大大减少与数据库的交互次数和 tomcat 执行次数,减少不变的数据重复在 tomcat 和数据库中获取的次数。 2、同步转异步, 对于一些不需要即时结果的操作,可以使用 MQ 消息机制,达到同步转异步的效果,如秒杀系统,正常流程:先点击秒杀,然后往服务器发送请求,在页面等待响应,这样融入大量请求,服务器压力会特别大,搞不好服务器就会宕机。使用 MQ 消息队列实现异步的步骤为:点击秒杀,返回请稍后查看结果,请求去 MQ 队列中排队,等排队执行完成后返回给用户信息。这样就可以大大减少服务器的压力,提升用户体验度。 3、合并多个同类型请求为一个请求, 使用 SpringCloud 的 Hystrix 技术来实现。在服务提供者提供了返回单个对象和多个对象的接口,并且单个对象的查询并发数很高,服务提供者负载较高的时候,我们就可以使用请求合并来降低服务提供者的负载。 4、数据库方面, 搭建数据库集群,网站一般读的多写的少,可以按照网站的统计数据来找到一个合适的平衡点,来搭建主从数据库服务,可以实现一主多从,或者多主多从,来减轻单个数据库的压力。可以按照每台数据库服务器的硬件条件,合理分配权重,配合 Mycat 达到负载均衡。 5、高质量代码, 合理的使用循环和递归,不要为了速度丢了内存,也不要为内存丢了速度,要看业务场景,来合理使用。减少自动处理逻辑,比如字符串拼接,每次拼接都会创建一个字符串放入常量池,这里可以按照业务场景来使用 StringBuilder 或者 StringBuffer 来进行字符串拼接,能手动处理就手动处理,代码中所有的临时对象,用完之后都赋值为 Null,这样可以减少 GC 的重复排查,效率就会有所提升。所有的资源用完都要回收,如:IO、数据库连接对象等,因为这些资源对 GC 不是特别友好。减少代码调用链,尽量不要让代码调用链超过 10,远程方法调用没事。提供过滤能力,把每个过滤器写的详细一点,把耦合度高的数据放入到同一个过滤器中,如果第一个过滤器没有通过那么后面的过滤器不执行,相对的业务也就不执行了,效率也就提升了。 6、网络优化, 外网转内网,内网转局域网,外网转 VPN。配合公司内的网络运维人员,进行网络网段的切换,尽量让服务器群处于内网,或者局域网中,提供访问速度。服务器之间的通讯如果都是局域网内进行的,那么可想而知,访问速度肯定有所提升。 7、中间件处理 搭建 Tomcat 集群,通过 Nginx 代理 Tomcat 服务器做负载均衡,对每个 Tomcat 的调优,合理设置设置 Tomcat 的最大连接数,因为 Tomcat 的默认最大并发数为 200。适当的加大 Tomcat的内存和最多线程数,设置 JVM 的处置大小为服务器可用内存的最大值的 80%。关闭 DNS查询,开启 gzip 压缩。 搭建 MQ 集群,高并发的时候一个 MQ 来处理队列根本不够用,这时可以搭建集群来处理。增加 Nginx 的内存,加大 Nginx 缓存数据的范围。服务器操作系统都用 64 位的,因为 32 位的系统最大内存只能有 4G 图片服务器分离,搭建 vsftpd 服务器来存储图片数据,通过 Nginx 代理 vsftpd 存放路径就可以直接访问到图片,这样响应到页面的只是超链接,并不是图片,这样页面的响应会得到大大的提升。
-
架构信息和系统  安装mysql及tomcat运行所需依赖 [root@a1 ~]# yum install -y java-1.8.0-openjdk mysql [root@a1 mysql]# mkdir -p /data/mysql/data/ mysql初始化 [root@a1 mysql]# /usr/local/mysql/bin/mysqld --initialize --basedir=/usr/local/mysql --datadir=/data/mysql/data --user=mysql 注意此时密码已经生成,用此密码登录 [root@a1 mysql]# systemctl start mysql  安装tomcat [root@a1 local]# wget https://archive.apache.org/dist/tomcat/tomcat-8/v8.0.21/bin/apache-tomcat-8.0.21.tar.gz  [root@a1 local]# tar zxvf apache-tomcat-8.0.21.tar.gz [root@a1 local]# wget https://downloads.mysql.com/archives/get/p/3/file/mysql-connector-java-8.0.21.tar.gz [root@a1 local]# tar zxvf mysql-connector-java-8.0.21.tar.gz 安装mysql-connect [root@a1 local]# cp mysql-connector-java-8.0.21/mysql-connector-java-8.0.21.jar apache-tomcat-8.0.21/lib/  编写连接mysql文件 [root@a1 local]# cd apache-tomcat-8.0.21/webapps/ [root@a1 webapps]# mkdir test [root@a1 webapps]# vim test/mysql.jsp  [root@a1 apache-tomcat-8.0.21]# cat webapps/test/mysql.jsp  测试连接  自此tomcat连接mysql成功 ps 报错无关连接问题,更改mysql初始password后正常 
-
1)Bootstrap ClassLoader:可以看到上图中缺少了 Extension ClassLoader,在 Tomcat 中 Extension ClassLoader 被集成到了 Bootstrap ClassLoader 里面。2)System ClassLoader 就是 Application ClassLoader:Tomcat 中的系统类加载器不会加载 CLASSPATH 环境变量的内容,而是从以下资源库构建 System 类加载器。$CATALINA_HOME/bin/bootstrap.jar,包含用于初始化Tomcat服务器的 main() 方法,以及它所依赖的类加载器实现类。$CATALINA_BASE/bin/tomcat-juli.jar 或 $CATALINA_HOME/bin/tomcat-juli.jar,日志实现类。如果 $CATALINA_BASE/bin 中存在 tomcat-juli.jar,则使用它来代替 $CATALINA_HOME/bin中的那个。$CATALINA_HOME/bin/commons-daemon.jar3)Common ClassLoader:从名字也看出来来了,主要包含一些通用的类,这些类对 Tomcat 内部类和所有 Web 应用程序都可见。该类加载器搜索的位置由 $CATALINA_BASE/conf/catalina.properties 中的 common.loader 属性定义,默认设置将按照顺序搜索以下位置。$CATALINA_BASE/lib 中未打包的类和资源$CATALINA_BASE/lib 目录下的JAR 文件$CATALINA_HOME/lib 中未打包的类和资源$CATALINA_HOME/lib 目录下的JAR文件4)WebappX ClassLoader:Tomcat 为每个部署的 Web 应用程序创建一个单独的类加载器,这样保证了不同应用之间是隔离的,类和资源对其他 Web 应用是不可见的。加载的路径如下:Web应用的 /WEB-INF/classes 目录下的所有未打包的类和资源Web应用的 /WEB-INF/lib 目录下的 JAR 文件中的类和资源
-
Tomcat 的类加载过程,也就是 WebappClassLoaderBase#loadClass 的逻辑如下。1)首先本地缓存 resourceEntries,如果已经被加载过则直接返回缓存中的数据。2)检查 JVM 是否已经加载过该类,如果是则直接返回。3) 检查要加载的类是否是 Java SE 的类,如果是则使用 BootStrap 类加载器加载该类,以防止 webapp 的类覆盖了 Java SE 的类。例如你写了一个 java.lang.String 类,放在当前应用的 /WEB-INF/classes 中,如果没有此步骤的保证,那么之后项目中使用的 String 类都是你自己定义的,而不是 rt.jar 下面的,可能会导致很多隐患。4)针对委托属性 delegate 显示设置为 true、或者一些特殊的类(javax、org 包下的部分类),使用双亲委派模式加载,只有很少部分使用双亲委派模型来加载。5)尝试从本地加载类,如果步骤5中加载失败也会走到本步骤,这边打破了双亲委派模型,优先从本地进行加载。7)走到这,代表步骤6加载失败,如果之前不是使用双亲委派模式,则在这边会委托给父类加载器来尝试加载。8)走到这边代表所有的尝试都加载失败,抛出 ClassNotFoundException。
-
鲲鹏系统中的tomcat安装
-
当容器启动时,会读取在webapps目录下所有的web应用中的web.xml文件,然后对xml文件进行解析,并读取servlet注册信息。然后,将每个应用中注册的servlet类都进行加载,并通过反射的方式实例化。(有时候也是在第一次请求时实例化)在servlet注册时加上如果为正数,则在一开始就实例化,如果不写或为负数,则第一次请求实例化。