maven项目发布到服务器

目录 一、平滑发布与灰度发布 1、 什么叫平滑 2、什么叫灰度 3、单台服务器的平滑发布模式 4、多台服务器平滑发布模式 二、蓝绿发布、灰度发布和滚动发布 1.蓝绿发布 2.灰度发布 3.滚动发布 三、Nexus3 搭建 maven 私服 1.Nexus3 简介 2.安装 maven 1、下载 maven 2、解压安装 3、安装 java 环境 4、添加环境变量 5、验证 java 和

目录

一、平滑发布与灰度发布

1、 什么叫平滑

2、什么叫灰度

3、单台服务器的平滑发布模式

4、多台服务器平滑发布模式

二、蓝绿发布、灰度发布和滚动发布

1.蓝绿发布

2.灰度发布

3.滚动发布

三、Nexus3 搭建 maven 私服

1.Nexus3 简介

2.安装 maven

1、下载 maven

2、解压安装

3、安装 java 环境

4、添加环境变量

5、验证 java 和 maven 安装

3.安装 nexus3

1、下载

2、解压

3、启动

4、仓库介绍​编辑

5、向 nexus3 私服上传 jar 包


一、平滑发布与灰度发布

1、 什么叫平滑

在发布的过程中不影响用户的使用,系统不会因发布而暂停对外服务,不会造成用户短暂性无法访问;

2、什么叫灰度

发布后让部分用户使用新版本,其它用户使用旧版本,逐步扩大影响范围,最终达到全部更新的发布方式 ;

灰度发布与平滑发布其实是关联的。当服务器的数量只有一台的时候,不存在灰度发布,一旦发布了就是所有用户都更新了,所以这个时候只有平滑发布。当服务器数量大于一台的时候,只要每台服务器都能达到平滑发布的方式,然后设定好需要发布的服务器占比数量,就可以实现灰度发布了。

3、单台服务器的平滑发布模式

单机状态下,应用的持续服务主要依靠Nginx的负载均衡及自动切换功能;为了能够切换应用,需要在服务器中创建两个相同的独立应用,分配两个不同的端口,例如:

app1,端口 801
app2,端口 802
在 Nginx 中,将 app1,app2 作为负载均衡加载:
upstream myapp{

          server 127.0.0.1:801; # app1

          server 127.0.0.1:802; # app2

    }

   # 然后设置代理超时为1秒,以便在某个应用停止时及时切换到另一个应用:

server {
    listen 80;
    server_name localhost;
    location /{
    proxy_pass http://myapp;
    proxy_set_header Host $host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_connect_timeout       1;
    proxy_read_timeout          1;
    proxy_send_timeout          1;

    }

}
    # 以上内容写在单独的配置文件中:/vhost/pub/pub_app.conf
    # 在nginx.conf里包含进去:
    # include /vhost/*.conf;

现在系统会均衡地分配用户访问 app1 与 app2

接下来我们进行平滑发布,我们先把app1停止,然后将新版本发布到app1中

1、 准备发布 app1 配置文件

# 新做一个配置文件 pub_app1_down.conf,内容中把 app1 停止掉:
    upstream myapp{
          server 127.0.0.1:801 down; //app1
          server 127.0.0.1:802; //app2
    }

# 将这个文件内容覆盖掉在原有的pub_app.conf
[root@qfedu.com ~]# cp -f /vhost/pub/pub_app1_down.conf /vhost/pub_app.conf

2、停止 app1 应用

# 平滑重新加载一下 nginx:
[root@qfedu.com ~]# service nginx reload
    或者:
[root@qfedu.com ~]# /usr/local/nginx/sbin/nginx -s reload
# 此时所有的请求都转到了app2了;

3、更新 app1

# 现在可以通过各种方式来更新应用了,例如:压缩包方式:

[root@qfedu.com ~]# wget http://version.my.com/appudate/myapp/myapp-v3.2.32.tar
[root@qfedu.com ~]# unzip -o -d /home/wwwroot/app1/ myapp-v3.2.32.tar
# 其中:-o:不提示的情况下覆盖文件;-d:指定解压目录
# 步骤3.5 内部测试
# 如果需要的话,可以在这一步对 app1 进行内部测试,以确保应用的正确性;

