「初学者商城」- 搭建基础架构(部署)

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




1.系统需求 2 2.需求分析 4 2.1功能设置 4 2.2模块划分 5 2.3识别参与者和用例 6 2.3.1 顾客Customer用例图 7 2.3.2 系统管理员用例 13 2.3 静态结构模型 16 2.3.1 类Customer 17 2.3.2类Goods 18 2.3.3类Order 19 2.3.4管理员 20 2.3.5标题title类 20 2.3.6二级标题类 21 2.3.7公共操作类 22 2.3.8类图 23 3.动态行为模式 23 3.1时序图 23 3.1.1顾客注册成为会员时序图 24 3.1.2顾客反馈信息时序图 25 3.1.3顾客浏览商品时序图 26 3.1.4顾客查询商品时序图 27 3.1.5顾客购买商品时序图 28 3.2.6管理员添加商品时序图 29 3.2.7管理员删除商品时序图 29 3.2.8管理员添加二级商品目录时序图 30 3.2.9管理员删除二级商品目录时序图 31 3.2.10管理员编辑促销产品时序图 31 3.2.11管理员编辑条款信息时序图 32 3.2.12管理员编辑购买流程时序图 33 3.2.13管理员删除会员时序图 34 3.2.14用户结算时序图 35 3.3.活动图 35 3.3.1用户顾客的活动图 35 3.3.2管理端管理员的活动图 36 3.4协作图 38 3.4.1顾客登录协作图 38 3.4.2顾客注册协作图 38 3.4.3顾客浏览商品协作图 39 3.4.4反馈信息协作图 39 3.4.5顾客查询商品协作图 40 3.4.6顾客购买商品协作图 40 3.4.7管理员删除会员协作图 41 3.4.8管理员添加商品协作图 41 3.4.9管理员添加商品标题协作图 42 3.4.10管理员删除商品协作图 42 3.4.11管理员删除标题协作图 43 3.4.12管理员编辑文本协作图 43 4.系统数据库设计 44 4.1数据库的需求分析 44 4.2数据库的逻辑设计 44 5.参考文献: 47
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值