架构学习第一周--Tomcat

目录

一、Tomcat实现多虚拟主机

二、Tomcat定制日志格式和反向代理

2.1,Tomcat定制日志格式

2.2,Tomcat反向代理

三、Tomcat实现MSM集群

3.1,Tomcat session集群搭建

3.2,MSM搭建

四、MSM原理与memcache安装使用总结

4.1,MSM原理

4.2,memcached安装介绍

4.3,memcached使用介绍

五、JVM垃圾回收算法和分代

5.1,垃圾回收算法

5.2,分代策略

5.4,Tomcat优化

六、Nexus安装和私有仓库实现

6.1,Maven介绍

6.2,Nexus安装

6.3,私有仓库搭建

一、Tomcat实现多虚拟主机

#安装Tomcat

[root@Rocky-test1 ~]# yum -y install java-1.8.0-openjdk-devel                  #安装Tomcat必须先装java
[root@Rocky-test1 ~]# yum -y install tomcat tomcat-admin-webapps tomcat-webapps tomcat-docs-webapp                                                                                     #包安装方法

[root@Rocky-test1 ~]# tar xf apache-tomcat-9.0.75.tar.gz -C /usr/local/    #二进制安装
[root@Rocky-test1 local]# ln -s apache-tomcat-9.0.75/ tomcat                   #创建软连接
[root@Rocky-test1 local]# echo 'PATH=/usr/local/tomcat/bin:$PATH' > /etc/profile.d/tomcat.sh                                                                                #添加环境变量
[root@Rocky-test1 local]# . /etc/profile.d/tomcat.sh                                   #变量生效

[root@Rocky-test1 local]# catalina.sh version                                  #查看tomcat版本信息
Using CATALINA_BASE:   /usr/local/tomcat
Using CATALINA_HOME:   /usr/local/tomcat
Using CATALINA_TMPDIR: /usr/local/tomcat/temp
Using JRE_HOME:        /usr
Using CLASSPATH:       /usr/local/tomcat/bin/bootstrap.jar:/usr/local/tomcat/bin/tomcat-juli.jar
Using CATALINA_OPTS:
Server version: Apache Tomcat/9.0.75
Server built:   May 4 2023 13:04:05 UTC
Server number:  9.0.75.0
OS Name:        Linux
OS Version:     4.18.0-372.9.1.el8.x86_64
Architecture:   amd64
JVM Version:    1.8.0_422-b05
JVM Vendor:     Red Hat, Inc.

[root@Rocky-test1 local]# startup.sh                                                              #启动tomcat

#Tomcat配置service文件

[root@Rocky-test1 ~]# useradd -r -s /sbin/nologin tomcat                           #创建服务账号

[root@Rocky-test1 ~]# vim /usr/local/tomcat/conf/tomcat.conf                #修改tomcat配置

JAVA_HOME=/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.422.b05-2.el8.x86_64

[root@Rocky-test1 ~]# chown -R tomcat.tomcat /usr/local/tomcat/        

[root@Rocky-test1 ~]# vim /lib/systemd/system/tomcat.service        #创建service文件

[Unit]
Description=Tomcat
After=syslog.target network.target

[Service]
Type=forking
EnvironmentFile=/usr/local/tomcat/conf/tomcat.conf
ExecStart=/usr/local/tomcat/bin/startup.sh
ExecStop=/usr/local/tomcat/bin/shutdown.sh
PrivateTmp=true
User=tomcat
Group=tomcat

[Install]
WantedBy=multi-user.target
[root@Rocky-test1 ~]# systemctl enable --now tomcat.service

#实现多虚拟主机

[root@Rocky-test1 conf]# cd /usr/local/tomcat/conf/

[root@Rocky-test1 conf]# vim server.xml                      #在配置文件内添加<host>元素指向虚拟主机,name代表主机名称,appbase代表应用程序目录类似于apache的html文件夹位置

      <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>
      <Host name="www.wlm.com"  appBase="/home/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>

[root@Rocky-test1 conf]# mkdir /home/webapps/ROOT -pv              #创建网页根目录

[root@Rocky-test1 webapps]# chown tomcat.tomcat -R /home/webapps/

[root@Rocky-test1 ROOT]# echo www.wlm.com > index.html           
[root@Rocky-test1 ROOT]# systemctl restart tomcat.service

[root@Rocky-test1 ROOT]# vim /etc/hosts
10.0.0.151  www.wlm.com
[root@Rocky-test1 ROOT]# curl www.wlm.com:8080
www.wlm.com
 

