云原生Java架构实战 K8s+Docker+KubeSphere+DevOps(下)

云原生Java架构实战 K8s+Docker+KubeSphere+DevOps(下)

  • 应用部署实战
    • ruo-yi-cloud
      • 本地环境nacos启动
      • 导入ruoyi数据库
    • ruo-yi-cloud上云
    • Java微服务上云
      • 云上环境Dockerfile配置
      • 微服务上云流程分析
      • 镜像推送
      • 服务创建
      • 前段上云&测试
      • nacos的存活探针
  • DevOps
    • DevOps基础
    • 尚医通上云
      • 中间件部署
      • 生产环境配置抽离
    • 创建DevOps工程
      • 可视化Pipeline
  • end

应用部署实战

ruo-yi-cloud

1、项目
https://gitee.com/y_project/RuoYi-Cloud

2、架构
云原生Java架构实战 K8s+Docker+KubeSphere+DevOps(下)_第1张图片

下载项目

本地环境nacos启动

单机模式mysql启动nacos,nacos conf/application.properties配置文件添加如下配置,并运行目录下的sql文件

spring.datasource.platform=mysql
db.num=1
db.url.0=jdbc:mysql://127.0.0.1:3306/nacos?characterEncoding=utf8&connectTimeout=1000&socketTime=3000&autoReconnect=true
db.user.0=root
db.password.0=123456

导入ruoyi数据库

生成了一个ry-config数据

更改nacos配置,使其连接到新创建的数据库

db.url.0=jdbc:mysql://127.0.0.1:3306/ry-config?characterEncoding=utf8&connectTimeout=1000&socketTime=3000&autoReconnect=true

再创建ry-cloud数据库导入数据表
在这里插入图片描述

启动前段项目

cd ruoyi-ui/
npm install --registry=https://registry.npm.taobao.org
npm run dev

ruo-yi-cloud上云

1、迁移数据库
三个表

2、nacos上云

将nacos部署为有状态应用,这样才能有固定的域名访问,将来服务奔溃后重新拉起分配的IP改变但是域名没有改变,这就是有状态应用和无状态应用的区别

创建有状态服务
云原生Java架构实战 K8s+Docker+KubeSphere+DevOps(下)_第2张图片
云原生Java架构实战 K8s+Docker+KubeSphere+DevOps(下)_第3张图片
先不挂载外部配置文件,分析nacos的集群配置

服务创建完毕,开两台副本发现命名规则
云原生Java架构实战 K8s+Docker+KubeSphere+DevOps(下)_第4张图片
ping分配的服务地址DNS,返回真实ping地址,发现命名规则

 ping mall-naos.mall
 64 bytes from mall-naos-v1-0.mall-naos.mall.svc.cluster.local (192.168.169.158): icmp_seq=2 ttl=64 time=0.029 ms

那么这两台pod的地址久分别为,为集群分配的固定域名访问

mall-naos-v1-0.mall-naos.mall.svc.cluster.local
mall-naos-v1-1.mall-naos.mall.svc.cluster.local

进入容器查看配置文件都在/home/nacos/conf

两个核心配置文件 application.properties cluster.conf集群配置文件挂载,配置文件子路径挂载,不要被容器内的这两个配置文件覆盖


重新创建nacos有状态应用

云原生Java架构实战 K8s+Docker+KubeSphere+DevOps(下)_第5张图片

将两个配置文件都以特定的建和路径挂载,以免被覆盖
注意修改数据库地址为集群内的mysql

云原生Java架构实战 K8s+Docker+KubeSphere+DevOps(下)_第6张图片

Java微服务上云

云上环境Dockerfile配置

FROM openjdk:8-jdk
LABEL maintainer=zhuazhu

#docker run -e PARAMS="--server.port 9090"
ENV PARAMS="--server.port=8080 --spring.profiles.active=prod --spring.cloud.nacos.discovery.server-addr=his-nacos.his:8848 --spring.cloud.nacos.config.server-addr=his-nacos.his:8848 --spring.cloud.nacos.config.namespace=prod --spring.cloud.nacos.config.file-extension=yml"
RUN /bin/cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime && echo 'Asia/Shanghai' >/etc/timezone

