OBOS编译&部署

# 1. 工程结构

# 1.1 服务端工程结构

服务端工程由Maven构建管理,根据业务职责将服务端能力按模块划分,并基于Maven聚合能力实现模块聚合。

├───config                 编译配置目录
├───package                编译产出物
├───uav-activity           流程处理器
├───uav-api                API
├───uav-entities           实体
├───uav-obos               OBOS核心包
│   ├───obos-api           OBOS业务API
│   ├───obos-auxposition   星历服务
│   ├───obos-base          OBOS基础业务模块
│   ├───obos-cmd           终端指令业务模块
│   ├───obos-ota           终端升级业务模块
│   ├───obos-provider      OBOS服务入口
│   ├───obos-record        终端数据查询模块
│   └───obos-store         终端任务状态存储模块
├───uav-script             数据库初始化模块
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15

# 1.2 客户端工程结构

基于Vue-Cli初始化工程结构,并根据业务需要自行扩展。


├─api
├─assets 静态资源
├─components 自定义组件相关
│  ├─amap 高德地图
│  ├─dropdown 下拉框
│  ├─form 表单
│  ├─menu 菜单
│  ├─progressbar 进度条
│  └─tree ZTree
├─directives 自定义指令
├─mock 测试数据
├─router 路由
├─store 存储
├─utils 工具包
└─views 视图部分

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17

# 2. 工程编译

# 2.1 服务端编译

因服务端模块较多,且模块之间存在依赖关系。 同时为了更好的实现部署,这里通过脚本(python)实现统一编译打包。

# 2.1.1 修改编译配置文件;

在obos-admin/config目录下存在名为modules.json的文件,该文件描述了待编译的目标模块信息。

{
  "projectName": "obos",
  "projectDescription": "鸿升OBOS",
  "modules": [
    {
      "name": "obos-provider",
      "version": "1.0.0",
      "parent": "uav-obos",
      "description": "基础服务",
      "ms": "-Xms1024m",
      "mx": "-Xmx1024m",
      "maxNewSize": "512m",
      "startupSequence": "syslog.target network.target remote-fs.target nss-lookup.target ms-register.service"
    },
    {
      "name": "obos-store",
      "version": "1.0.0",
      "parent": "uav-obos",
      "description": "入库服务",
      "ms": "-Xms1024m",
      "mx": "-Xmx1024m",
      "maxNewSize": "512m",
      "startupSequence": "syslog.target network.target remote-fs.target nss-lookup.target ms-register.service"
    },
    {
      "name": "obos-api",
      "version": "1.0.0",
      "parent": "uav-obos",
      "description": "API服务",
      "ms": "-Xms1024m",
      "mx": "-Xmx1024m",
      "maxNewSize": "512m",
      "startupSequence": "syslog.target network.target remote-fs.target nss-lookup.target ms-register.service"
    }
  ]
}


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

编译前根据需要,调整json 文件中的modules信息,一般情况下仅需修改version(对应模块pom.xml中的version值)信息。

# 2.1.2 执行编译脚本

进入obos-admin根目录,执行目录下的ci-build-win.py脚本(目标机器需要安装Python 3环境)。

python ci-build-win.py

当编译完成后,会在obos-admin/package目录下生成install-obos.zip文件,其中包含了modules.json中描述的目标模块。

目录结构如下:

├───bin               存放各模块安装脚本
├───obos-api          模块程序包,包含了可执行jar及程序入口配置文件
├───obos-provider     模块程序包,包含了可执行jar及程序入口配置文件
├───obos-store        模块程序包,包含了可执行jar及程序入口配置文件
├───service           Linux系统服务配置文件,用于将目标服务安装为系统服务
├───install-all.sh    服务批量安装脚本,执行了bin目录下的所有脚本, 最终将各服务安装为系统服务
└───uninstall-all     服务批量卸载脚本,将已安装的应用从系统服务列表删除
1
2
3
4
5
6
7

# 2.2 客户端编译

