# Java计算服务容器化改造

作者:于福豪 时间: 2021-01-05

http://elb-791125809.cn-northwest-1.elb.amazonaws.com.cn:5335/xdata/sh2019gh144/back-end/gis-server-root

分支:gis-docker-20201105

# 一、集成springalibaba+nacos

  • 使用nacos作为配置中心和注册中心
  • 考虑将审查规则文件planCheckRule.xml也放到配置中心文件中,尝试获取子节点list对象时,没解析出来。

# 二、supermap-iobject基础镜像

  • 制作基础镜像,开始将所有环境依赖安装到一个镜像里,达到5G

  • 后经运维人员修改,只安装iobject所需的环境,依赖宿主机内的iobject环境,需映射宿主机的supermap-iobject安装路径到容器内的特定路径里/usr/local/iobject

  • 基础镜像地址

    172.31.36.236/middleware/dist-jdk18:latest
    
    1

# 三、容器内使用web许可

  • 需要宿主机内部署web许可

  • 容器内应用添加获取web许可的代码

    //65400为购买的许可模块 
    int [] arrayOfInt = {65400};
    boolean login = BSLicense.login("161.189.205.144", 9183, arrayOfInt);
    
    1
    2
    3
  • 存在的问题

    • 正式许可中,一个容器占用一套许可。多个容器就要占用多套许可。
    • 如果共用许可,不能同一时刻,获取许可。

# 四、传输文件上传到mongo里

  • 合规审查导出报告

# 五、自动发服务的工程文件存空间库

  • 针对iserver容器
    • 路径映射的方式可以用来发布文件型GIS数据,如文件型工作空间、MBTiles瓦片包等。
    • 对于存储在数据库中的GIS数据,如数据库型工作空间、MongoDB瓦片等,则无需此映射。建议将数据库单独部署,例如部署在宿主机上或其他机器上,并使所有iServer都可以访问该数据库。
  • 文件型工作空间不能直接另存为数据库型的工作空间
    • 存入的相当于本地文件的索引,只能在本地数据库中正常发布服务。
    • 发布到其他服务器上的服务,数据源会缺失

# 六、整合配置文件

  • 把所有配置文件都放置在一个主文件夹下,方便配置文件的挂载,方便配置。

    gis-config
    ├── planCheck
    ├── publishMapTemplate
    │   └── template
    └── tzStatistics
        └── dicFile
    
    1
    2
    3
    4
    5
    6

# 七、整合数据文件

  • 将所有数据文件都放置在一个主文件夹下,方便数据文件的挂载,方便排查问题

    webApi-data
    ├── loadData
    ├── log
    │   ├── gis-server-bizservice
    │   └── gis-server-web
    ├── planCheckReport
    ├── publicMapData
    │   ├── publishMapDatasource
    │   └── publishMapServerDataDir
    │   
    ├── tzStatisticsResult
    └── uploadItemData
    
    
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13

# 八、新增Dockerfile文件构建镜像

# 基础镜像使用supermap-iobject镜像
FROM 172.31.36.236/middleware/dist-jdk18:latest
# 维护人员
MAINTAINER yufh@dist.com.cn
# 工作目录
WORKDIR webApi

# 将jar包,配置文件夹,启动文件添加到容器中
ADD gis-server-web.jar /webApi/gis-server-web.jar
ADD gis-server-service-land.jar /webApi/gis-server-service-land.jar
ADD gis-config /webApi/gis-config
ADD gis-config/startUp.sh /webApi/startUp.sh

# 修复java.security.InvalidKeyException: Illegal keyW size错误
RUN sed -i 's/#crypto.policy=unlimited/crypto.policy=unlimited/g' /usr/local/jdk1.8.0_152/jre/lib/security/java.security

# 启动文件授权
RUN chmod +x startUp.sh
# 启动文件
ENTRYPOINT ["./startUp.sh"]
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
  • 采用一个容器内运行两个jar包的方式。

# 九、容器化部署步骤

spring-alibaba-cloud + nacos

1、启动nacos

  • 新建命名空间
  • 在新建的命名空间内导入示例配置
  • 修改相应的配置信息

2、下拉项目

  • 修改land和web模块的bootstrap.yml nacos配置信息

3、gitlab代码库里添加Jenkins角色

4、jenkins新建流水线项目

  • 添加Pipeline脚本

    //脚本示例
    pipeline {
        agent {
            node{
                label 'Slave179'
            }
        }
        environment {
             def version = sh script: 'mvn help:evaluate -Dexpression=project.version -q -DforceStdout', returnStdout: true
            //  def version = '1.0.0-SNAPSHOT'
             def artifactId = 'gis-service'
             def projectNameSpace='nr_sh2019gh144'
             def harborIp='172.31.36.236'
        }
        stages{
            stage('pull'){
                steps{
                    git branch: 'gis-docker-20201105', credentialsId: 'jenkins-gitlab', url: 'ssh://git@elbgit-1200450932.cn-northwest-1.elb.amazonaws.com.cn:5337/xdata/sh2019gh144/back-end/gis-server-root.git'
                }
            }
            stage('compiler'){
                steps{ 
                    echo "${version}"
                    sh '''
                    mvn clean package -DskipTests -P pg-prod
                    '''
                }
            }
            stage('build'){
                steps{
                    sh '''
                    mv ./gis-server-web/Dockerfile gis-server-web/target
                    mv ./gis-server-service-land/target/gis-server-service-land.jar gis-server-web/target
                    mv ./gis-config gis-server-web/target  
                    docker build -t ${harborIp}/${projectNameSpace}/b_${artifactId}:${version} gis-server-web/target
                    docker build -t ${harborIp}/${projectNameSpace}/b_${artifactId}:latest gis-server-web/target
                    '''
                }
            }
    		stage('push'){
                steps{
                    sh '''
                    docker push ${harborIp}/${projectNameSpace}/b_${artifactId}:${version}
                    docker push ${harborIp}/${projectNameSpace}/b_${artifactId}:latest
                    '''
                }
            }
            stage('update'){
                steps{
                    sh '''
                    export PATH=$PATH:/usr/local/rancher-v2.3.2
                    rancher kubectl --namespace=backend-nr apply -f /yaml/NR-yaml/nr-gis-service-ts.yaml &> null || true
                    rancher kubectl replace --force -f /yaml/NR-yaml/nr-dme-cloud-ts.yaml &> null
                    '''
                }
            }
    }
    
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57

    修改内容:

    • 项目名称,分组
    • harbor仓库地址
    • 项目仓库地址,分支
    • 编译命令,分支

5、查看harbor仓库中构建的镜像

  • 复制下载镜像命令

6、在Rancher里部署服务

  • 填写项目信息
  • 粘贴下载镜像命令
  • 进行端口映射
  • 进行supermap-iobject基础镜像的基础环境目录映射
    • 主机路径: supermap-iobjectsjava的安装路径
    • 容器路径: /usr/local/iobject
  • 进行配置文件的路径映射
    • 主机路径: /opt/webApi/gis-config
    • 容器路径: /webApi/gis-config
  • 进行数据文件的路径映射
    • 主机路径: /opt/webApi-data
    • 容器路径: /webApi-data

7、启动服务