「初學者商城」- 搭建基礎架構(部署)

1. 前言


部署暫時是在單機中,如果有需要考慮上k8s

項目使用docker-compose部署;就目前而言,服務器硬件最低要求是4c8g…我手上就一臺1c2g的學生機,資源直接被佔百分百;無奈高配置的服務器太貴了,好在有按量付費的計費方式,不過也是一路被坑過來,先租了2c4g發現有兩三個服務總是在重啓,一直以爲配置有問題,後來發現是硬件跟不上導致的,最終租了4c8g的才完美啓動成功;但是按量有個最大的缺陷是每次租的服務器都需要重新搭建環境,拉取鏡像,這個是不能忍受的,最後,分了4c8g給虛擬機,在虛擬機中部署了。

現在就先看看如何來部署「初學者商城」的。


2. 源碼


完整項目地址:https://github.com/intomylife/osc-build

v1.0 標籤地址:https://github.com/intomylife/osc-build/releases/tag/v1.0

v1.0 下載地址:ziptar.gz

注:對於標籤的說明「初學者商城」- 寫在最前面 #5.1


3. 環境


  • CentOS7.3 64位

4. 工具


  • Termius
  • Cyberduck
  • Navicat Premium
  • Redis Desktop Manager
  • Robo 3T

5. 目錄結構


osc-build-1.0/
├── config
│   ├── mysql
│   │   └── my.cnf
│   ├── nginx
│   │   └── nginx.conf
│   └── redis
│       └── redis.conf
├── data
│   ├── mongodb
│   ├── mysql
│   ├── nginx
│   ├── redis
│   └── zookeeper
├── docker-compose.yaml
├── init
│   ├── mongodb
│   │   └── setup.js
│   └── mysql
│       └── init.sql
├── log
│   ├── kafka
│   ├── mongodb
│   ├── mysql
│   ├── nginx
│   └── redis
└── README.md
  • config:應用的配置文件
  • data:映射出來的數據
  • docker-compose.yaml:核心配置文件
  • init:初始化腳本
  • log:映射出來的日誌

6. docker-compose.yaml


6.1 文件說明

此文件的默認名稱爲 docker-compose,後綴名可以爲 .yml 也可以爲 .yaml。

6.2 version

version: '3'
  • 構建文件的語法版本信息。version: ‘3’ 表示使用第三代語法

6.3 services

version: '3'
 
services:
 
    service_redis:
        ...
    
    service_mysql:
        ...

    service_mongodb:
        ...

    service_zookeeper:
        ...

    service_kafka:
        ...

    service_kafka_manager:
        ...

    service_registry:
        ...

    service_sleuth:
        ...

    service_turbine:
        ...

    service_gateway:
        ...

    service_base:
        ...

    service_log:
        ...

    service_vue:
    	...
    	
    service_nginx:
        ...
  • 包含此工程中所有的服務列表
  • 服務可以是已存在的鏡像(本地或遠程),也可以是構建出來的鏡像;如果其中有需要構建的鏡像,則需要一個 Dockerfile 文件

6.4 服務相同屬性

注:這裏先把服務的相同點寫一下,然後不同的點會在下面單獨寫出來

  • service_xxxxxx:服務名稱,可自定義
  • container_name:容器名稱,可自定義;也可不寫,那樣會自動生成,生成規則爲 【docker-compose.yaml 文件的父目錄名稱 + _ + 服務名稱 + 從一開始的數字】
  • image:指定鏡像來啓動容器
  • links:連接指定的服務,規則爲 服務名稱:別名
  • environment:爲啓動的容器添加環境變量
  • ports:端口映射,映射規則爲 宿主機端口:容器端口
  • expose:暴露容器內端口,不映射到宿主機
  • volumes:配置映射,映射規則爲 宿主機:容器,可以映射文件或目錄
  • depends_on:依賴服務。在整個工程啓動時,會先啓動依賴服務,再啓動當前服務
  • command:容器啓動後執行的命令
  • restart:賦固定值 always,表示如果容器啓動失敗,會一直嘗試重啓

6.5 service_redis

    service_redis:
        container_name: container_redis
        image: redis:4.0.14
        environment:
            - TZ=Asia/Shanghai
        ports:
            - "6379:6379"
        volumes:
            - ./config/redis/redis.conf:/usr/local/etc/redis/redis.conf
            - ./data/redis/:/data/
            - ./log/redis/:/var/log/redis/
        command: redis-server /usr/local/etc/redis/redis.conf
        restart: always