客户端工程依赖node环境,通过node指令实现编译打包。

  • 安装依赖

    npm install 或 cnpm install

  • 构建

    npm run build

    编译完成后会在工程根目录下生成dist目录,即编译产物。

    或执行ci-build.sh脚本, 该脚本会将编译产物打包为dist.tar.gz

# 3. 依赖软件安装

# 3.1 JDK安装

建议选择JDK1.8。JDK 安装请参考 here

# 3.2 数据库安装

数据库选用PostgreSQL,版本>=10.0。PostgreSQL 安装请参考 here

基于源码安装PostgreSQL过程略显复杂,因此当目标服务器网络环境支持访问外网时,也可选择基于安装包方式进行安装(上述PostgreSQL安装文档也有描述)。

# 3.3 Redis安装

Redis版本>=5.0。Redis 安装请参考 here

可根据目标接入量及服务器资源情况,按需选择单机集群安装模式。

# 3.4 Kafka安装

# 3.5 808网关安装

808网关 安装请参考 here

# 3.6 Nginx安装

OBOS采用Nginx作为客户端应用服务器。Nginx 安装请参考 here

# 4. 客户端部署

# 4.1 上传应用

将2.2章节编译的产出物上传至目标服务器/opt目录,并解压重命名。

cd /opt

tar -xvf dist.tar.gz

mv dist html

# 4.2 配置Nginx

Nginx安装完成后,需要根据客户端应用路径及服务端API地址信息修改Nginx配置文件(nginx.conf)。

  • upstream providers 负载均衡,配置服务端API网关地址;

  • server 配置客户端程序路径及api代理地址;

    这里我们配置了两个server节点,一个用于提供客户端程序访问入口(端口8888),另一个用于提供图片服务(端口9003)。

    端口信息可根据企业网络要求调整。

#user  nobody;
worker_processes  1;

#error_log  logs/error.log;
#error_log  logs/error.log  notice;
#error_log  logs/error.log  info;

#pid        logs/nginx.pid;

events {
    worker_connections  1024;
}

http {
    sendfile            on;
    tcp_nopush          on;
    tcp_nodelay         on;
    keepalive_timeout   65;
    types_hash_max_size 2048;
    client_max_body_size 1000m;

    include       mime.types;
    default_type  application/octet-stream;

    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';

    access_log  logs/access.log  main;

    gzip  on;

    #vhost_traffic_status_zone;
    #vhost_traffic_status_filter_by_host on;

    proxy_headers_hash_max_size 51200;
    proxy_headers_hash_bucket_size 6400;

    # 负载均衡
    upstream providers {
    	server localhost:8002;
    }

    server {
        listen       8888;
        server_name  localhost;
        location / {
            try_files $uri $uri/ @router;
            index  index.html;
            root /opt/obos/html/;
        }

        location /api/ {
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_set_header X-Forwarded-For $http_x_forwarded_for;
            proxy_set_header Host $http_host;
            proxy_set_header REMOTE-HOST $remote_addr;
            proxy_set_header X-Nginx-Proxy true;
            proxy_set_header Connection "";
            proxy_pass   http://providers/;
        }

        location @router {
            rewrite ^.*$ /index.html last;
        }

        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }
    }

    autoindex on;# 显示目录
    autoindex_exact_size on;# 显示文件大小
    autoindex_localtime on;# 显示文件时间

    # 文件服务
    server {
        listen 9003;
        charset UTF-8;
        server_name localhost;
        location /images {
            alias /opt/uav/upload/images;
            autoindex on;
        }
    }
}
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
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88

配置更新后需要重启Nginx使配置生效。

systemctl restart nginx

# 5. 服务端部署

为了降低维护的复杂度,OBOS目标程序均安装在/opt/obos目录下,目录结构如下:

.
├─base 基础微服务安装目录
├─ext 扩展微服务安装目录(可选)
├─biz 业务服务安装目录
└─html 客户端程序目录

