项目部署过程
· 申请线上机器工单
后端服务一台,执行机N台。
前端机器无需申请,前端需部署到公司公用的nginx服务器上
· 申请机器root权限工单
· 申请数据库工单
在以前申请的数据库实例中加数据库
· 申请redis工单
· 申请线上配置变更工单
文件中配置了用户名密码,由运维放到机器的某个目录下
· 申请域名工单
· 申请nginx工单,选择域名指向nginx
提供具体的配置信息给OP
· 创建jenkins job
· 在机器上创建目录
文件需具有写权限
/apps/srv/instance/castor-.com/bin/jardeploy.sh
/apps/srv/instance/castor-com/bin/logs/castor.log
/apps/srv/instance/castor-.com/bin/restart.sh
/apps/srv/instance/castor-/bin/startup.sh
/apps/srv/instance/castor-/bin/stop.sh
/apps/srv/instance/castor-.com/conf
/apps/srv/instance/castor-.com/logs/stderr.log
/apps/srv/instance/castor-.com/logs/stdout.log
· 申请建数据库表工单
· 修改项目配置文件
问题一
CAS /ac/getAuth请求404
现象:前端页面一直刷,登录成功 有生成cookie,但每次生成的cookie都不一样。登录成功后重定向auth接口一直失败。
后端一直报 o.j.c.client.proxy.ProxyGrantingTicketStorageImpl - No Proxy Ticket found for []
原因: nginx少了配置ac转发信息
问题二
/ac/getAuth 使用postman请求是ok的,但是浏览器请求308
原因:
/ac/getAuth是https请求,我们的系统是http请求。 我们没有申请http请求重定向到https请求,解析失败。
postman默认可以重定向。
解决方法:
前后端请求配置都改成https
或者nginx配置中允许http请求重定向到https请求
问题三
部署后端 shell 命令中scp 源文件为空
原因:
打包失败,需关注打包的问题
问题四
jenkins无权限拉代码
解决方法:
问题六
申请线上建数据库表时,提示有不规范字段
表字段不要使用:像name type desc method database host level 等。
问题七:beta部署申请域名的同时还要申请nginx,需要运维帮配置nginx,前端静态文件需部署要nginx服务器上
问题八
mvn clean install -Ptest -Dmaven.test.skip=true
-Ptest 没有加载对应的配置文件
解决:
pom.xml中配置
<build>
<finalName>castor..com</finalName>
<resources>
<resource>
<directory>src/main/resources</directory>
<filtering>true</filtering>
</resource>
<resource>
<directory>src/main/java</directory>
<includes>
<include>**/*.xml</include>
</includes>
</resource>
<resource>
<directory>src/main/resources</directory>
<includes>
<include>**/*</include>
</includes>
</resource>
</resources>
<plugins>
<!-- spring-boot-maven-plugin (提供了直接运行项目的插件:如果是通过parent方式继承spring-boot-starter-parent则不用此插件) -->
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<executions>
<execution>
<goals>
<goal>repackage</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
<profiles>
<profile>
<id>dev</id>
<properties>
<env>dev</env>
</properties>
</profile>
<profile>
<id>prod</id>
<properties>
<env>prod</env>
</properties>
</profile>
<profile>
<id>test</id>
<properties>
<env>test</env>
</properties>
</profile>
</profiles>
application.yml
spring:
# 环境 dev|prod
profiles:
active: '@env@' //不加单引号 本地跑不起来
本地执行需配置dev
单元测试时添加
@ActiveProfiles(profiles = “dev”)
问题九
原因:pom.xml中配置
<build>
<finalName>castor.**.com</finalName>
</build>
部署脚本
#! /bin/sh
RATEL_PROCESS_STR=`ps -ef | grep 'ratel-0.0.1-SNAPSHOT.jar' | grep -v grep`
PROCESS_ARRAY=(${RATEL_PROCESS_STR})
PROCESS_ID=${PROCESS_ARRAY[1]}
echo "0:"${PROCESS_ARRAY[0]}
echo "1:"${PROCESS_ARRAY[1]}
if [ -n "$JDATASERVICE_PROCESS_ID" ]; then
echo "PID: "$PROCESS_ID
kill -9 $PROCESS_ID
sleep 15
echo "shutdown ratel success."
else
echo "ratel is not run."
fi
nohup java -server -Xmx2g -Xms2g -Xmn1g -XX:MetaspaceSize=512m -XX:MaxMetaspaceSize=512m -XX:NativeMemoryTracking=detail -XX:+UseConcMarkSweepGC -XX:+HeapDumpOnOutOfMemoryError -verbose:gc -XX:+PrintGCDateStamps -XX:+PrintGCDetails -XX:+PrintGCApplicationStoppedTime -XX:+PrintGCApplicationConcurrentTime -XX:+PrintGC -Xloggc:/apps/home/rd/deploy/logs/ratel/ratel_gc.log -XX:HeapDumpPath=/apps/home/rd/deploy/logs/ratel/dump/ -Dcom.sun.xml.bind.v2.bytecode.ClassTailor.noOptimize=true -Dsun.zip.disableMemoryMapping=true -jar -Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=5006 ratel-0.0.1-SNAPSHOT.jar --spring.profiles.active=prod &
tail -f "./logs/ratel.log"
JVM参数
-Xmx 分配给应用程序的最大JVM堆内存,默认是物理内存的1/4
-Xms 分配给应用程序的最小JVM堆内存,默认是物理内存的1/64
默认空余堆内存小于40%时,JVM就会增大堆直到-Xmx的最大限制;空余堆内存大于70%时,JVM会减少堆直到 -Xms的最小限制。
因此服务器一般设置-Xms、-Xmx相等以避免在每次GC 后调整堆的大小。对象的堆内存由称为垃圾回收器的自动内存管理系统回收。
-Xmn2G:设置年轻代大小为2G。JVM会从本地内存中分配相当大的一块以维护其元数据(metadata),应用代码,JIT生成的代码,以及内部数据结构等等。为了维护加载类的元数据,JVM使用了一个专门的非堆区域,该区域称为元空间。
-XX:MetaspaceSize:主要控制matesaceGC发生的初始阈值,也就是最小阈值。也就是说当使用的matespace空间到达了元空间大小的时候,就会触发元空间的GC。
默认情况下,对应一个64位的服务端JVM来说,其默认的-XX:MetaspaceSize值为21MB
MaxMetaspaceSize表示的是保证committed的内存不会超过这个值,一旦超过这个值就会触发GC。最重要的内存数据区域之一是JVM的栈,每一条线程都有一个独立维护的栈。栈保存本地变量和部分的结果,扮演方法调用的重要角色。
-XX:NativeMemoryTracking=detail:使得可以本地内存追踪。off|summary|detail。默认地,NMT是关闭的
-XX:+UseConcMarkSweepGC:CMS为基于标记清除算法实现的多线程老年代垃圾回收器。CMS为响应时间优先的垃圾回收器,适合于应用服务器,如网络游戏,电商等和电信领域的应用。
为了实现这个目的,与其他垃圾回收器不同的是,CMS是与应用程序并发执行的,即在CMS对老年代进行垃圾回收时,应用程序大部分时间里是可以继续执行的,应用程序只需进行非常短暂的停顿。由于与应用程序并发执行,同一时刻同时存在垃圾回收线程和应用线程,故对服务器的CPU消耗较大,需要保证服务器CPU资源充足。
-XX:HeapDumpOnOutOfMemoryError
通过jvm参数-XX:+HeapDumpOnOutOfMemoryError可以让JVM在出现内存溢出时候Dump出当前的内存转储快照。快照格式为java_pid2821.hprof(2821为Java进程号)
参数设置:
-XX:+HeapDumpOnOutOfMemoryError :当内存溢出时触发java.lang.OutOfMemo: Java heap space
-XX:HeapDumpPath=/opt/heap·: 内存溢出时,保存内存快照文件
-verbose:gc //在控制台输出GC情况
-XX:+PrintGCDateStamps:
GC的打印基于日期的时间戳
-XX:+PrintGCDetails:打印详细信息
-XX:+PrintGCApplicationStoppedTime -XX:+PrintGCApplicationConcurrentTime -XX:+PrintGC
-Xloggc:/apps/home/rd/deploy/logs/ratel/ratel_gc.log
-Dcom.sun.xml.bind.v2.bytecode.ClassTailor.noOptimize: -verbose:class 可以看到加载了那些类 推荐 将 结果 保存到文件,然后分析
但是你会发现 有些类名 被压缩了,根本看不出来,此时,你需要再加上一个参数
-Dcom.sun.xml.bind.v2.bytecode.ClassTailor.noOptimize= true
此命令也可以表示直接关闭bytecode反射机制,加上jvm参数后,可以继续运行程序,看一下到底是加载了那些类
-Xdebug 远程断点调试 ,-Xdebug是通知JVM工作在DEBUG模式下
-Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=5006 -Xrunjdwp是通知JVM使用(java debug wire protocol)来运行调试环境
transport是监听Socket端口连接方式(也可以dt_shmem共享内存方式,但限于windows机器,并且服务提供端和调试端只能位于同一台机)。
server=y表示当前是调试服务端,=n表示当前是调试客户端。
suspend=n表示启动时不中断(如果启动时中断,一般用于调试启动不了的问题)。address=8000表示本地监听8000端口
–spring.profiles.active=prod 指定配置文件