#搭建jpress

[root@Rocky-test1 ~]# cd /home/webapps/
[root@Rocky-test1 webapps]# mv /root/jpress-v5.0.7.war ./ROOT.war        #将jpress的war包改名后放在webapps指定的目录下(注意:Jpress版本BUG只能解压至ROOT

[root@Rocky-test2 ~]# yum -y install mysql-server        #准备数据库

[root@Rocky-test2 ~]# systemctl enable --now mysqld.service
[root@Rocky-test2 ~]# mysql

mysql> create database jpress;
Query OK, 1 row affected (0.00 sec)

mysql> create user jpress@'10.0.0.%' identified with mysql_native_password by '123456';
Query OK, 0 rows affected (0.01 sec)

mysql> grant all on jpress.* to jpress@'10.0.0.%';
Query OK, 0 rows affected (0.01 sec)
 

#按照网页提示配置jpress

#访问localhost(10.0.0.151)配置tomcat默认管理界面

[root@Rocky-test1 ~]# cd /usr/local/tomcat/webapps/manager/
[root@Rocky-test1 manager]# vim ./META-INF/context.xml
 <Valve className="org.apache.catalina.valves.RemoteAddrValve"
         allow="127\.\d+\.\d+\.\d+|::1|0:0:0:0:0:0:0:1|10\.0\.0\.\d+" />

[root@Rocky-test1 manager]# vim ../host-manager/META-INF/context.xml
<Valve className="org.apache.catalina.valves.RemoteAddrValve"
         allow="127\.\d+\.\d+\.\d+|::1|0:0:0:0:0:0:0:1|10\.0\.0\.\d+" />

[root@Rocky-test1 manager]# cd ../../conf/
[root@Rocky-test1 conf]# vim tomcat-users.xml
.......

  <role rolename="manager-gui"/>
  <role rolename="admin-gui"/>
  <user username="tomcat" password="123456" roles="manager-gui,admin-gui"/>

</tomcat-users>
[root@Rocky-test1 conf]# systemctl restart tomcat.service

#访问localhost(10.0.0.151)通过server_status和host_manager可以管控服务

#通过iptables策略实现端口重定向(可选)

[root@Rocky-test1 ~]# iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT --to-port 8080                                   #将指向该服务器的80端口请求转发至8080,80和8080端口都可访问web服务