COPY target/*.jar /app.jar
EXPOSE 8080

#
ENTRYPOINT ["/bin/sh","-c","java -Dfile.encoding=utf8 -Djava.security.egd=file:/dev/./urandom -jar app.jar ${PARAMS}"]

规则:
1、容器默认以8080端口启动
2、时间为CST
3、环境变量 PARAMS 可以动态指定配置文件中任意的值(指定了配置文件 应用名-prod.yml)
4、nacos集群内地址为 his-nacos.his:8848
5、微服务默认启动加载 nacos中 服务名-激活的环境.yml 文件,所以线上的配置可以全部写在nacos中。

准备好nacos的命名空间prod并将dev空间的配置文件克隆至prod空间

微服务上云流程分析

云原生Java架构实战 K8s+Docker+KubeSphere+DevOps(下)_第7张图片

将各个微服务模块打包
云原生Java架构实战 K8s+Docker+KubeSphere+DevOps(下)_第8张图片

整体上传至服务器

镜像推送

挨个执行镜像构建打包

cd ruoyi-auth/
docker build -t ruoyi-auth:v1 -f dockerfile .

打包完成后再阿里云的容器镜像服务中个人实例创建一个命名空间仓库

# 改成自己登录阿里云的账号,登录阿里云镜像仓库
docker login --username=[email protected] registry.cn-hangzhou.aliyuncs.com

#把本地镜像,改名,成符合阿里云名字规范的镜像。
docker tag [ImageId] registry.cn-hangzhou.aliyuncs.com/zhu_ruoyi/镜像名:[镜像版本号]
# 试例
# docker tag 461955fe1e57 registry.cn-hangzhou.aliyuncs.com/zhu_ruoyi/ruoyi-visual-monitor:v2

docker push registry.cn-hangzhou.aliyuncs.com/zhu_ruoyi/镜像名:[镜像版本号]
# 试例
# docker push registry.cn-hangzhou.aliyuncs.com/lfy_ruoyi/ruoyi-visual-monitor:v1
docker tag 9e5e5f4a8b88 registry.cn-hangzhou.aliyuncs.com/zhu_ruoyi/ruoyi-visual-monitor:v2
docker tag ece0d4dad3e0 registry.cn-hangzhou.aliyuncs.com/zhu_ruoyi/ruoyi-system:v2
docker tag 04aeddb539ca registry.cn-hangzhou.aliyuncs.com/zhu_ruoyi/ruoyi-job:v2
docker tag 8ceee5721625 registry.cn-hangzhou.aliyuncs.com/zhu_ruoyi/ruoyi-gateway:v2
docker tag ca68bd4945fd registry.cn-hangzhou.aliyuncs.com/zhu_ruoyi/ruoyi-file:v2
docker tag a425688539cc registry.cn-hangzhou.aliyuncs.com/zhu_ruoyi/ruoyi-auth:v2


docker push registry.cn-hangzhou.aliyuncs.com/zhu_ruoyi/ruoyi-visual-monitor:v2
docker push registry.cn-hangzhou.aliyuncs.com/zhu_ruoyi/ruoyi-system:v2
docker push registry.cn-hangzhou.aliyuncs.com/zhu_ruoyi/ruoyi-job:v2
docker push registry.cn-hangzhou.aliyuncs.com/zhu_ruoyi/ruoyi-gateway:v2
docker push registry.cn-hangzhou.aliyuncs.com/zhu_ruoyi/ruoyi-file:v2
docker push registry.cn-hangzhou.aliyuncs.com/zhu_ruoyi/ruoyi-auth:v2

服务创建

创建无状态服务
云原生Java架构实战 K8s+Docker+KubeSphere+DevOps(下)_第9张图片
同步主机时区

启动后查看服务启动日志,有报错

NacosException: Nacos cluster is running with 1.X mode

错误为当前是nacos的1.x集群模式,需要改成2模式

将nacos改为单节点模式不以集群运行,修改启动配置添加启动时环境变量

云原生Java架构实战 K8s+Docker+KubeSphere+DevOps(下)_第10张图片

报错,数据库连接错误,排查数据库忽略大小写

gateway报错,9848,因为本地文件配置了sentinel,所以更改配置文件,将这段放置线上,用线上覆盖本地

因为nacos做流量保护的配置没改到,放到线上就可覆盖

云原生Java架构实战 K8s+Docker+KubeSphere+DevOps(下)_第11张图片

前段上云&测试

更改根目录下vue.config.js中网关地址为已上线的gateway地址

云原生Java架构实战 K8s+Docker+KubeSphere+DevOps(下)_第12张图片

npm run build:prod

打包完成生产dist文件,前段所有文件在其中,将其放入nginx静态目录即可

修改nginx中负载均衡的网关地址
localhost只处理本机请求改为_任意请求
云原生Java架构实战 K8s+Docker+KubeSphere+DevOps(下)_第13张图片

打包上传

创建无状态服务,TCP80,外网访问NodePort

nacos的存活探针

重启服务器时,mysql后于nacos启动,导致nacos启动失败,微服务注册不了,启动失败

启动20秒后检查设置的请求,超时时间3s
云原生Java架构实战 K8s+Docker+KubeSphere+DevOps(下)_第14张图片

DevOps

DevOps基础

1、DevOps简介
DevOps 是一系列做法和工具,可以使 IT 和软件开发团队之间的流程实现自动化。其中,随着敏捷软件开发日趋流行,持续集成 (CI) 和持续交付 (CD) 已经成为该领域一个理想的解决方案。在 CI/CD 工作流中,每次集成都通过自动化构建来验证,包括编码、发布和测试,从而帮助开发者提前发现集成错误,团队也可以快速、安全、可靠地将内部软件交付到生产环境。
云原生Java架构实战 K8s+Docker+KubeSphere+DevOps(下)_第15张图片

尚医通上云

1、项目架构

yygh-parent
|---common                                  //通用模块
|---hospital-manage                      //医院后台				[9999]   
|---model										//数据模型
|---server-gateway						//网关    				[80]
|---service									//微服务层
|-------service-cmn						//公共服务				[8202]
|-------service-hosp						//医院数据服务		[8201]
|-------service-order						//预约下单服务		[8206]
|-------service-oss						//对象存储服务		[8205]
|-------service-sms						//短信服务				[8204]
|-------service-statistics				//统计服务				[8208]
|-------service-task						//定时服务				[8207]
|-------service-user						//会员服务				[8203]


====================================================================

yygh-admin									//医院管理后台		[9528]
yygh-site										//挂号平台				[3000]

2、中间件

中间件 集群内地址 外部访问地址
Nacos his-nacos.his .
.
.
.
.
.
.

云原生Java架构实战 K8s+Docker+KubeSphere+DevOps(下)_第16张图片

中间件部署

1、sentinel
有状态服务,镜像地址
leifengyang/sentinel:1.8.2

2、mongeodb
应用负载-应用-部署新应用-来自应用模版
从之前设置的bitnami仓库中拉取镜像,只关闭账号密码访问,其他不变

3、mysql
数据库数据初始化,导入数据

生产环境配置抽离

将本地配置文件复制一份至nacos的prod空间,为所有应用修改好配置

创建DevOps工程

创建DevOps工程,而后创建流水线,只输入名称创建完成,而后编辑流水线,生成一个流水线模版,不做改动保存此模版,再以后在此模版基础上做改动

可视化Pipeline

编辑流水线

1、拉取代码

maven代理,git 拉取,ls -al
云原生Java架构实战 K8s+Docker+KubeSphere+DevOps(下)_第17张图片

2、项目编译

设置集群拉取时的maven镜像仓库

admin登录kubesphere,集群管理-配置中心-配置-ksdevops-agent-修改配置-添加mirror标签

编辑流水线,添加步骤,maven容器
shell mvn clean package -Dmaven.test.skip=true
云原生Java架构实战 K8s+Docker+KubeSphere+DevOps(下)_第18张图片

3、构建镜像

docker build -t hospital-manage:latest -f hospital-manage/Dockerfile ./hospital-manage/
云原生Java架构实战 K8s+Docker+KubeSphere+DevOps(下)_第19张图片
测试单个打包成功

并发构建

此时编辑dockerfile更快捷

4、推送镜像

嵌套步骤中添加凭证,将凭证中的账号密码输出到环境变量中
云原生Java架构实战 K8s+Docker+KubeSphere+DevOps(下)_第20张图片

stage('推送镜像') {
   steps {
     container('maven') {
       //加载凭证中的爱里云镜像仓库账号密码
       withCredentials([usernamePassword(credentialsId : 'aliyun-docker-registry' ,usernameVariable : 'DOCKER_USER_VAR' ,passwordVariable : 'DOCKER_PWD_VAR' ,)]) {
         sh 'echo "$DOCKER_PWD_VAR" | docker login $REGISTRY -u "$DOCKER_USER_VAR" --password-stdin'
         sh 'docker tag hospital-manage:latest $REGISTRY/$DOCKERHUB_NAMESPACE/hospital-manage:SNAPSHOT-$BUILD_NUMBER'  
         sh 'docker push  $REGISTRY/$DOCKERHUB_NAMESPACE/hospital-manage:SNAPSHOT-$BUILD_NUMBER'
       }
     }

   }
}

云原生Java架构实战 K8s+Docker+KubeSphere+DevOps(下)_第21张图片

5、部署到dev环境

可以添加审核步骤,@项目中的其他人来确认审核,这里不做审核

根据配置文件yml来部署镜像

  • 给每一个微服务准备一个 deploy.yaml(k8s的部署配置文件)
  • 执行以下步骤
    云原生Java架构实战 K8s+Docker+KubeSphere+DevOps(下)_第22张图片
  • 传入 deploy.yaml 的位置就能部署
    ○ kubectl apply -f xxxx

在k8s集群中,默认在非master节点中是无法执行apply配置文件部署的,需要获取到授权信息
云原生Java架构实战 K8s+Docker+KubeSphere+DevOps(下)_第23张图片

云原生Java架构实战 K8s+Docker+KubeSphere+DevOps(下)_第24张图片
由于每一个镜像都得登录阿里云镜像下载镜像,设置凭证名为aliyun-docker-hub,所以提前创建好此凭证
在这里插入图片描述
项目空间下-配置中-密钥-创建密钥

云原生Java架构实战 K8s+Docker+KubeSphere+DevOps(下)_第25张图片

云原生Java架构实战 K8s+Docker+KubeSphere+DevOps(下)_第26张图片

6、系统邮件功能

admin账号-平台设置-通知管理-邮件

end

你可能感兴趣的:(学习笔记,java,云原生,架构)