Redis 服務描述:

  • image:Redis 官方鏡像,版本爲 4.0.14
  • environment:容器的時區
  • volumes:① 配置文件 ② 數據目錄 ③ 日誌目錄
  • command:使用配置文件來啓動 Redis 容器

注:redis.conf 配置文件中修改瞭如下幾點

  1. daemonize no:前臺啓動,在 Docker 中後臺啓動 Redis 容器會報錯
  2. requirepass 123456789:設置密碼
  3. # bind 127.0.0.1:註釋掉了,使外網可訪問

6.6 service_mysql

    service_mysql:
        container_name: container_mysql
        image: mysql:5.7
        environment:
            TZ: Asia/Shanghai
            MYSQL_ROOT_PASSWORD: 123456
            MYSQL_ROOT_HOST: '%'
        ports:
            - "3306:3306"
        volumes:
            - ./config/mysql/my.cnf:/etc/mysql/conf.d/my.cnf
            - ./init/mysql/:/docker-entrypoint-initdb.d/
            - ./data/mysql/:/var/lib/mysql/
            - ./log/mysql/:/var/log/mysql/
        command: [
            '--character-set-server=utf8mb4',
            '--collation-server=utf8mb4_unicode_ci'
        ]
        restart: always

MySQL 服務描述:

  • image:MySQL 官方鏡像,版本爲 5.7
  • environment:① 容器的時區 ② 設置數據庫 ROOT 密碼 ③ 設置數據庫權限
  • volumes:① 配置文件 ② 初始化 SQL 目錄 ③ 數據目錄 ④ 日誌目錄
  • command:設置字符編碼

注:my.cnf 配置文件中有一個需要注意的地方如下

# 開啓 bin-log,並指定文件目錄和文件名前綴
log-bin=/var/log/mysql/binlog

6.7 service_mongodb

    service_mongodb:
        container_name: container_mongodb
        image: mongo:4.0.9
        environment:
            TZ: Asia/Shanghai
            MONGO_INITDB_ROOT_USERNAME: root
            MONGO_INITDB_ROOT_PASSWORD: 123456
        ports:
            - "27017:27017"
        volumes:
            - ./init/mongodb/:/docker-entrypoint-initdb.d/
            - ./data/mongodb/:/data/db/
            - ./log/mongodb/:/var/log/mongodb/
        restart: always

MongoDB 服務描述:

  • image:MongoDB 官方鏡像,版本爲 4.0.9
  • environment:① 容器的時區 ② 管理員的用戶名和密碼
  • volumes:① 初始化腳本目錄 ② 數據目錄 ③ 日誌目錄

注:setup.js 初始化腳本文件用來創建 MongoDB 初始庫並設置庫的登錄用戶

6.8 service_zookeeper

    service_zookeeper:
        container_name: container_zookeeper
        image: wurstmeister/zookeeper:3.4.13
        image: wurstmeister/zookeeper
        environment:
            TZ: Asia/Shanghai
        expose:
            - "2181"
        volumes:
            - ./data/zookeeper/:/opt/zookeeper-3.4.13/data/
        restart: always

Zookeeper 服務描述:

  • image:遠程倉庫中 wurstmeister/zookeeper 鏡像,版本爲 3.4.13。寫兩個 image 主要爲了確保拉取的是 3.4.13 版本的鏡像,從而能順利把數據映射出來;後面會把這個版本號寫到環境變量裏面
  • environment:容器的時區
  • volumes:數據目錄

6.9 service_kafka

    service_kafka:
        container_name: container_kafka
        image: wurstmeister/kafka
        links:
            - service_zookeeper:zoo
        environment:
            TZ: Asia/Shanghai
            KAFKA_ADVERTISED_HOST_NAME: service_kafka
            KAFKA_MESSAGE_MAX_BYTES: 2000000
            KAFKA_ZOOKEEPER_CONNECT: zoo:2181
            KAFKA_LOG_DIRS: "/var/log/kafka"
        ports:
            - "9092:9092"
        volumes:
            - ./log/kafka/:/var/log/kafka/
            - /var/run/docker.sock:/var/run/docker.sock
        depends_on:
            - service_zookeeper
        restart: always