[root@Rocky-test1 ~]# iptables -vnL -t nat
Chain PREROUTING (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination
    0     0 REDIRECT   tcp  --  *      *       0.0.0.0/0            0.0.0.0/0            tcp dpt:80 redir ports 8080

二、Tomcat定制日志格式和反向代理

2.1,Tomcat定制日志格式

[root@Rocky-test1 tomcat]# cat ./conf/server.xml

........

 <Host name="www.wlm.com"  appBase="/home/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>

#pattern定义了访问日志的格式,%h代表远程主机IP,%l %u代表远程用户验证信息,%t代表时间,&quot;代表双引号,%r代表响应报文头,%s代表服务器响应码

官方日志格式解释: https://tomcat.apache.org/tomcat-9.0-doc/config/valve.html#Access_Logging
[root@Rocky-test1 tomcat]# vim ./conf/server.xml                        #定制日志json格式

      <Host name="www.wlm.com"  appBase="/home/webapps"
            unpackWARs="true" autoDeploy="true">
        <Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
               prefix="localhost_access_log" suffix=".txt"
               pattern="{&quot;clientip&quot;:&quot;%h&quot;,&quot;ClientUser&quot;:&quot;%l&quot;,&quot;authenticated&quot;:&quot;%u&quot;,&quot;AccessTime&quot;:&quot;%t&quot;,&quot;method&quot;:&quot;%r&quot;,&quot;status&quot;:&quot;%s&quot;,&quot;SendBytes&quot;:&quot;%b&quot;,&quot;Query?string&quot;:&quot;%q&quot;,&quot;partner&quot;:&quot;%{Referer}i&quot;,&quot;AgentVersion&quot;:&quot;%{User-Agent}i&quot;}"/>

[root@Rocky-test1 tomcat]# systemctl restart tomcat.service
[root@Rocky-test1 tomcat]# yum -y install jq                                        #安装json解析工具

[root@Rocky-test1 tomcat]# tail -n1 ./logs/localhost_access_log.2024-08-07.txt | jq
{
  "clientip": "10.0.0.1",
  "ClientUser": "-",
  "authenticated": "-",
  "AccessTime": "[07/Aug/2024:14:39:17 +0800]",
  "method": "GET /commons/captcha HTTP/1.1",
  "status": "200",
  "SendBytes": "1995",
  "Query?string": "",
  "partner": "http://www.wlm.com/article/2",
  "AgentVersion": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/127.0.0.0 Safari/537.36 Edg/127.0.0.0"
}

2.2,Tomcat反向代理

#Rocky-test1做Nginx代理,Rocky-test2和3做Tomcat服务,在主机安装服务后启动

#配置nginx反向代理

[root@Rocky-test1 ~]# vim /etc/nginx/conf.d/wlm.conf

upstream tomcat {
        server 10.0.0.152:8080;
        server 10.0.0.153:8080;
}

server{
        listen 80;
        server_name www.wlm.com;
        location / {
          proxy_pass http://tomcat;
        }
}
[root@Rocky-test1 ~]# systemctl restart nginx.service

#绑定客户端实现会话保持

[root@Rocky-test1 ~]# vim /etc/nginx/conf.d/wlm.conf

upstream tomcat {

        #ip_hash;                                                                 #会话绑定客户端IP前24位
        #hash $remote_addr consistent;                             #会话绑定客户端IP
        hash $cookie_jsessionid consistent;                       #会话绑定cookie
        server 10.0.0.152:8080;
        server 10.0.0.153:8080;
}
.........

[root@Rocky-test1 ~]# systemctl reload nginx.service

[root@Rocky-test2 tomcat]# cat ./webapps/ROOT/session.jsp        #jsp脚本可查看获取到的cookie
<%@ page language="java" %>
<html>
        <head><title>Tomcat1</title></head>
        <body>
                <h1><font color="red">Tomcat1</font></h1>
                <table align="centre" border="1">
                        <tr>
                                <td>Session ID</td>
                        <% session.setAttribute("username","wangxiaochun"); %>
                                <td><%= session.getId() %></td>
                        </tr>
                        <tr>
                                <td>Created on</td>
                                <td><%= session.getCreationTime() %></td>
                        </tr>
                </table>
        </body>
</html>

#绑定客户端IP实现会话保持,同一个IP不同浏览器访问cookie相同;

#绑定客户端cookie实现会话保持,同一个客户端不同浏览器访问初次获取的cookie不同,访问的后端服务器不同

三、Tomcat实现MSM集群

会话保持方法客户端绑定Session集群MSM
优点简单易配置通过Tomcat自身实现复制集群,保证session保持通过memcache或redis实现会话的保存,可实现高可用
缺点若服务器故障易丢失sessionTomcat同步节点过多时会占用带宽,且每台Tomcat保存全部session内存损耗太多不支持Tomcat 10及以上版本

3.1,Tomcat session集群搭建

[root@Rocky-test1 ~]# vim /etc/nginx/conf.d/wlm.conf

upstream tomcat {

        #ip_hash;                                                                 #会话绑定客户端IP前24位
        #hash $remote_addr consistent;                             #会话绑定客户端IP
        #hash $cookie_jsessionid consistent;                       #会话绑定cookie
        server 10.0.0.152:8080;
        server 10.0.0.153:8080;
}
.........

[root@Rocky-test1 ~]# systemctl reload nginx.service

[root@Rocky-test2 tomcat]# vim ./conf/server.xml

         <Manager className="org.apache.catalina.ha.session.DeltaManager"
                   expireSessionsOnShutdown="false"
                   notifyListenersOnReplication="true"/>

          <Channel className="org.apache.catalina.tribes.group.GroupChannel">
            <Membership className="org.apache.catalina.tribes.membership.McastService"
                        address="228.0.0.4"
                        port="45564"
                        frequency="500"
                        dropTime="3000"/>
            <Receiver className="org.apache.catalina.tribes.transport.nio.NioReceiver"
                      address="10.0.0.152"
                      port="4000"
                      autoBind="100"
                      selectorTimeout="5000"
                      maxThreads="6"/>

           <Sender className="org.apache.catalina.tribes.transport.ReplicationTransmitter">
              <Transport className="org.apache.catalina.tribes.transport.nio.PooledParallelSender"/>
            </Sender>
            <Interceptor className="org.apache.catalina.tribes.group.interceptors.TcpFailureDetector"/>
            <Interceptor className="org.apache.catalina.tribes.group.interceptors.MessageDispatchInterceptor"/>
          </Channel>

          <Valve className="org.apache.catalina.ha.tcp.ReplicationValve"
                 filter=""/>
          <Valve className="org.apache.catalina.ha.session.JvmRouteBinderValve"/>

          <Deployer className="org.apache.catalina.ha.deploy.FarmWarDeployer"
                    tempDir="/tmp/war-temp/"
                    deployDir="/tmp/war-deploy/"
                    watchDir="/tmp/war-listen/"
                    watchEnabled="false"/>

          <ClusterListener className="org.apache.catalina.ha.session.ClusterSessionListener"/>
#按照官方手册修改主配置文件,Apache Tomcat 9 (9.0.93) - Clustering/Session Replication How-To

[root@Rocky-test2 tomcat]# vim ./webapps/ROOT/WEB-INF/web.xml
.......

  </description>
<distributable/>
</web-app>

[root@Rocky-test2 tomcat]# systemctl restart tomcat.service

#按照相同方式修改其他Tomcat服务器,出去服务后用户访问的会话不变,后端Tomcat服务器会依照配置轮询

3.2,MSM搭建

#在原有实验环境下清除session集群配置项,并在Rocky-test2和3安装memcached服务

#具体配置可参考官方链接--https://github.com/magro/memcached-session-manager/wiki/SetupAndConfiguration

#sticky 模式,当用户请求发送到Tomcat1时,Tomcat1会生成session并备份在memcached2内,只有memcached2服务故障才会将Tomcat1会生成session存放在memcached1内

[root@Rocky-test2 tomcat]# yum -y install memcached

[root@Rocky-test2 tomcat]# vim /etc/sysconfig/memcached

PORT="11211"
USER="memcached"
MAXCONN="10240"
CACHESIZE="64"
#OPTIONS="-l 127.0.0.1,::1"

[root@Rocky-test2 tomcat]# systemctl enable --now memcached.service

#修改Tomcat配置

[root@Rocky-test2 tomcat]# vim ./conf/context.xml                #在最后一行前添加下列内容
<Manager className="de.javakaffee.web.msm.MemcachedBackupSessionManager"
    memcachedNodes="n1:10.0.0.152:11211,n2:10.0.0.153:11211"                             
    failoverNodes="n1"

    requestUriIgnorePattern=".*\.(ico|png|gif|jpg|css|js)$"
    transcoderFactoryClass="de.javakaffee.web.msm.serializer.kryo.KryoTranscoderFactory"
   />

</Context>

[root@Rocky-test2 tomcat]#  ls ./lib/             #上传服务所需的jar包(下载链接见官方文档)
annotations-api.jar       jasper.jar                               reflectasm-1.11.9.jar    tomcat-i18n-ko.jar
asm-5.2.jar               jaspic-api.jar                           servlet-api.jar          tomcat-i18n-pt-BR.jar
catalina-ant.jar          jedis-3.0.0.jar                          spymemcached-2.12.3.jar  tomcat-i18n-ru.jar
catalina-ha.jar           jsp-api.jar                              tomcat-api.jar           tomcat-i18n-zh-CN.jar
catalina.jar              kryo-3.0.3.jar                           tomcat-coyote.jar        tomcat-jdbc.jar
catalina-ssi.jar          kryo-serializers-0.45.jar                tomcat-dbcp.jar          tomcat-jni.jar
catalina-storeconfig.jar  memcached-session-manager-2.3.2.jar      tomcat-i18n-cs.jar       tomcat-util.jar
catalina-tribes.jar       memcached-session-manager-tc9-2.3.2.jar  tomcat-i18n-de.jar       tomcat-util-scan.jar
ecj-4.20.jar              minlog-1.3.1.jar                         tomcat-i18n-es.jar       tomcat-websocket.jar
el-api.jar                msm-kryo-serializer-2.3.2.jar            tomcat-i18n-fr.jar       websocket-api.jar
jasper-el.jar             objenesis-2.6.jar                        tomcat-i18n-ja.jar

[root@Rocky-test2 tomcat]# systemctl restart tomcat.service

#Rocky-test3配置与Rocky-test2相同,仅需将context.xml的failoverNodes改为n2

[root@Rocky-test2 tomcat]# cat ./logs/catalina.out       #配置成功后可在日志看到下列信息
-  finished initialization:
- sticky: true
- operation timeout: 1000
- node ids: [n2]
- failover node ids: [n1]
- storage key prefix: null
- locking mode: null (expiration: 5s)

#non-sticky 模式,当用户请求发送到Tomcat1时,Tomcat1会生成session并备份在memcached1和2服务内互为主备

#该模式配置与上一实验配置相似,仅需修改Rocky-test2和3的context.xml配置

[root@Rocky-test2 tomcat]# vim ./conf/context.xml 

<Manager className="de.javakaffee.web.msm.MemcachedBackupSessionManager"
    memcachedNodes="n1:10.0.0.152:11211,n2:10.0.0.153:11211"
    sticky="false"
    sessionBackupAsync="false"
    lockingMode="uriPattern:/path1|/path2"

    requestUriIgnorePattern=".*\.(ico|png|gif|jpg|css|js)$"
    transcoderFactoryClass="de.javakaffee.web.msm.serializer.kryo.KryoTranscoderFactory"
    />
[root@Rocky-test2 tomcat]# systemctl restart tomcat.service
[root@Rocky-test2 tomcat]# cat ./logs/catalina.out

-  finished initialization:
- sticky: false
- operation timeout: 1000
- node ids: [n1, n2]
- failover node ids: []
- storage key prefix: null
- locking mode: uriPattern:/path1|/path2 (expiration: 5s)

四、MSM原理与memcache安装使用总结

4.1,MSM原理

        一种 Tomcat 高可用性解决方案,将会话额外存储在 memcached 或redis 兼容的键值存储中,以便进行会话故障转移,同时从本地内存读取会话以实现最佳性能(对于sticky-session)。对于non-sticky-session,memcached 兼容的后端用作会话存储(在辅助 memcached 节点中保留会话的副本)。

4.2,memcached安装介绍

#memcached编译安装

[root@Rocky-test1 ~]# wget https://www.memcached.org/files/memcached-1.6.29.tar.gz                                #下载安装包
[root@Rocky-test1 ~]# ls
anaconda-ks.cfg  memcached-1.6.29.tar.gz
[root@Rocky-test1 ~]# tar xvf memcached-1.6.29.tar.gz
[root@Rocky-test1 ~]# yum -y install gcc make libevent-devel                #安装依赖包
[root@Rocky-test1 ~]# cd memcached-1.6.29/
[root@Rocky-test1 memcached-1.6.29]# mkdir /home/memcached

[root@Rocky-test1 memcached-1.6.29]# ./configure --prefix=/home/memcached

[root@Rocky-test1 memcached-1.6.29]# make && make install

[root@Rocky-test1 memcached-1.6.29]# cd /home/memcached/

[root@Rocky-test1 memcached]# useradd -r -s /sbin/nologin memcached
[root@Rocky-test1 memcached]# echo 'PATH=/home/memcached/bin/memcached:$PATH' > /etc/sysconfig/memcachaed.sh

[root@Rocky-test1 memcached]# . /etc/sysconfig/memcachaed.sh

[root@Rocky-test1 memcached]# vim /etc/sysconfig/memcached

PORT="11211"
USER="memcached"
MAXCONN="10240"
CACHESIZE="64"
#OPTIONS="-l 127.0.0.1,::1"

[root@Rocky-test1 memcached]# vim /lib/systemd/system/memcached.service

[Unit]
Description=memcached daemon
Before=httpd.service
After=network.target

[Service]
EnvironmentFile=/etc/sysconfig/memcached

ExecStart=/home/memcached/bin/memcached  -p ${PORT} -u ${USER} -m ${CACHESIZE} -c ${MAXCONN} $OPTIONS

[Install]
WantedBy=multi-user.target

[root@Rocky-test1 memcached]# systemctl daemon-reload
[root@Rocky-test1 memcached]# systemctl enable --now memcached.service

4.3,memcached使用介绍

        memcached是一款键值对数据库软件,只支持能序列化的数据类型,不支持持久化,基于Key-Value的内存缓存系,服务重启时数据就会丢失。memcached相比于redis的单机QRS高,适用于业务场景简单,追求高性能的场合。

memcached常见选项:

-u   username                程序运行用户名,必须为普通用户
-p                                   端口号,默认 11211
-m num                         最大内存,单位MB,默认 64MB
-c   num                         最大连接数,默认1024
-d                                   守护进程方式运行
-f                                    增长因子 Growth Factor ,默认 1.25
-v                                  详细信息, -vv 能看到详细信息
-M                                  使用内存直到耗尽,不许 LRU
-U                                  设置 UDP 监听端口, 0 表示禁用 UDP

五、JVM垃圾回收算法和分代

        JVM(Java虚拟机)的垃圾收集(Garbage Collection, GC)是Java语言一个显著的特点。它提供了一种自动清理垃圾的方法,可以有效回收堆内不再使用的对象占用的内存,保证程序的正常运行。为了提高GC效率,JVM 使用了不同的垃圾回收算法和分代策略。

5.1,垃圾回收算法

算法标记-清除标记-压缩复制
实现方式将可访问对象标记完成后,对未标记对象逐一清除将可访问对象标记完成后,清除垃圾时将对象向内存一端移动
先将内存分为大小相同A,B区域 ,每次只用一块,A用完后,将存活对象复制到B连续内存,清理A整块
优点算法简单
整理后内存空间连续分配,有大段的连续内存可分配,没有内存碎片
没有内存碎片,复制过程中保证对象使用连续空间 ,回收效率相对高
缺点会造成内存碎片,无法有效利用内存
内存整理过程有消耗 , 效率相对低下
浪费内存 ,只能使用原来一半内存

算法总结:

效率:                 复制算法> 标记清除算法 > 标记压缩算法
内存整齐度:      复制算法 = 标记压缩算法 > 标记清除算法
内存利用率:        标记压缩算法 = 标记清除算法 > 复制算法

5.2,分代策略

EdenSpace:只有一个,刚刚创建的对象

ServivorSpace:有两个from区和同to区,大小相等、地位相同,组成复制清除算法

老年代:长时间存活的对象

元数据存储JAVA运行时的环境信

5.4,Tomcat优化

内存优化项:
JAVA_OPTS="-server -Xms512m -Xmx512m -XX:NewSize=200m -XX:MaxNewSize=200m "
-Xms:堆内存初始化大小
-Xmx:堆内存空间上限
-XX :NewSize= : 新生代空间初始化大小
-XX :NewSize= : 新生代空间上限
GC回收设置优化:
1,侧重用户交互(多次执行、 短时回收)
-XX:+UseConcMarkSweepGC -XX:CMSInitiatingOccupancyFraction=80 
-XX:+UseCMSCompactAtFullCollection -XX:CMSFullGCsBeforeCompaction=5

-XX:CMSInitiatingOccupancyFraction=N,N为0-100整数表示达到老年代的大小的百分比多

少触发回收,默认为68
-XX:CMSFullGCsBeforeCompaction=N, 设定N次 CMS 后,进行一次内存碎片整理
2,侧重吞吐量(一次执行长时间回收)
-XX:+UseParallelGC -XX:+UseParallelOldGC
此为JVM1.8默认模式

[root@Rocky-test2 ~]# vim /usr/local/tomcat/bin/catalina.sh

# -----------------------------------------------------------------------------

JAVA_OPTS="-server -Xmx512m -Xms512m -XX:NewSize=200m -XX:MaxNewSize=200m -XX:+UseConcMarkSweepGC -XX:CMSInitiatingOccupancyFraction=80 -XX:+UseCMSCompactAtFullCollection -XX:CMSFullGCsBeforeCompaction=5"

# OS specific support.  $var _must_ be set to either true or false.

[root@Rocky-test2 ~]# vim /usr/local/tomcat/conf/server.xml        #修改默认线程数
<Connector port="8080" protocol="HTTP/1.1"
               connectionTimeout="20000"
               redirectPort="8443"
               maxParameterCount="1000"
               maxThreads="2000"
               />

[root@Rocky-test2 ~]# systemctl restart tomcat.service

六、Nexus安装和私有仓库实现

6.1,Maven介绍

        Maven是一个java项目管理工具,可以对java项目进行构建/解决打包依赖等。Maven基干项目对象模型(POM project object model),它可以通过一小段描述信息(项目依赖、插件、执行目标、项目构建 profile、项目版本、项目开发者列表用<packaging> 指定项目打包形式,jar或者war )来管理项目的构建;因而,每个maven项目都有一个pom.xml文件。

#包安装;安装Maven时若未无java,会自行安装java

[root@Rocky-test1 ~]# yum list maven
maven.noarch                               1:3.5.4-5.module+el8.6.0+975+c0ed2db8                          
[root@Rocky-test1 ~]# yum -y install maven
[root@Rocky-test1 ~]# java -version
openjdk version "1.8.0_422"
[root@Rocky-test1 ~]# mvn -version
Apache Maven 3.5.4 (Red Hat 3.5.4-5)
Maven home: /usr/share/maven
Java version: 1.8.0_422, vendor: Red Hat, Inc., runtime: /usr/lib/jvm/java-1.8.0-openjdk-1.8.0.422.b05-2.el8.x86_64/jre
Default locale: en_US, platform encoding: UTF-8
OS name: "linux", version: "4.18.0-372.9.1.el8.x86_64", arch: "amd64", family: "unix"
 

#二进制安装;先安装java,再安装maven,生产环境建议安装Oracle JDK而非Open JDK

root@ubuntu-test1:~# ls                                                        #下载二进制安装包至本地
apache-maven-3.9.2-bin.tar.gz  jdk-8u371-linux-x64.tar.gz    snap

root@ubuntu-test1:~# mkdir /home/app/

root@ubuntu-test1:~# tar xvf jdk-8u371-linux-x64.tar.gz -C /home/app/            #安装java
root@ubuntu-test1:~# ln -s /home/app/jdk1.8.0_371/ /home/app/jdk
root@ubuntu-test1:~# vim /etc/profile.d/jdk.sh
export JAVA_HOME=/home/app/jdk
export PATH=$PATH:$JAVA_HOME/bin
root@ubuntu-test1:~# . /etc/profile.d/jdk.sh
root@ubuntu-test1:~# java -version
java version "1.8.0_371"
Java(TM) SE Runtime Environment (build 1.8.0_371-b11)
Java HotSpot(TM) 64-Bit Server VM (build 25.371-b11, mixed mode)

root@ubuntu-test1:~# tar xvf apache-maven-3.9.2-bin.tar.gz -C /home/app/  #安装maven
root@ubuntu-test1:~# ln -s /home/app/apache-maven-3.9.2/ /home/app/maven
root@ubuntu-test1:~# echo PATH=/home/app/maven/bin/:$PATH > /etc/profile.d/maven.sh
root@ubuntu-test1:~# . /etc/profile.d/maven.sh
root@ubuntu-test1:~# mvn -version
Apache Maven 3.9.2 (c9616018c7a021c1c39be70fb2843d6f5f9b8a1c)
Maven home: /home/app/maven

root@ubuntu-test1:~# vim /home/app/maven/conf/settings.xml           #配置国内镜像加速

    <mirror>
      <id>nexus-aliyun</id>
      <mirrorOf>*</mirrorOf>
      <name>nexus-aliyun</name>
      <url>
https://maven.aliyun.com/repository/public </url>
      <blocked>true</blocked>
    </mirror>
           
Maven工程构建的各个环节:
        clean: 以前编译得到的旧文件 class 字节码文件删除
        compile:将 java 源程序编译成 class 字节码文件
        test:自动测试 , 例如,自动调用 junit 程序
        report:报告测试程序执行的结果
        package:应用打包 , 动态 Web 工程打成 war ,java 工程打成 jar
        install: 是指将打包得到的文件复制到仓库中指定的位置
        deploy:将动态 Web 工程生成的 war 包复制到 Servlet 容器下,使其可以运行
#Maven实例--Jpress编译(Jpress-v5.1.0支持maven-3.5.4基于JDK8的编译,不支持maven- 3.9.2和JDK8, 但可以运行在JDK8或JDK11上)
[root@Rocky-test1 ~]# yum -y install git                                          #红帽系统需安装git工具
[root@Rocky-test1 ~]# git clone https://gitee.com/JPressProjects/jpress.git           #下载官方源码
[root@Rocky-test1 ~]# cd jpress/                                                #进入 包含有pom.xml的路径
[root@Rocky-test1  jpress]# mvn clean install package -Dmaven.test.skip=true        #编译java程序,Dmaven.test.skip=true跳过测试并且不编译测试下的源代码
[root@Rocky-test1 jpress]# ll starter-tomcat/target/                   #在target目录下可找到编译完成的war包
total 122572
drwxr-xr-x 2 root root        86 Aug 14 13:47 classes
drwxr-xr-x 2 root root        28 Aug 14 13:47 maven-archiver
drwxr-xr-x 6 root root        86 Aug 14 13:47 starter-tomcat-5.0
-rw-r--r-- 1 root root      4459 Aug 14 13:47 starter-tomcat-5.0-classes.jar
-rw-r--r-- 1 root root 125501868 Aug 14 13:47 starter-tomcat-5.0.war
#Maven实例--俄罗斯方块编译
[root@Rocky-test1 ~]# git clone https://gitee.com/DJCDNL/blockvs.git
[root@Rocky-test1 ~]# cd blockvs/
[root@Rocky-test1 blockvs]# mvn clean install package -Dmaven.test.skip=true
[root@Rocky-test1 blockvs]# cd target/
[root@Rocky-test1 target]# ll
total 12312
drwxr-xr-x 2 root root       6 Aug 14 14:57 archive-tmp
-rw-r--r-- 1 root root 3832667 Aug 14 14:56 Block_VS-1.0-SNAPSHOT.jar
-rw-r--r-- 1 root root 8770010 Aug 14 14:57 Block_VS-1.0-SNAPSHOT-jar-with-dependencies.jar
drwxr-xr-x 4 root root      30 Aug 14 14:56 classes
drwxr-xr-x 3 root root      25 Aug 14 14:56 generated-sources
drwxr-xr-x 2 root root      28 Aug 14 14:56 maven-archiver
drwxr-xr-x 3 root root      35 Aug 14 14:56 maven-status

6.2,Nexus安装

#安装Nexus需要先安装JDK8,服务器内存需在4G以上

root@ubuntu-test1:~# tar xvf nexus-3.54.1-01-unix.tar.gz -C /home/app/
root@ubuntu-test1:~# ln -s /home/app/nexus-3.54.1-01/bin/nexus /usr/local/sbin/
root@ubuntu-test1:~# vim /home/app/nexus-3.54.1-01/bin/nexus.rc        #配置运行用户
run_as_user="root"

root@ubuntu-test1:~# vim /home/app/nexus-3.54.1-01/bin/nexus.vmoptions        #调整使用服务内存避免超出服务器内存上限

-Xms2048m
-Xmx2048m

root@ubuntu-test1:~# nexus start                                                             #启动nexus服务
WARNING: ************************************************************
WARNING: Detected execution as "root" user.  This is NOT recommended!
WARNING: ************************************************************
Starting nexus
root@ubuntu-test1:~# nexus stop
root@ubuntu-test1:~# vim /lib/systemd/system/nexus.service

[Unit]
Description=nexus service
After=network.target

[Service]
Type=forking
LimitNOFILE=65536
ExecStart=/usr/local/sbin/nexus start           
ExecStop=/usr/local/sbin/nexus stop
User=root
Restart=on-abort

[Install]
WantedBy=multi-user.target

root@ubuntu-test1:~# vim /home/app/nexus-3.54.1-01/bin/nexus             #取消下行注释并添加本地JDK路径,JDK使用包安装时无需修改该行即可启动服务

INSTALL4J_JAVA_HOME_OVERRIDE=/home/app/jdk
root@ubuntu-test1:~# systemctl daemon-reload

root@ubuntu-test1:~# systemctl enable --now nexus.service
root@ubuntu-test1:~# cat /home/app/sonatype-work/nexus3/admin.password
a9f3de32-54ae-446a-82fc-9bad96d0dc15

#访问服务器IP:8081并使用admin和初始密码即可登入nexus并进行初始化配置

6.3,私有仓库搭建

默认仓库类型

hosted: 本地仓库,部署自己的构建,如公司的第三方库

proxy:   代理仓库,用于代理远程的公告仓库

group:   仓库组,用于合并多个hosted、proxy仓库

#修改默认Maven仓库源至阿里云,构建Maven仓库

#构建Yum仓库

#创建自定义存储存放仓库数据

root@ubuntu-test1:~# mkdir /home/blobs

#正式创建仓库

#构建Apt仓库,配置步骤与Yum仓库相同

#Yum仓库测试

[root@Rocky-test1 ~]# vim /etc/yum.repos.d/baseos.repo        #替换仓库源URL

[baseos]
name=nexus.BaseOS
baseurl=http://10.0.0.161:8081/repository/blobs-yum-rocky8/
gpgcheck=0

[root@Rocky-test1 ~]# yum repolist
repo id                                                    repo name
baseos                                                     nexus.BaseOS

[root@Rocky-test1 ~]# yum -y install python3-rpm                        #安装软件测试

#Apt仓库测试

root@ubuntu-test1:~# vim /etc/apt/sources.list.d/original.list        #替换仓库源URL
deb http://10.0.0.161:8081/repository/blobs-apt-ubuntu2004 focal multiverse
deb http://10.0.0.161:8081/repository/blobs-apt-ubuntu2004 focal-updates multiverse
root@ubuntu-test1:~# apt update

Get:1 http://10.0.0.161:8081/repository/blobs-apt-ubuntu2004 focal InRelease [265 kB]
Get:2 http://10.0.0.161:8081/repository/blobs-apt-ubuntu2004 focal-updates InRelease [128 kB]

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值