部署准备工作
部署拓扑图
Kubernetes介绍
如上图所示每一个node表示一台物理机,可以做为k8s集群中的一个节点加入进来,我们可以随时将新的物理机加入到k8s集群。
每个node中可以运行我们的docker 容器实例,我可以实际情况按我们的预期来分派资源,在部署文档中会有详细的介绍。
在运维过程中,我们可以随时让为k8s对某个容器进行扩容,这一切都是自动的,只需要一条命令或点击一个按钮来完成
部署描述
一、请求由负载请求进来
负载可以是由kubernetes/nginx或阿里云等厂商提供的负载器
二、在最前端的是UI层
分为:
1、静态页(首页、商品页、帮助页),这些页面存储在redis中,直接由静态页服务输出给浏览器
2、UI:买家端(PC/WAP)、卖家端、管理端口
3、小程序、APP的买家端
三、上述前端发生对各个服务的请求
这些服务由Eureka来完成服务发现和治理
由网关服务提供统一的访问入口
通过断路器仪表盘检测断路情况
四、基础设施
包括:Mysql、Redis、Rabbitmq、Elaticsearch
硬件规划
最低要求
下列服务器,默认均为4核8G配置
基础设施
内容 | 台数 | 说明 |
---|---|---|
Mysql | & | 建议使用云服务 |
Redis | & | 建议使用云服务 |
elasticsearch | 3主3从 | |
rabbimq | 3主3从 |
总计:2台 节点交叉部署
UI
内容 | 台数 | 说明 |
---|---|---|
buyer-wap + buyer-pc + 静态页 | 1 | 买家端 |
manager-admin + manager-seller | 1 | 管理端和卖家端 |
总计:2台
服务
内容 | 台数 | 说明 |
---|---|---|
系统服务 +会员服务+ 商品服务 | 1 | |
交易服务 +分销服务+ 统计服务 + 消费者服务 | 1 | |
eureka + 网关服务 + 配置中心 + hystrix | 1 |
总计:3 台
K8sMaster node
内容 | 台数 | 说明 |
---|---|---|
K8s 管理节点 | 1 | 不建议其他服务部署在master节点上 |
共计:8台节点
微服务最低配置要求8台 4核8g服务器,具体部署需要根据您的实际情况进行扩展。
软件版本要求
项目 | 版本 |
---|---|
服务器 | centos7.x |
mysql | 5.6 |
redis | 5.0.4 |
elasticsearch | 6.x |
rabbimq | 3.x |
注意
以上标注需要提前准备的相关信息请客户以为文档方式提供。
-
如果部署完成后,因客户没有提前准备好相关账号信息,部分功能无法正常使用,我们不提供后续的配置服务,举例:
- ssl证书没有准备好,我们部署http站点,后续不提供更换https服务。
客户任何涉及到部署相关信息的变更,需要客户提供变更文档并且签字。
基础设施部署
基础设施请采用docker部署,
请注意关闭防火墙防火墙或开放相关端口
关闭防火墙:
systemctl stop firewalld &&\
systemctl disable firewalld
docker安装
sudo yum install -y yum-utils device-mapper-persistent-data lvm2
sudo yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
sudo yum install docker-ce-18.03.1.ce
systemctl enable docker
systemctl start docker
部署elasticsearch
建立数据存储目录:
mkdir -p /opt/data/esdata
chmod -R 777 /opt/data/esdata
配置扩展词典api:
elasticsearch使用管理端维护的分词,需要修改IKAnalyzer.cfg.xml中的remote_ext_dict配置路径
IKAnalyzer.cfg.xml需要手动创建文件,文件具体内容参考下面代码:
IK Analyzer 扩展配置
http://api.base.test.com/load-customwords?secret_key=secret_value
其中域名要根据实际规划的域名进行配置,在此处设置secret_key的值需要记录下,所有部署完成后,需要在管理端进行保存
配置文件修改完成后可使用以下命令进行文件挂载
docker run --rm -d --name elasticsearch -v /opt/data/esdata:/usr/share/elasticsearch/data -v /opt/ik/IKAnalyzer.cfg.xml:/usr/share/elasticsearch/plugins/ik/config/IKAnalyzer.cfg.xml -p 9200:9200 -p 9300:9300 -e "discovery.type=single-node" registry.cn-beijing.aliyuncs.com/javashop-k8s-images/elasticsearch:6.2.2
注意IKAnalyzer.cfg.xml文件路径,要在物理机上真实存在
默认cluster-name是docker-cluster
验证:
http://:9200/_cluster/health
部署rabbimq
建立数据存储目录:
mkdir -p /opt/data/mqdata
chmod -R 777 /opt/data/mqdata
运行mq:
docker run --rm -d --hostname rabbit \
-p 15672:15672 -p 5672:5672 -p 25672:25672 -p 4369:4369 -p 35672:35672 \
-v /opt/data/mqdata:/var/lib/rabbitmq \
-e RABBITMQ_ERLANG_COOKIE='MY-SECRET-KEY' \
--name rabbitmq registry.cn-beijing.aliyuncs.com/javashop-k8s-images/rabbitmq:3.6.14
安全起见,请修改上述 RABBITMQ_ERLANG_COOKIE 的值(任意字串)
默认用户名密码是guest/guest
建议修改guest的密码,切创建自己的vhost和用户
部署redis:
建立数据目录
mkdir -p /opt/data/redisdata
chmod -R 777 /opt/data/redisdata
运行reids
docker run --rm -d -p 6379:6379 \
-v /opt/data/redisdata:/data \
--name redis registry.cn-beijing.aliyuncs.com/javashop-k8s-images/redis:5.0.4-alpine \
redis-server --appendonly yes
部署mysql
如果使用阿里云数据库请跳过此步
mkdir -p /home/mysql/{conf,logs,data/mysql}
vi /home/mysql/conf/my.cnf
粘贴如下内容:
[mysqld]
pid-file = /var/run/mysqld/mysqld.pid
socket = /var/run/mysqld/mysqld.sock
datadir = /var/lib/mysql
secure-file-priv= NULL
# Disabling symbolic-links is recommended to prevent assorted security risks
symbolic-links=0
lower_case_table_names=1
# Custom config should go here
!includedir /etc/mysql/conf.d/
运行mysql容器:
docker run --rm -d -p 3306:3306 -e MYSQL_ROOT_PASSWORD=123456 --name mysql -v /home/mysql/conf/my.cnf:/etc/mysql/my.cnf -v /home/mysql/logs:/logs -v /home/mysql/data/mysql:/var/lib/mysql registry.cn-beijing.aliyuncs.com/javashop-k8s-images/mysql:5.6.35
请修改 MYSQL_ROOT_PASSWORD 的值来修改root的密码
您需要创建如下数据库:
-- 创建系统库
CREATE DATABASE IF NOT EXISTS system DEFAULT CHARSET utf8 COLLATE utf8_bin;
-- 创建商品库
CREATE DATABASE IF NOT EXISTS goods DEFAULT CHARSET utf8 COLLATE utf8_bin;
-- 创建会员库
CREATE DATABASE IF NOT EXISTS member DEFAULT CHARSET utf8 COLLATE utf8_bin;
-- 创建交易库
CREATE DATABASE IF NOT EXISTS trade DEFAULT CHARSET utf8 COLLATE utf8_bin;
-- 创建统计库
CREATE DATABASE IF NOT EXISTS statistics DEFAULT CHARSET utf8 COLLATE utf8_bin;
-- 创建分销库
CREATE DATABASE IF NOT EXISTS distribution DEFAULT CHARSET utf8 COLLATE utf8_bin;
-- xxl-job库
CREATE DATABASE IF NOT EXISTS xxl_job DEFAULT CHARSET utf8 COLLATE utf8_bin;
如果您要使用其它数据库的名字,请修改相应库名
安装静态页(openresty)
下载所需的配置文件:
请参考"git部署公钥指南"先配置好部署公钥
git clone [email protected]:enation/deploy-script.git
编辑配置文件:
vi /opt/deploy-script/openresty/lua/single_connector.lua
修改相应的redis配置:
local ok, err = red:connect("192.168.2.5", 6379)
修改访问静态页异常重定向地址
ngx.redirect("https://www.test.com/404.html")
启动openresty:
docker run --rm -d --name openresty -p 8081:80 -v /opt/deploy-script/openresty/:/usr/local/openresty/nginx/conf/ registry.cn-beijing.aliyuncs.com/javashop-k8s-images/openresty:nok8s-v1
验证
首先在redis中执行如下命令:
set /PC/index.html 'hello pc'
set /WAP/index.html 'hello wap'
然后分别访问:
http://ip:8081/PC/index.html
http://ip:8081/WAP/index.html
安装数据
docker run --rm -d -p 7005:7005 --name=deploy registry.cn-beijing.aliyuncs.com/javashop-k8s-images/deploy:7.1.5
启动deploy工程,访问:
http://ip:7005/view/deploy/list
配置好数据库信息,然后执行安装,详细请见《安装程序使用指南》
最后注意要停止上述容器:
docker stop deploy
部署xxl-job
docker run --rm -e PARAMS="--spring.datasource.url=jdbc:mysql://127.0.0.1:3306/xxl_job?Unicode=true&characterEncoding=UTF-8 --spring.datasource.username=root --spring.datasource.password=123456" -p 8080:8080 -v /tmp:/data/applogs --name xxl-job-admin -d registry.cn-beijing.aliyuncs.com/javashop-k8s-images/xxl-job-admin:2.0.0
请修改相应密码为在"安装数据"步骤中设定的xxl-job数据库的密码
注意:这里的密码不支持特殊字符
部署seata
一、下载seata:
mkdir -p /opt
cd /opt
wget http://www.javamall.com.cn/docker/seata-server-1.0.0.tar.gz
或者
mkdir -p /opt
cd /opt
wget https://github.com/seata/seata/releases/download/v1.0.0/seata-server-1.0.0.tar.gz
二、建立数据库
1、创建数据库:
CREATE DATABASE IF NOT EXISTS seata DEFAULT CHARSET utf8 COLLATE utf8_bin;
2、建立表结构:
在数据库中执行脚本:seata数据库脚本
三、运行seata:
1、修改配置文件
seata所在目录/conf/file.conf
修改数据库配置:
## transaction log store, only used in seata-server
store {
#其他配置,省略...
db {
#其他配置,省略...
driver-class-name = "com.mysql.jdbc.Driver"
#修改为seata数据库地址
url = "jdbc:mysql://192.168.2.13:3306/seata"
#修改为seata数据库的用户名和密码
user = "root"
password = "123456"
}
}
2、启动seata
进入到seata/bin目录:
./seata-server.sh -h 127.0.0.1 -p 8091
四、修改javashop中的seata配置:
重点在于如下配置:
seata:
enabled: true #开启seata
#其他配置详细见下面,这里略...
service:
vgroup-mapping: default
grouplist: seata server所在ip:8091 #这里要配置刚刚启动的seata的机器ip
enable-degrade: false
一下为完整的seata配置:
seata:
enabled: true #开启seata
application-id: javashop
tx-service-group: javashopt_tx_group
client:
rm-async-commit-buffer-limit: 1000
rm-report-retry-count: 5
rm-table-meta-check-enable: false
rm-report-success-enable: true
rm:
lock:
lock-retry-interval: 10
lock-retry-times: 30
lock-retry-policy-branch-rollback-on-conflict: true
tm-commit-retry-count: 5
tm-rollback-retry-count: 5
support:
spring:
datasource-autoproxy: true
undo:
undo-data-validation: true
undo-log-serialization: jackson
undo-log-table: undo_log
client:
log:
exceptionRate: 100
service:
vgroup-mapping: default
grouplist: 127.0.0.1:8091
enable-degrade: false
disable-global-transaction: false
transport:
shutdown:
wait: 3
thread-factory:
boss-thread-prefix: NettyBoss
worker-thread-prefix: NettyServerNIOWorker
server-executor-thread-prefix: NettyServerBizHandler
share-boss-worker: false
client-selector-thread-prefix: NettyClientSelector
client-selector-thread-size: 1
client-worker-thread-prefix: NettyClientWorkerThread
type: TCP
server: NIO
heartbeat: true
serialization: seata
compressor: none
enable-client-batch-send-request: true
config:
type: file
file:
name: file.conf
registry:
type: file
file:
name: file.conf
五、验证:
正常启动javashop工程则分布式事务已经生效
API部署
安装jdk
下载jdk
mkdir -p /opt
cd /opt
wget http://www.javamall.com.cn/docker/jdk-8u121-linux-x64.tar.gz
解压缩并重命名:
tar -xzvf jdk-8u121-linux-x64.tar.gz
配置环境变量:
vi /etc/profile
在文件的最后配置如下内容:
JAVA_HOME=/opt/jdk8
JRE_HOME=/opt/jdk8/jre
CLASS_PATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar:$JRE_HOME/lib
PATH=$PATH:$JAVA_HOME/bin:$JRE_HOME/bin
export JAVA_HOME JRE_HOME CLASS_PATH PATH
注意可能存在已有配置,请修改为正确的路径
使配置文件生效:
source /etc/profile
验证
java -version
如果不正确,可能需要退出重新登录
安装maven
cd /opt
wget http://mirrors.tuna.tsinghua.edu.cn/apache/maven/maven-3/3.6.0/binaries/apache-maven-3.6.0-bin.tar.gz
tar -xzvf apache-maven-3.6.0-bin.tar.gz
配置环境变量:
vi /etc/profile
在文件的最后配置如下内容(增加MAEN_HOME并修改path):
#其它略MAVEN_HOME=/opt/apache-maven-3.6.0PATH=$PATH:$JAVA_HOME/bin:$JRE_HOME/bin:$MAVEN_HOME/bin#其它略
注意可能存在已有配置,请修改为正确的路径
使配置文件生效:
source /etc/profile
验证
mvn -v
配置maven私服
vi /opt/apache-maven-3.6.0/conf/settings.xml
在profiles节点中新增一个profile节点:
alimaven
alimaven
aliyun maven
http://maven.aliyun.com/nexus/content/groups/public/
true
true
在activeProfiles节点中新增一个activeProfile 节点:
alimaven
clone源码
在这之前,请您参考"git部署公钥指南"
作为规范,我们约定源码全部放在 /opt/source目录中,jar放在/opt/server中
mkdir -p /opt/server
mkdir -p /opt/source
cd /opt/source
clone我们需要的源码:
git clone [email protected]:enation/microservice.git
git clone [email protected]:enation/microservice-config.git
进行初次编译
cd /opt/source/microservice
运行配置中心
修改配置文件
vi /opt/source/microservice-config/application.yml
具体请参考:配置中心指南
请配置好数据库、elasticsearch、redis、rabbitmq等这些基础设施
运行配置中心
首先在你的服务器上执行如下命令:
nohup java -Xmx512m -Xms256m -Xss256k -jar /opt/source/microservice/config-server/target/config-server-7.1.5.jar &
验证
访问http://localhost:8888/goods-service/dev
运行其它API
建立配置文件
mkdir -p /opt/server/{config,logs}
vi /opt/server/config/bootstrap.yml
粘贴如下配置
spring:
cloud:
config:
uri: http://localhost:8888
profile: dev
上述配置将api的配置中心指为本机
建立执行脚本
vi /opt/server/start.sh
粘贴如下内容:
#!/bin/bash
#版本
verson=7.2.0
#要部署的分支
branch=hotfix_7.2.0
#源文件存储目录
source_dir=/opt/source/microservice
#程序运行时目录
server_dir=/opt/server
#要运行的api
apis=("sba-server" "goods-service" "trade-service" "member-service" "statistics-service" "distribution-service" "consumer" "gateway-service")
#杀死进程
ps -ef |grep java |grep eureka |grep -v 'grep'|awk '{print $2}' | xargs kill -9
ps -ef |grep java |grep system |grep -v 'grep'|awk '{print $2}' | xargs kill -9
for api_name in ${apis[@]}
do
ps -ef |grep java |grep $api_name |grep -v 'grep'|awk '{print $2}' | xargs kill -9
done
mkdir -p $server_dir"/logs"
#更新源码
cd $source_dir
git reset --hard $branch
git pull
mvn clean install -DskipTests -f pom.xml
rm -rf $server_dir"/*.jar"
#这两个服务需要先启动
mv $source_dir"/discovery-service/target/eureka-"$verson".jar" $server_dir
mv $source_dir"/system-service/target/system-service-"$verson".jar" $server_dir
for api_name in ${apis[@]}
do
mv $source_dir"/"$api_name"/target/"$api_name"-"$verson.jar $server_dir
done
cd $server_dir
nohup java -Xmx512m -Xms256m -Xss256k -jar eureka-$verson.jar> logs/eureka.out &
sleep 20
nohup java -Xmx512m -Xms256m -Xss256k -jar system-service-$verson.jar> logs/system.out &
sleep 30
for api_name in ${apis[@]}
do
nohup java -Xmx512m -Xms256m -Xss256k -jar $api_name"-"$verson.jar > $server_dir"/logs/"$api_name".out" &
done
执行脚本:
sh start.sh
以后更新部署时,直接执行此脚本即可
验证
http://ip:8000
验证相关的服务是否注册在了eureka上
spring-boot-admin监控访问
http://ip:8012
admin/admin
Git部署公钥指南
执行此命令,会生成公钥和私钥两个文件
ssh-keygen -t rsa
执行此命令,进入目录
cd /root/.ssh/
执行此命令,查看公钥
cat id_rsa.pub
复制公钥信息
登录码云-点击设置-找到安全设置下的ssh公钥-把复制的公钥粘贴到公钥出,点击确定按钮
安全连接建立完成
Redis配置说明
概览
redis:
type: standalone #:可选值: cluster,sentinel,standalone
config :
type: manual #配置类型,可选的有:manual(手动),rest(rest api配置)
host: 192.168.2.5
port: 6379
password:
maxIdle: 500
maxTotal: 500
maxWaitMillis: -1
手工搭建redis
standalone式配置
如果采用手动配置标准式redis,则核心配置为:
redis:
type: standalone
config:
type: manual
host: 192.168.2.5
port: 6379
password: yourpwd
maxIdle: 500
maxTotal: 500
maxWaitMillis: -1
集群配置
redis:
type: cluster
config:
type: manual
cluster:
nodes: ip1:6379,ip2:6379 #集群节点
password: yourpwd
maxIdle: 500
maxTotal: 500
maxWaitMillis: -1
注:基于swarm式的可伸缩式集群,上述ip只需要配置为所有swarm node的ip即可
哨兵配置
redis:
type: sentinel
config:
type: manual
host: 192.168.2.5
sentinel:
master: mymaster #哨兵master名称
nodes: ip2:6379,ip2:6379 #哨兵节点
port: 6379
password: yourpwd
maxIdle: 500
maxTotal: 500
maxWaitMillis: -1
sohu tv的cache cloud方式 搭建redis
如果采用sohu tv的cache cloud 来管理redis,核心配置 :
redis:
type: standalone
config:
type: rest
restUrl: http://ip:8585 #cache cloud的rest api地址
restAppid: 1000 #cache cloud中的appid
restClientVersion: 1.0-SNAPSHOT #不用变
连接池配置
配置项 | 说明 | 示例 |
---|---|---|
redis.maxIdle | 最大空闲数 | 100 |
redis.maxTotal | 最大连接数 | 100 |
redis.maxWaitMillis | 获取连接时的最大等待毫秒数,-1为不超时 | 1000 |