1
2
3
4
5
6
  • html 客户端程序目录

  • base 基础微服务安装目录

    • ms-register 微服务注册中心
    • ms-api-gateway 微服务网关(zuul实现)
    • ms-config 微服务配置中心
  • ext 扩展微服务安装目录(可选)

    • ms-message 消息服务
    • ms-job 异步调度服务
    • others ...
  • biz 业务服务安装目录

    • obos-store obos存储服务,包含终端上报数据入库及升级数据上报处理逻辑
    • obos-api obos api服务,为第三方提供Restful API
    • obos-provider obos业务服务入口

# 5.1 部署 ms-register 服务

该服务基于Spring Cloud Eureka实现了服务治理能力,含服务注册、服务发现功能。

# 5.1.1 编译

  • 进入ms-register根目录,执行ci-build-win.py脚本

    python ci-build-win.py

  • 进入 ms-register/package目录获取编译产物

  • 上传并解压安装包

    • 将编译产物ms-register.zip上传至目标服务器/opt/obos/base目录下
    • 解压ms-register.zip

      cd /opt/obos/base

      unzip ms-register.zip

  • 安装系统服务

    • 进入目标服务目录/opt/obos/base/ms-register,执行安装脚本

      cd /opt/obos/base/ms-register

    • 修改脚本执行权限

      chmod 777 ./bin/*.sh

      chmod 777 *.sh

    • 执行安装

      ./install.sh

      若安装过程出现-bash: ./install.sh: /bin/bash^M: bad interpreter: No such file or directory错误(Windows平台引起的编码问题),可执行下面命令修复:

      sed -i 's/\r$//' bin/*.sh

      sed -i 's/\r$//' *.sh

    • 服务验证

      服务安装成功后,微服务ms-register会自动启动。

      可通过命令systemctl status查看服务状态。

      systemctl status ms-register

  • 其他指令

    • 启动ms-register服务

      systemctl start ms-register

    • 重启ms-register服务

      systemctl restart ms-register

    • 关闭ms-register服务

      systemctl stop ms-register

    • 查看ms-register服务状态

      systemctl status ms-register

# 5.2 部署 ms-api-gateway 服务

ms-api-gateway 是一套基于SpringCloud Zuul实现的API网关服务。

ms-api-gateway 服务编译、打包、安装过程与 ms-register 服务一致,请参考部署ms-register章节内容。

# 5.2.1 修改application.yml配置

application.yml配置文件中包含了注册中心地址的配置项,根据实际注册中心服务(ms-regisger)IP进行配置即可。

cd /opt/obos/base/ms-api-gateway/jars

vi /opt/obos/base/ms-api-gateway/jars/application.yml

# 根据实际地址配置
eureka-server: http://localhost:8000
1
2

# 5.2.1 修改application-prod.yml配置

根据Redis服务IP,配置Redis信息即可.

cd /opt/obos/base/ms-api-gateway/jars

vi /opt/obos/base/ms-api-gateway/jars/application-prod.yml

spring:
  #Redis配置
  redis:
    host: localhost
    port: 6379
    password:
1
2
3
4
5
6

# 5.2.2 重启服务

ms-api-gateway服务安装成功后,默认启动过程可能出现异常(注册中心或Redis配置错误)。在调整完上述配置后,需要重启服务使配置生效。

systemctl restart ms-api-gateway

# 5.2.3 其他指令

  • 启动ms-register服务

    systemctl start ms-register

  • 重启ms-register服务

    systemctl restart ms-register

  • 关闭ms-register服务

    systemctl stop ms-register

  • 查看ms-register服务状态

    systemctl status ms-register

# 5.3 部署 ms-config 服务

ms-config服务是基于SpringCloud Config实现的配置管理服务,实现微服务配置集中化管理。

ms-config 服务编译、打包、安装过程与 ms-register 服务一致,请参考部署ms-register章节内容。

# 5.3.1 修改配置

如上所属,ms-config服务是一个集中式配置管理服务,管理着N个微服务的配置信息。为了对不同服务进行区分,所有的配置文件均在native下通过业务目录隔离存储。

更新时间: 1/10/2023, 9:23:40 AM