「初学者商城」- 搭建基础架构(部署)
1. 前言部署暂时是在单机中,如果有需要考虑上k8s。项目使用docker-compose部署;就目前而言,服务器硬件最低要求是4c8g…我手上就一台1c2g的学生机,资源直接被占百分百;无奈高配置的服务器太贵了,好在有按量付费的计费方式,不过也是一路被坑过来,先租了2c4g发现有两三个服务总是在重启,一直以为配置有问题,后来发现是硬件跟不上导致的,最终租了4c8g的才完美启动成功;但是按量...
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
注:对于标签的说明「初学者商城」- 写在最前面 #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 配置文件中修改了如下几点
- daemonize no:前台启动,在 Docker 中后台启动 Redis 容器会报错
- requirepass 123456789:设置密码
- # 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:① 配置文件 ② 数据目录 ③ 日志目录
注:
-
volumes 映射的数据目录
./data/nginx/
,就是 service_vue 服务从容器中映射出来的 Vue 打包后的静态文件,container_vue 容器 映射到 宿主机,宿主机 映射到 container_nginx 容器,所以这里需要在 depends_on 中配置 service_vue 服务等待 Vue 打包结束。这样,启动时静态文件就会直接被映射到 Nginx 的访问目录中。 -
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 使用我的镜像部署发布
注:如果使用我的镜像部署发布的话,会简单很多,推荐先试验一下
- 下载
v1.0
标签的代码 - 把下载下来的
osc-build-1.0
目录拷贝到服务器或者虚拟机中 - 进入到目录中
- 日志目录需要赋值权限:chmod -R 777 log/
- 如果没有安装
Docker
和docker-compose
请先前往:CentOS7中安装Docker,CentOS7中安装Docker-Compose - 后台启动:docker-compose up -d
- 启动情况:docker ps -a
7.2 使用你自己的镜像部署发布
- 具体操作步骤请前往:CentOS7中使用docker-compose快速部署前后端分离项目
8. 验证
注:服务器需要开启防火墙,并且需要把端口都开放出来以及加到安全组中
8.1 后台管理系统
- 访问
http://ip:9527
- 显示
success
,表示成功
8.2 Navicat 连接 MySQL 容器
在 Navicat 中新建 MySQL 连接:
- 主机:服务器 ip
- 端口:3306
- 用户名:root
- 密码:123456
连接成功后,进入到 osc_db 库中,目前里面只有两张表:
flyway_schema_history
是 Flyway 自动生成的,用来记录版本信息的表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:
- Name:取个名
Authentication:
- 勾选 Perform authentication
- Database:osc_db
- User Name:zwc
- Passwrod:123456
连接成功后,进入到 osc_db 库中查看Collections: to_visit_log
,存放着全部访问记录
8.5 service_kafka_manager
- 访问
http://ip:9000
- 点击顶部
Cluster
->Add Cluster
- Cluster Name:osc_cluster
- Cluster Zookeeper Hosts:zoo:2181
- 点击
Go to cluster view.
- 接下来就可以查看
Topics
和Brokers
信息了
8.6 service_registry
- 访问
http://ip:8761
8.7 service_turbine
- 访问
http://ip:8762/hystrix/monitor?stream=http://ip:8762/turbine.stream
8.8 service_sleuth
- 访问
http://ip:9411/zipkin
,点击 Find Traces 蓝色按钮 - 访问
http://ip:9411/zipkin/dependency/
9. 结语
部署也将变得很容易,搭建环境不再是头疼的问题。阿,快乐。
10. 相关文章
10.1 准备工作
10.2 搭建基础架构
10.3 搭建本地开发环境
希望能够帮助到你
over
更多推荐
所有评论(0)