4、准备发布 app2 配置文件

# 此时app1已经是最新版本的文件了,可以切换到app1来对外,
# 创建一个新的nginx配置文件:pub_app2_down.conf,设置为app1对外,app2停止即可:   
    upstream myapp{
          server 127.0.0.1:801;      # app1
          server 127.0.0.1:802 down; # app2
    }
# 将这个文件内容覆盖掉在原有的 pub_app.conf
[root@qfedu.com ~]# cp -f /vhost/pub/pub_app2_down.conf /vhost/pub_app.conf

5、切换到 app1 新版本应用

# 平滑重启一下nginx:
[root@qfedu.com ~]# service nginx reload
 或者:
[root@qfedu.com ~]# /usr/local/nginx/sbin/nginx -s reload
# 此时所有的请求都转到了app1了,新版本开始运行;

6、更新 app2

7、恢复 app1,app2 同时对外

[root@qfedu.com ~]# cp -f /vhost/pub/pub_app.conf /vhost/pub_app.conf
# 平滑重新一下nginx:
[root@qfedu.com ~]# service nginx reload
    或者:
[root@qfedu.com ~]# /usr/local/nginx/sbin/nginx -s reload
至此,整个应用都已经更新

8、 将各步骤中的脚本汇总如下

[pub.sh]
#============ 平滑发布 v1.0 ===============
#step 1
cp -f /vhost/pub/pub_app1_down.conf /vhost/pub_app.conf    
#step 2
systemctl reload nginx    
#step 3
wget http://version.my.com/appudate/myapp/myapp-v3.2.32.tar
unzip -o -d /home/wwwroot/app1/ myapp-v3.2.32.tar   
#step 4
cp -f /vhost/pub/pub_app2_down.conf /vhost/pub_app.conf   
#step 5
systemctl reload nginx     
#step 6
unzip -o -d /home/wwwroot/app2/ myapp-v3.2.32.tar
#step 7
cp -f /vhost/pub/pub_app.conf /vhost/pub_app.conf
service nginx reload

#============ 平滑发布 v1.0  ===============    
# 备注:也可以充分利用 nginx 的宕机检测,省去步骤1,2,4,5,7;
# 简化后的脚本如下:
[pub_mini.sh]
#======== 简化版脚本 =============
wget http://version.my.com/appudate/myapp/myapp-v3.2.32.tar
unzip -o -d /home/wwwroot/app1/ myapp-v3.2.32.tar
unzip -o -d /home/wwwroot/app2/ myapp-v3.2.32.tar
#========= over ===========

4、多台服务器平滑发布模式

有了单台平滑发布模式的基础,多台服务器就简单了。

每台服务器当作应用进行发布就可以了,由于nginx有宕机自动检测功能

只需要在每台服务器上先停止发布,然后更新文件,再启动就可以了

如果选择部分的服务器进行更新,那就是灰度了。

二、蓝绿发布、灰度发布和滚动发布

1.蓝绿发布

项目逻辑上分为AB组,在项目系统时,首先把A组从负载均衡中摘除,进行新版本的部署。B组仍然继续提供服务。  

当A组升级完毕,负载均衡重新接入A组,再把B组从负载列表中摘除,进行新版本的部署。A组重新提供服务。  

 最后,B组也升级完成,负载均衡重新接入B组,此时,AB组版本都已经升级完成,并且都对外提供服务。

特点

  1. 如果出问题,影响范围较大;
  2. 发布策略简单;
  3. 用户无感知,平滑过渡;
  4. 升级/回滚速度快。

缺点

  1. 需要准备正常业务使用资源的两倍以上服务器,防止升级期间单组无法承载业务突发;
  2. 短时间内浪费一定资源成本;
  3. 基础设施无改动,增大升级稳定性。

2.灰度发布

灰度发布只升级部分服务,即让一部分用户继续用老版本,一部分用户开始用新版本,如果用户对新版本没什么意见,那么逐步扩大范围,把所有用户都迁移到新版本上面来。

特点

  1. 保证整体系统稳定性,在初始灰度的时候就可以发现、调整问题,影响范围可控;
  2. 新功能逐步评估性能,稳定性和健康状况,如果出问题影响范围很小,相对用户体验也少;
  3. 用户无感知,平滑过渡。