Kafka 服務描述:

  • image:遠程倉庫中 wurstmeister/kafka 鏡像,版本爲 最新
  • environment:① 容器的時區 ② Kafka 的主機地址(當前服務)③ 消息體的最大大小 ④ Zookeeper 集羣地址(service_zookeeper 服務)⑤ Kafka 的日誌目錄
  • volumes:① 日誌目錄 ② docker.sock。至於爲什麼需要 docker.sock 是因爲這個 Kafka 服務需要使用 Docker 命令

6.10 service_kafka_manager

    service_kafka_manager:
        container_name: container_kafka_manager
        image: sheepkiller/kafka-manager
        links:
            - service_zookeeper:zoo
            - service_kafka:kafka
        environment:
            TZ: Asia/Shanghai
            ZK_HOSTS: zoo:2181
            KAFKA_BROKERS: kafka:9092
        ports:
            - "9000:9000"
        depends_on:
            - service_zookeeper
            - service_kafka
        restart: always

Kafka 服務描述:

  • image:遠程倉庫中 sheepkiller/kafka-manager 鏡像,版本爲 最新
  • environment:① 容器的時區 ② Zookeeper 的地址(service_zookeeper 服務)③ Kafka 的地址(service_kafka 服務)

6.11 service_registry

    service_registry:
        container_name: container_registry
        image: intomylife/osc-registry:1.0
        environment:
            TZ: Asia/Shanghai
        ports:
            - "8761:8761"
        restart: always

Registry 服務描述:

  • image:遠程倉庫中 intomylife/osc-registry 鏡像,版本爲 1.0
  • environment:容器的時區

6.12 service_sleuth

    service_sleuth:
        container_name: container_sleuth
        image: intomylife/osc-sleuth:1.0
        links:
            - service_registry:registry
        environment:
            TZ: Asia/Shanghai
            eureka.server.host: registry
        ports:
            - "9411:9411"
        depends_on:
            - service_registry
        restart: always

Sleuth 服務描述:

  • image:遠程倉庫中 intomylife/osc-sleuth 鏡像,版本爲 1.0
  • environment:① 容器的時區 ② 指定了註冊中心地址爲 service_registry 服務(eureka.server.host 配置在接口的鏈路跟蹤監控中心工程的 application.yml 文件中)

6.13 service_turbine

    service_turbine:
        container_name: container_turbine
        image: intomylife/osc-turbine:1.0
        links:
            - service_registry:registry
        environment:
            TZ: Asia/Shanghai
            eureka.server.host: registry
        ports:
            - "8762:8762"
        depends_on:
            - service_registry
        restart: always

Turbine 服務描述:

  • image:遠程倉庫中 intomylife/osc-turbine 鏡像,版本爲 1.0
  • environment:① 容器的時區 ② 指定了註冊中心地址爲 service_registry 服務(eureka.server.host 配置在接口的鏈路跟蹤監控中心工程的 application.yml 文件中)

6.14 service_gateway

    service_gateway:
        container_name: container_gateway
        image: intomylife/osc-gateway:1.0
        links:
            - service_registry:registry
            - service_sleuth:sleuth
        environment:
            TZ: Asia/Shanghai
            spring.redis.host: service_redis
            eureka.server.host: registry
            spring.zipkin.host: sleuth
        ports:
            - "8000:8000"
        depends_on:
            - service_redis
            - service_registry
            - service_sleuth
        restart: always

Gateway 服務描述:

  • image:遠程倉庫中 intomylife/osc-gateway 鏡像,版本爲 1.0
  • environment:① 容器的時區 ② 指定了 Redis 地址爲 service_redis 服務 ③ 指定了註冊中心地址爲 service_registry 服務 ④ 指定了 Zipkin 地址爲 service_sleuth 服務 注:配置都在接口的網關工程的 application.yml 文件中

6.15 service_base

    service_base:
        container_name: container_base
        image: intomylife/osc-base:1.0
        links:
            - service_registry:registry
            - service_sleuth:sleuth
            - service_kafka:kafka
        environment:
            TZ: Asia/Shanghai
            spring.redis.host: service_redis
            spring.datasource.host: service_mysql
            spring.data.mongodb.host: service_mongodb
            eureka.server.host: registry
            spring.zipkin.host: sleuth
            spring.kafka.host: kafka
        ports:
            - "8080:8080"
        depends_on:
            - service_redis
            - service_mysql
            - service_mongodb
            - service_registry
            - service_sleuth
            - service_turbine
            - service_kafka
        restart: always

