精华内容
下载资源
问答
  • 一、整体架构上线系统的整体结构如下图 整体架构主要涉及5部分系统1、GitGit版本管理库用于存放上线系统的 CM工程(Configuration Management,配置管理工程,后续会详细介绍)以及需要部署的业务系统。2、Jenkins执行...

    这篇文章描述的系统,是由质量保障部宋伟达设计并实施。感谢伟达的支持!

    整个系统以在tomcat部署web应用为例,部署其他可执行Java程序过程类似。

    一、整体架构

    上线系统的整体结构如下图

    4c1836f444da44126b6abaa601712c7d.png

    整体架构主要涉及5部分系统

    1、Git

    Git版本管理库用于存放上线系统的 CM工程(Configuration Management,配置管理工程,后续会详细介绍)以及需要部署的业务系统。

    2、Jenkins

    执行代码编译、打包、部署代码等任务

    3、Nexus

    Maven数据仓库,用于Jenkins下载依赖包以及存放编译代码生成的jar包(java)

    4、Business Server

    用于部署业务系统的服务器(含Tomcat等java容器)

    5、Nginx

    业务系统的负载均衡。部署重启业务系统时,需要先通过Nginx把该服务流量切走;重启成功后,再将流量切回来。

    二、核心流程

    下图是自动化上线系统核心流程

    8a6ecaa443d188ab100ab043f7f36528.png

    1、Jenkins拉取CM工程。

    (1)系统上线人员在Jenkins中执行上线操作,将上线脚本script和上线系统配置信息configurations从Git中拉取到Jenkins的上线Job。

    (2)Jenkins Job根据job_name(对应上线哪个业务系统)确定对应配置信息 configuration

    (3)载入配置信息configuration

    (4)执行部署脚本script中的Deploy.sh

    2、预处理业务系统代码(由Deploy.sh文件描述处理流程)

    (1)将业务系统代码克隆岛Jenkins所在服务器(集群模式为某个slave节点)。git clone -b

    (2)执行Maven打包。maven package -P ……

    (3)如果是正式发布版本,执行打tag。(建议 发验收环境也打tag,用来发部线上系统;线上环境也打tag用来回滚)

    3、与Maven仓库交互

    在第2步(上一步)执行过程中,会涉及到下载依赖jar包,或者上传上线工程中编译产生的jar包的操作。

    4、同步部署代码(jar包)

    (全量部署和增量部署的问题)

    (1)将第2步中生成的jar包、war包等同步到应用部署服务器(Business Server),其中包含deploy_tomcat.sh项目实际部署脚本。

    (2)(Jenkins Job所在服务器的deploy.sh脚本)通过ssh方式,连接到应用部署服务器(Business Server),执行deploy_tomcat.sh脚本,开始部署应用系统。

    如果是集群,重复4、5、6步,直到部署完所有节点。也可以部署一部分节点,实现灰度上线。

    5、本地部署

    (1)找到tomcat的pid,执行shutdown.sh。(如果要优雅关闭,可在这个环节进行必要处理)

    (2)将待部署的代码(war,jar)复制到tomcat对应目录。

    (3)启动tomcat(应用系统)

    (4)检查服务是否成功。(访问某个指定地址,返回200成功,否则失败)

    (5)通知Jenkins Job部署结果(成功或失败),通过ssh方式返回,含日志(实时日志)

    6、切换流量

    如果需要,通过修改nginx配置,将执行部署的Business Server的访问流量切走。

    三、重点模块

    1、CM工程

    CM(Configuration Management )工程是整个自动化上线系统的核心,主要包括两个部分。

    (1)script

    script是执行自动化上线功能的脚本,核心内容是通过maven打包需要部署的工程,然后执行部署操作。具体脚本为deploy.sh和deploy_tomcat.sh(以在tomcat部署web应用为例)

    (2)configurations

    configurations是需要自动化上线的业务系统的上线配置信息(有几个需要自动化上线的系统,就有几分对应的数据)。

    具体内容包括项目个性化配置信息,以及差分配置规则等(根据实际项目可以有更多的配置信息。类似差分配置一般要求源代码按照一定的规则存放,所有项目可以统一处理)

    普通程序员

    长按关注

    微信ID:farmerbrag

    展开全文
  • 对于搞开发的我们其实也是一样,现在流行的框架越来越多,封装的也越来越完善,各种框架可以搞定一切,几乎不用关注底层的实现,初级程序员只要熟悉基本的使用方法,便可以快速的开发上线;但对于高级程序员来讲,...
  • JVM知识点总览-中高级Java工程师面试必备    对于搞开发的我们其实也是一样,现在流行的框架越来越多,封装的也越来越完善,各种框架可以搞定一切,几乎不用关注底层的实现,初级程序员只要熟悉基本的使用方法...

    JVM知识点总览-中高级Java工程师面试必备

       

        对于搞开发的我们其实也是一样,现在流行的框架越来越多,封装的也越来越完善,各种框架可以搞定一切,几乎不用关注底层的实现,初级程序员只要熟悉基本的使用方法,便可以快速的开发上线;但对于高级程序员来讲,内功的修炼却越发的重要,比如算法、设计模式、底层原理等,只有把这些基础熟练之后,才能在开发过程中知其然知其所以然,出现问题时能快速定位到问题的本质。
        对于Java程序员来讲,spring全家桶几乎可以搞定一切,spring全家桶便是精妙的招式,jvm就是内功心法很重要的一块,线上出现性能问题,jvm调优更是不可回避的问题。因此JVM基础知识对于高级程序员的重要性不必言语.
        一.jvm体系总体分四大块:
            1.类的加载机制
            2.jvm内存结构
            3.GC算法 垃圾回收
            4.GC分析 命令调优
        二.类的加载机制
            1.什么是类的加载
            2.类的生命周期
            3.类加载器
            4.双亲委派模型
        三.什么是类的加载
            类的加载指的是将类的.class文件中的二进制数据读入到内存中,将其放在运行时数据区的方法区内,然后在堆区创建一个java.lang.Class对象,用来封装类在方法区内的数据结构。类的加载的最终产品是位于堆区中的Class对象,Class对象封装了类在方法区内的数据结构,并且向Java程序员提供了访问方法区内的数据结构的接口。
        四.类的生命周期
            1.加载,查找并加载类的二进制数据,在Java堆中也创建一个java.lang.Class类的对象
            2.连接,连接又包含三块内容:验证、准备、初始化。1)验证,文件格式、元数据、字节码、符号引用验证;2)准备,为类的静态变量分配内存,并将其初始化为默认值;3)解析,把类中的符号引用转换为直接引用
            3.初始化,为类的静态变量赋予正确的初始值
            4.使用,new出对象程序中使用
            5.卸载,执行垃圾回收
        五.类加载器
            1.启动类加载器:Bootstrap ClassLoader,负责加载存放在JDK\jre\lib(JDK代表JDK的安装目录,下同)下,或被-Xbootclasspath参数指定的路径中的,并且能被虚拟机识别的类库
            2.扩展类加载器:Extension ClassLoader,该加载器由sun.misc.Launcher$ExtClassLoader实现,它负责加载DK\jre\lib\ext目录中,或者由java.ext.dirs系统变量指定的路径中的所有类库(如javax.*开头的类),开发者可以直接使用扩展类加载器。
            3.应用程序类加载器:Application ClassLoader,该类加载器由sun.misc.Launcher$AppClassLoader来实现,它负责加载用户类路径(ClassPath)所指定的类,开发者可以直接使用该类加载器
        六.类加载机制
            1.全盘负责,当一个类加载器负责加载某个Class时,该Class所依赖的和引用的其他Class也将由该类加载器负责载入,除非显示使用另外一个类加载器来载入
            2.父类委托,先让父类加载器试图加载该类,只有在父类加载器无法加载该类时才尝试从自己的类路径中加载该类
            3.缓存机制,缓存机制将会保证所有加载过的Class都会被缓存,当程序中需要使用某个Class时,类加载器先从缓存区寻找该Class,只有缓存区不存在,系统才会读取该类对应的二进制数据,并将其转换成Class对象,存入缓存区。这就是为什么修改了Class后,必须重启JVM,程序的修改才会生效
        七.jvm内存结构
            1.方法区和对是所有线程共享的内存区域;而java栈、本地方法栈和程序员计数器是运行是线程私有的内存区域。
            2.Java堆(Heap),是Java虚拟机所管理的内存中最大的一块。Java堆是被所有线程共享的一块内存区域,在虚拟机启动时创建。此内存区域的唯一目的就是存放对象实例,几乎所有的对象实例都在这里分配内存。
            3.方法区(Method Area),方法区(Method Area)与Java堆一样,是各个线程共享的内存区域,它用于存储已被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等数据。
            4.程序计数器(Program Counter Register),程序计数器(Program Counter Register)是一块较小的内存空间,它的作用可以看做是当前线程所执行的字节码的行号指示器。
            5.JVM栈(JVM Stacks),与程序计数器一样,Java虚拟机栈(Java Virtual Machine Stacks)也是线程私有的,它的生命周期与线程相同。虚拟机栈描述的是Java方法执行的内存模型:每个方法被执行的时候都会同时创建一个栈帧(Stack Frame)用于存储局部变量表、操作栈、动态链接、方法出口等信息。每一个方法被调用直至执行完成的过程,就对应着一个栈帧在虚拟机栈中从入栈到出栈的过程。
            6.本地方法栈(Native Method Stacks),本地方法栈(Native Method Stacks)与虚拟机栈所发挥的作用是非常相似的,其区别不过是虚拟机栈为虚拟机执行Java方法(也就是字节码)服务,而本地方法栈则是为虚拟机使用到的Native方法服务。
        八.对象分配规则
            1.对象优先分配在Eden区,如果Eden区没有足够的空间时,虚拟机执行一次Minor GC。
            2.大对象直接进入老年代(大对象是指需要大量连续内存空间的对象)。这样做的目的是避免在Eden区和两个Survivor区之间发生大量的内存拷贝(新生代采用复制算法收集内存)。
            3.长期存活的对象进入老年代。虚拟机为每个对象定义了一个年龄计数器,如果对象经过了1次Minor GC那么对象会进入Survivor区,之后每经过一次Minor GC那么对象的年龄加1,知道达到阀值对象进入老年区。
            4.动态判断对象的年龄。如果Survivor区中相同年龄的所有对象大小的总和大于Survivor空间的一半,年龄大于或等于该年龄的对象可以直接进入老年代。
            5.空间分配担保。每次进行Minor GC时,JVM会计算Survivor区移至老年区的对象的平均大小,如果这个值大于老年区的剩余值大小则进行一次Full GC,如果小于检查HandlePromotionFailure设置,如果true则只进行Monitor GC,如果false则进行Full GC。
        九.GC算法
        GC最基础的算法有三种:标记 -清除算法、复制算法、标记-压缩算法,我们常用的垃圾回收器一般都采用分代收集算法。
            1.标记 -清除算法,“标记-清除”(Mark-Sweep)算法,如它的名字一样,算法分为“标记”和“清除”两个阶段:首先标记出所有需要回收的对象,在标记完成后统一回收掉所有被标记的对象。
            2.复制算法,“复制”(Copying)的收集算法,它将可用内存按容量划分为大小相等的两块,每次只使用其中的一块。当这一块的内存用完了,就将还存活着的对象复制到另外一块上面,然后再把已使用过的内存空间一次清理掉。
            3.标记-压缩算法,标记过程仍然与“标记-清除”算法一样,但后续步骤不是直接对可回收对象进行清理,而是让所有存活的对象都向一端移动,然后直接清理掉端边界以外的内存
            4.分代收集算法,“分代收集”(Generational Collection)算法,把Java堆分为新生代和老年代,这样就可以根据各个年代的特点采用最适当的收集算法。
        十.垃圾回收器
            1.Serial收集器,串行收集器是最古老,最稳定以及效率高的收集器,可能会产生较长的停顿,只使用一个线程去回收。
            2.ParNew收集器,ParNew收集器其实就是Serial收集器的多线程版本。
            3.Parallel收集器,Parallel Scavenge收集器类似ParNew收集器,Parallel收集器更关注系统的吞吐量。
            4.Parallel Old 收集器,Parallel Old是Parallel Scavenge收集器的老年代版本,使用多线程和“标记-整理”算法
            5.CMS收集器,CMS(Concurrent Mark Sweep)收集器是一种以获取最短回收停顿时间为目标的收集器。
            6.G1收集器,G1 (Garbage-First)是一款面向服务器的垃圾收集器,主要针对配备多颗处理器及大容量内存的机器. 以极高概率满足GC停顿时间要求的同时,还具备高吞吐量性能特征
            7.GC算法和垃圾回收器算法图解以及更详细内容参考JVM(3):Java GC算法 垃圾收集器
        十一.GC日志分析
            摘录GC日志一部分(前部分为年轻代gc回收;后部分为full gc回收):
            2016-07-05T10:43:18.093+0800: 25.395: [GC [PSYoungGen: 274931K->10738K(274944K)] 371093K->147186K(450048K), 0.0668480 secs] [Times: user=0.17 sys=0.08, real=0.07 secs]
            2016-07-05T10:43:18.160+0800: 25.462: [Full GC [PSYoungGen: 10738K->0K(274944K)] [ParOldGen: 136447K->140379K(302592K)] 147186K->140379K(577536K) [PSPermGen: 85411K->85376K(171008K)], 0.6763541 secs] [Times: user=1.75 sys=0.02, real=0.68 secs]
            通过上面日志分析得出,PSYoungGen、ParOldGen、PSPermGen属于Parallel收集器。其中PSYoungGen表示gc回收前后年轻代的内存变化;ParOldGen表示gc回收前后老年代的内存变化;PSPermGen表示gc回收前后永久区的内存变化。young gc 主要是针对年轻代进行内存回收比较频繁,耗时短;full gc 会对整个堆内存进行回城,耗时长,因此一般尽量减少full gc的次数
        十二.调优命令
        Sun JDK监控和故障处理命令有jps jstat jmap jhat jstack jinfo
            1.jps,JVM Process Status Tool,显示指定系统内所有的HotSpot虚拟机进程。
            2.jstat,JVM statistics Monitoring是用于监视虚拟机运行时状态信息的命令,它可以显示出虚拟机进程中的类装载、内存、垃圾收集、JIT编译等运行数据。
            3.jmap,JVM Memory Map命令用于生成heap dump文件
            4.jhat,JVM Heap Analysis Tool命令是与jmap搭配使用,用来分析jmap生成的dump,jhat内置了一个微型的HTTP/HTML服务器,生成dump的分析结果后,可以在浏览器中查看
            5.jstack,用于生成java虚拟机当前时刻的线程快照。
            6.jinfo,JVM Configuration info 这个命令作用是实时查看和调整虚拟机运行参数。
            详细的命令使用参考这里JVM(4):Jvm调优-命令篇
        十三.调优工具
        常用调优工具分为两类,jdk自带监控工具:jconsole和jvisualvm,第三方有:MAT(Memory Analyzer Tool)、GChisto。
            1.jconsole,Java Monitoring and Management Console是从java5开始,在JDK中自带的java监控和管理控制台,用于对JVM中内存,线程和类等的监控
            2.jvisualvm,jdk自带全能工具,可以分析内存快照、线程快照;监控内存变化、GC变化等。
            3.MAT,Memory Analyzer Tool,一个基于Eclipse的内存分析工具,是一个快速、功能丰富的Java heap分析工具,它可以帮助我们查找内存泄漏和减少内存消耗
            4.GChisto,一款专业分析gc日志的工具

    展开全文
  • Java工程构建工具ANT与Maven的区别

    千次阅读 2016-04-15 17:07:27
    Ant与Maven也许几乎所有的程序员在程序开发过程中都遇到过,在我的工作过程中ant和maven都用到过,在这里说一下个人感受。 第一家公司开发业务代码,最后打war包采用了ant+hudson的持续集成方式,ant脚本当时也是...

    Ant与Maven也许几乎所有的程序员在程序开发过程中都遇到过,在我的工作过程中ant和maven都用到过,在这里说一下个人感受。

    第一家公司开发业务代码,最后打war包采用了ant+hudson的持续集成方式,ant脚本当时也是由我一个人编写的,也是我刚入职最早的工作,当时项目组开发工程的依赖库都放在了svn上,svn上各种分支,因为开发的版本都是按省份来区分的。每次上线一个省份版本就需要新建一个build.xml脚本。当时我们用ant主要目的是为了编译与打包,在编写ant的打包脚本时,给人感觉就像编写shell脚本,设置变量(<property>),创建(<mkdir>),删除(<delete>)目录等,编写task(<target>),每个task还要用顺序,弄明白相互的依赖。每次如果有新的改动,需要重新修改build.xml脚本。编写完脚本配置到Hudson上,就可以打包了,运维人员直接在服务器拿war包即可。在这个过程中发现,这个脚本如果很复杂的话,需要有专门的人来维护,我当时的项目组估计只有我自己能比较熟练的修改这个脚本,这就造成后续维护人员的维护成本。

    第二家公司完全采用maven的管理方式,给我的感觉就是整个项目变的清晰,已于管理,尤其是jar包的依赖,通过nexus私服管理所有的jar包,以及自己的jar包上传以及版本升级更易于理解,之前用ant没有jar包升级的概念,采用全量打包,所有jar包全部依赖,使得war包体量很大,用maven管理dependency相关的jar包一目了然。再一个打包更方便了,只需要输入命令mvn package -P即可,区分了测试环境,线上环境。

    总之,约定大于开发是开发走上容易管理的道路,更容易控制整个项目的管理。我认为开发更倾向于maven构建工程。

    展开全文
  • 对于搞开发的我们其实也是一样,现在流行的框架越来越多,封装的也越来越完善,各种框架可以搞定一切,几乎不用关注底层的实现,初级程序员只要熟悉基本的使用方法,便可以快速的开发上线;但对于高级程序员来讲,...

    对于搞开发的我们其实也是一样,现在流行的框架越来越多,封装的也越来越完善,各种框架可以搞定一切,几乎不用关注底层的实现,初级程序员只要熟悉基本的使用方法,便可以快速的开发上线;但对于高级程序员来讲,内功的修炼却越发的重要,比如算法、设计模式、底层原理等,只有把这些基础熟练之后,才能在开发过程中知其然知其所以然,出现问题时能快速定位到问题的本质。
    工作多少年了,还在传统公司写if / for 等简单的代码?那你就真的要被社会淘汰了,工作多年其实你与初级工程师又有多少区别呢?那么作为一个高级Java攻城狮需要突破哪些知识点呢?
    在这里插入图片描述
    类的生命周期
    1.加载,查找并加载类的二进制数据,在Java堆中也创建一个java.lang.Class类的对象
    2.连接,连接又包含三块内容:验证、准备、初始化。
    1)验证,文件格式、元数据、字节码、符号引用验证;
    2)准备,为类的静态变量分配内存,并将其初始化为默认值;
    3)解析,把类中的符号引用转换为直接引用
    3.初始化,为类的静态变量赋予正确的初始值
    4.使用,new出对象程序中使用
    5.卸载,执行垃圾回收
    集合常用方法:
    List:
    add(Object obj)、remove(Object obj)、remove(int index)、size()、get(int index)、iterator()、clear()
    Set:
    add(Object obj)、remove(Object obj)、size()、iterator()、clear()、没有get方法
    Map:
    put(Object key, Object value)、get(Object key)、keySet()、values()、size()、remove(Object key) 、clear()
    流的分类
    根据方向分类:
    输入:InputStream、Reader
    输出:OutputStream、Writer
    根据流操作的数据单位分类:
    字节流:InputStream、OutputStream
    字符流:Reader、Writer
    进程和线程的区别
    计算机中一个正在运行的可执行程序的实例就是进程。一个进程可以包含多个线程。单个线程用于完成一个任务,而同时创建多个线程来完成多项任务,便是多线程。
    二者都定义了某种边界,不同的是进程定义的是应用程序与应用程序之间的边界,不同的进程之间不能共享代码和数据空间,而线程定义的是代码执行堆栈和执行上下文的边界。
    用一个比喻来说,如果一个家庭代表一个进程,在家庭内部,各个成员就是线程,家庭中的每个成员都有义务对家庭的财富进行积累,同时也有权利对家庭财富进行消费,当面对一个任务的时候,家庭也可以派出几个成员来协同完成,而家庭之外的人则没有办法直接消费不属于自己家庭的财产。
    调优工具
    常用调优工具分为两类,jdk自带监控工具:jconsole和jvisualvm,第三方有:MAT(Memory Analyzer Tool)、GChisto。
    1.jconsole,Java Monitoring and Management Console是从java5开始,在JDK中自带的java监控和管理控制台,用于对JVM中内存,线程和类等的监控
    2.jvisualvm,jdk自带全能工具,可以分析内存快照、线程快照;监控内存变化、GC变化等。
    3.MAT,Memory Analyzer Tool,一个基于Eclipse的内存分析工具,是一个快速、功能丰富的Java heap分析工具,它可以帮助我们查找内存泄漏和减少内存消耗
    4.GChisto,一款专业分析gc日志的工具

    展开全文
  • 初步了解Java面试过程 嗨喽呀,我是初级Java工程师,大家可以叫我小红。这是我第一次写博客,请大家多多指教;下面分享的是自己总结的面试过程,希望可以帮到那些即将出来找工作的小伙伴,那么废话不多说。 进入面试...
  • 有的企业都会先笔试后面试(笔试不过可能就没面试的机会了),有的还会直接面试(本人经历的还是直接面试的多一些)。...在工作的和自我学习的过程中对Java基础知识和前端知识以及一些前后端框架进行技术知...
  • 只因少写一个判空,我的代码上线后炸了! 以后要是再写for循环,我就捶自己 什么?你项目还在用Date表示时间?! 面试官:为什么要重写hashcode和equals方法? 这才是学编程要懂的基础! 真有小伙伴不知道浮点数如何...
  • 为了让代码开发之后,提升测试、部署上线的效率,需要将代码编译、部署过程自动化。这里先介绍怎样使用javac自动化编译java代码。因为项目目前暂未使用ant、maven等管理构建,所以需要使用比较原始的javac来实现,很...
  • 【需求描述】为了让代码开发之后,提升测试、部署上线的效率,需要将代码编译、部署过程自动化。这里先介绍怎样使用javac自动化编译java代码。因为项目目前暂未使用ant、maven等管理构建,所以需要使用比较原始的...
  • 【需求描述】为了让代码开发之后,提升测试、部署上线的效率,需要将代码编译、部署过程自动化。这里先介绍怎样使用javac自动化编译java代码。因为项目目前暂未使用ant、maven等管理构建,所以需要使用比较原始的...
  • Java作为一门名副其实的工业级语言,语法友好,学习简单,大规模的应用给代码质量的管控带来了困难,特别是团队开发中,开发过程中的规范会直接影响最终项目的稳定性。 善医者“未有形而除之”,提高工程健壮性最好...
  • SpringBoot目的是简化工程的操作配置过程,给开发人员留更多的精力提供业务功能。可以方便快速的搭建工程,非常适合构建微服务。 二、软件安装 1)下载JDK包,并配置系统环境变量。 JAVA_HOME=%安装路径% Path=%...
  • Jenkins 摘要:jenkins 持续集成 docker springboot maven conding.net 定义:Jenkins是一个开源软件项目,是基于Java开发的一种...个人理解:一个项目从开发到上线基本都必需要经历以下过程:编码-&gt;编译-&...
  • JDBC【PreparedStatment、批处理、处理二进制、自动主键、调用存储过程、函数】 JDBC【事务、元数据、改造JDBC工具类】 JDBC【数据库连接池、DbUtils框架、分页】 JDBC面试题都在这里 Druid数据库连接池就是这么简单...

空空如也

空空如也

1 2 3 4 5
收藏数 83
精华内容 33
关键字:

java工程上线过程

java 订阅