缺点

  1. 自动化要求高

部署过程

  1. 从LB摘掉灰度服务器,升级成功后再加入LB;
  2. 少量用户流量到新版本;
  3. 如果灰度服务器测试成功,升级剩余服务器。

灰度发布是通过切换线上并存版本之间的路由权重,逐步从一个版本切换为另一个版本的过程。

3.滚动发布

滚动发布是指每次只升级一个或多个服务,升级完成后加入生产环境,不断执行这个过程,直到集群中的全部旧版本升级新版本。 

 红色:正在更新的实例

蓝色:更新完成并加入集群的实例

绿色:正在运行的实例

特点

  1. 用户无感知,平滑过渡;
  2. 节约资源。

缺点

  1. 部署时间慢,取决于每阶段更新时间;
  2. 发布策略较复杂;
  3. 无法确定OK的环境,不易回滚。

部署过程

  1. 先升级1个副本,主要做部署验证;
  2. 每次升级副本,自动从LB上摘掉,升级成功后自动加入集群;
  3. 事先需要有自动更新策略,分为若干次,每次数量/百分比可配置;
  4. 回滚是发布的逆过程,先从LB摘掉新版本,再升级老版本,这个过程一般时间比较长;
  5. 自动化要求高。

注意:

三种方式均可以做到平滑式升级,在升级过程中服务仍然保持服务的连续性,升级对外界是无感知的。那生产上选择哪种部署方法最合适呢?这取决于哪种方法最适合你的业务和技术需求。如果你们运维自动化能力储备不够,肯定是越简单越好,建议蓝绿发布,如果业务对用户依赖很强,建议灰度发布。如果是K8S平台,滚动更新是现成的方案,建议先直接使用。

蓝绿发布:两套环境交替升级,旧版本保留一定时间便于回滚。

灰度发布:根据比例将老版本升级,例如80%用户访问是老版本,20%用户访问是新版本。

滚动发布:按批次停止老版本实例,启动新版本实例。

三、Nexus3 搭建 maven 私服

1.Nexus3 简介

Maven是一个采用纯Java编写的开源项目管理工具

Maven采用了一种被称之为Project Object Model(POM)概念来管理项目,所有的项目配置信息都被定义在一个叫做POM.xml的文件中,。

通过该文件Maven可以管理项目的整个生命周期,包括清除、编译,测试,报告、打包、部署等等。

目前Apache下绝大多数项目都已经采用Maven进行管理. 而Maven本身还支持多种插件, 可以方便更灵活的控制项目, 开发人员的主要任务应该是关注商业逻辑并去实现它, 而不是把时间浪费在学习如何在不同的环境中去依赖jar包,项目部署等。

maven和ant都是软件构建工具(软件管理工具),maven比ant更加强大,已经取代了ant,jar包的声明式依赖描述,maven有jar包的仓库。

Nexus3私服是架设在局域网的一种特殊的远程仓库,目的是代理远程仓库及部署第三方构件。有了私服之后,当 Maven 需要下载构件时,直接请求私服,私服上存在则下载到本地仓库;否则,私服请求外部的远程仓库,将构件下载到私服,再提供给本地仓库下载。

2.安装 maven

1、下载 maven

[root@qfedu.com ~]# wget http://mirrors.tuna.tsinghua.edu.cn/apache/maven/maven-3/3.6.3/binaries/apache-maven-3.6.3-bin.tar.gz

2、解压安装

[root@qfedu.com ~]# tar xf apache-maven-3.6.3-bin.tar.gz -C /usr/local/

[root@qfedu.com ~]# cd /usr/local/

[root@qfedu.com ~]# ln -s apache-maven-3.6.3/ maven

3、安装 java 环境

[root@qfedu.com ~]# tar xf jdk-8u201-linux-x64.tar.gz -C /usr/local/

[root@qfedu.com ~]# cd /usr/local/

[root@qfedu.com ~]# ln -s jdk1.8.0_251/ java

4、添加环境变量

[root@qfedu.com ~]# vim /etc/profile

在文件下方添加如下内容(这里的MAVEN_HOME需要改为你自己的maven解压目录)

export JAVA_HOME=/usr/local/java