Base 服務描述:

  • image:遠程倉庫中 intomylife/osc-base 鏡像,版本爲 1.0
  • environment:① 容器的時區 ② 指定了 Redis 地址爲 service_redis 服務 ③ 指定了 MySQL 地址爲 service_mysql 服務 ④ 指定了 MongoDB 地址爲 service_mongodb 服務 ⑤ 指定了註冊中心地址爲 service_registry 服務 ⑥ 指定了 Zipkin 地址爲 service_sleuth 服務 ⑦ 指定了 Kafka 地址爲 service_kafka 服務 注:配置都在接口的基礎工程 - 核心的 application.yml 文件中

6.16 service_log

    service_log:
        container_name: container_log
        image: intomylife/osc-log:1.0
        links:
            - service_registry:registry
            - service_sleuth:sleuth
            - service_kafka:kafka
        environment:
            TZ: Asia/Shanghai
            spring.redis.host: service_redis
            spring.datasource.host: service_mysql
            spring.data.mongodb.host: service_mongodb
            eureka.server.host: registry
            spring.zipkin.host: sleuth
            spring.kafka.host: kafka
        expose:
            - "8081"
        depends_on:
            - service_redis
            - service_mysql
            - service_mongodb
            - service_registry
            - service_sleuth
            - service_turbine
            - service_kafka
        restart: always

Log 服務描述:

  • image:遠程倉庫中 intomylife/osc-log 鏡像,版本爲 1.0
  • environment:① 容器的時區 ② 指定了 Redis 地址爲 service_redis 服務 ③ 指定了 MySQL 地址爲 service_mysql 服務 ④ 指定了 MongoDB 地址爲 service_mongodb 服務 ⑤ 指定了註冊中心地址爲 service_registry 服務 ⑥ 指定了 Zipkin 地址爲 service_sleuth 服務 ⑦ 指定了 Kafka 地址爲 service_kafka 服務 注:配置都在接口的日誌工程 - 核心的 application.yml 文件中

6.17 service_vue

    service_vue:
        container_name: container_vue
        image: intomylife/osc-front:1.0
        environment:
            - TZ=Asia/Shanghai
        volumes:
            - ./data/nginx/:/app/dist/

Vue 服務描述:

  • image:遠程倉庫中 intomylife/osc-front 鏡像,版本爲 1.0
  • environment:容器的時區
  • volumes:把 Vue 打包後的靜態文件映射出來

注:此服務的作用就是把 Vue 打包成靜態頁面,映射到宿主機目錄;此服務在打包結束後就會自動停止。

6.18 service_nginx

    service_nginx:
        container_name: container_nginx
        image: nginx:1.8
        environment:
            - TZ=Asia/Shanghai
        ports:
            - "9527:9527"
        volumes:
            - ./config/nginx/nginx.conf:/etc/nginx/nginx.conf
            - ./data/nginx/:/usr/share/nginx/html/
            - ./log/nginx/:/var/log/nginx/
        depends_on:
            - service_vue
        restart: always

Nginx 服務描述:

  • image:Nginx 官方鏡像,版本爲 1.8
  • environment:容器的時區
  • volumes:① 配置文件 ② 數據目錄 ③ 日誌目錄

注:

  1. volumes 映射的數據目錄./data/nginx/,就是 service_vue 服務從容器中映射出來的 Vue 打包後的靜態文件,container_vue 容器 映射到 宿主機,宿主機 映射到 container_nginx 容器,所以這裏需要在 depends_on 中配置 service_vue 服務等待 Vue 打包結束。這樣,啓動時靜態文件就會直接被映射到 Nginx 的訪問目錄中。

  2. nginx.conf 配置文件中需要注意如下地方

... 省略部分 ...

    # 負載均衡
    upstream dispense {
        server container_gateway:8000;
    }

