项目部署

部署准备工作

部署拓扑图

image.png

Kubernetes介绍

image.png

如上图所示每一个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

注意

  1. 以上标注需要提前准备的相关信息请客户以为文档方式提供。

  2. 如果部署完成后,因客户没有提前准备好相关账号信息,部分功能无法正常使用,我们不提供后续的配置服务,举例:

    1. ssl证书没有准备好,我们部署http站点,后续不提供更换https服务。
  3. 客户任何涉及到部署相关信息的变更,需要客户提供变更文档并且签字。

基础设施部署

基础设施请采用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

你可能感兴趣的:(项目部署)