export MAVEN_HOME=/usr/local/maven

export JRE_HOME=/usr/local/java/jre

export CLASSPATH=.:$JAVA_HOME/lib:$JRE_HOME/lib:$CLASSPATH

export PATH=$JAVA_HOME/bin:$JRE_HOME/bin:$MAVEN_HOME/bin:$PATH

重载环境变量

[root@qfedu.com ~]# source /etc/profile

5、验证 java 和 maven 安装

[root@localhost ~]# java -version

java version "1.8.0_191"

Java(TM) SE Runtime Environment (build 1.8.0_191-b12)

Java HotSpot(TM) 64-Bit Server VM (build 25.191-b12, mixed mode)

[root@localhost ~]# mvn -v

Apache Maven 3.6.3 (cecedd343002696d0abb50b32b541b8a6ba2883f)

Maven home: /usr/local/maven

Java version: 9.0.1, vendor: Oracle Corporation, runtime: /usr/local/java

Default locale: en_US, platform encoding: UTF-8

OS name: "linux", version: "3.10.0-693.el7.x86_64", arch: "amd64", family: "unix"

3.安装 nexus3

1、下载

由于专业版的nexus是收费的,所以我下载的是开源版 Nexus OSS,下载地址为 :

Download Archives - Repository Manager 3

[root@localhost ~]# cd /opt/

[root@localhost opt]# wget http://download.sonatype.com/nexus/3/nexus-3.24.0-02-unix.tar.gz

2、解压

[root@qfedu.com ~]# tar -zxf nexus-3.24.0-02-unix.tar.gz -C /usr/local

解压后会多出两个目录,nexus-3.24.0-02和sonatype-work

3、启动

[root@qfedu.com ~]# cd nexus-3.24.0-02/bin/

[root@qfedu.com ~]# ./nexus start

看到如图所示内容表明我们已经启动成功了,游览器输入http://localhost:8081即可访问。

注意:

启动后如果你立即访问可能发现什么都没有,不要急这个启动需要一定时间,30秒后到1分钟后再尝试访问,这个开始我以为出问题了

 注意 :

点击右上角的sign in登录,新版首次登录需要

cat /usr/local/sonatype-work/nexus3/admin.password

获取密码。

4、仓库介绍

 按图中标识顺序点击,就可以看到有这些仓库,现在分别介绍它们,分为三种类型:

proxy:是远程仓库的代理。比如说在nexus中配置了一个central        repository的proxy,当用户向这个proxy请求一个artifact,这个proxy就会先在本地查找,如果找不到的话,就会从远程仓库下载,然后返回给用户,相当于起到一个中转的作用。    

Hosted:是宿主仓库,用户可以把自己的一些构件,deploy到hosted中,也可以手工上传构件到hosted里。比如说oracle的驱动程序,ojdbc6.jar,在central repository是获取不到的,就需要手工上传到hosted里,一般用来存放公司自己的jar包;

Group:是仓库组,在maven里没有这个概念,是nexus特有的。目的是将上述多个仓库聚合,对用户暴露统一的地址,这样用户就不需要在pom中配置多个地址,只要统一配置group的地址就可以了右边那个Repository Path可以点击进去,看到仓库中artifact列表。不过要注意浏览器缓存,当你的项目希望在多个repository使用资源时就不需要多次引用了,只需要引用一个group即可。

maven-public:maven-central、maven-release和maven-snapshot三个库的合集。

maven-release:用来存放release版本的jar包。

maven-snapshot:用来存放snapshot版本的jar包。

5、向 nexus3 私服上传 jar 包

1、准备环境

1、创建3rd_part库

 点击左侧的 repository\repositories 后,在右侧点击 create repository

 然后选择maven2(hosted),填写如下

 跳到首页后选择maven-public

将3rd_part移到member中,即将3rd_part由maven-public管理,点击save

 至此,创建仓库完成

2、创建 3rd_part 管理用户

创建用户: 用户名/密码-dev/dev123

 2、直接浏览器

使用dev/dev123登陆,点击upload

 填写上传jar包的信息后,点击upload

 

 可以看到已经上传成功

知秋君
上一篇 2024-07-10 12:12
下一篇 2024-07-10 11:48

相关推荐