... 省略部分 ...

        # 代理靜態頁面
        location / {
            root /usr/share/nginx/html;
            index  index.html index.htm;
        }

        # 代理接口地址
        location ^~ /api/ {
            proxy_pass http://dispense/;
		}
  • 直接訪問 Nginx,就會訪問到 Vue 打包後的靜態文件,也就是後臺管理系統頁面
  • /api開頭的請求會被轉發到 Gateway 服務,也就是接口中的網關;這裏也解決了發佈後跨域問題
  • /api與 Vue 中 config/prod.env.js 文件配置的 VUE_APP_BASE_API 對應

7. 部署


7.1 使用我的鏡像部署發佈

注:如果使用我的鏡像部署發佈的話,會簡單很多,推薦先試驗一下

  1. 下載v1.0標籤的代碼
  2. 把下載下來的osc-build-1.0目錄拷貝到服務器或者虛擬機中
  3. 進入到目錄中
  4. 日誌目錄需要賦值權限:chmod -R 777 log/
  5. 如果沒有安裝Dockerdocker-compose請先前往:CentOS7中安裝DockerCentOS7中安裝Docker-Compose
  6. 後臺啓動:docker-compose up -d
  7. 啓動情況:docker ps -a

7.2 使用你自己的鏡像部署發佈

  1. 具體操作步驟請前往:CentOS7中使用docker-compose快速部署前後端分離項目

8. 驗證


注:服務器需要開啓防火牆,並且需要把端口都開放出來以及加到安全組中

8.1 後臺管理系統

  1. 訪問http://ip:9527
  2. 顯示success,表示成功

8.2 Navicat 連接 MySQL 容器

在 Navicat 中新建 MySQL 連接:

  • 主機:服務器 ip
  • 端口:3306
  • 用戶名:root
  • 密碼:123456

連接成功後,進入到 osc_db 庫中,目前裏面只有兩張表:

  1. flyway_schema_history是 Flyway 自動生成的,用來記錄版本信息的表
  2. visit是基礎工程的配置文件(osc-base-service - osc-base-service-core - resources - db.zwc)中的.sql腳本執行結果所產生的表,表裏還有剛剛訪問時插入的數據

8.3 rdm 連接 Redis 容器

在 rdm 中新建連接:

  • Host:服務器 ip
  • Port:6379
  • Auth:123456789

連接成功後,進入到 db_0 庫中查看key: to_visit,存放着最新的訪問記錄

8.4 Robo 3T 連接 MongoDB 容器

在 Robo 3T 中新建連接:

Connection:

  1. Name:取個名

Authentication:

  1. 勾選 Perform authentication
  2. Database:osc_db
  3. User Name:zwc
  4. Passwrod:123456

連接成功後,進入到 osc_db 庫中查看Collections: to_visit_log,存放着全部訪問記錄

8.5 service_kafka_manager

  1. 訪問http://ip:9000
  2. 點擊頂部Cluster->Add Cluster
  3. Cluster Name:osc_cluster
  4. Cluster Zookeeper Hosts:zoo:2181
  5. 點擊Go to cluster view.
  6. 接下來就可以查看TopicsBrokers信息了

8.6 service_registry

  1. 訪問http://ip:8761

8.7 service_turbine

  1. 訪問http://ip:8762/hystrix/monitor?stream=http://ip:8762/turbine.stream

8.8 service_sleuth

  1. 訪問http://ip:9411/zipkin,點擊 Find Traces 藍色按鈕
  2. 訪問http://ip:9411/zipkin/dependency/

9. 結語


部署也將變得很容易,搭建環境不再是頭疼的問題。阿,快樂。


10. 相關文章


10.1 準備工作

「初學者商城」- 寫在最前面

10.2 搭建基礎架構

「初學者商城」- 搭建基礎架構(接口)

「初學者商城」- 搭建基礎架構(後臺管理系統)

「初學者商城」- 搭建基礎架構(部署)  👀

10.3 搭建本地開發環境

「初學者商城」- 搭建本地開發環境(JDK)

「初學者商城」- 搭建本地開發環境(Maven)

「初學者商城」- 搭建本地開發環境(Redis)

「初學者商城」- 搭建本地開發環境(MySQL)

「初學者商城」- 搭建本地開發環境(MongoDB)

「初學者商城」- 搭建本地開發環境(ZooKeeper)

「初學者商城」- 搭建本地開發環境(Kafka)


希望能夠幫助到你

over




發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章