【k8s】ruoyi微服务迁移到k8s

news/2024/3/29 1:24:49/文章来源:https://blog.csdn.net/Nightwish5/article/details/130308650

书接上回【传统方式部署Ruoyi微服务】,此刻要迁移至k8s。

环境说明

31 master , 32 node1 , 33 node2

迁移思路

交付思路:
其实和交付到Linux主机上是一样的,无外乎将这些微服务都做成了Docker镜像;
1、微服务数据层: MySQL、 Redis;2、微服务治理层: NACos、sentinel、 skywalking...3、微服务组件
3.1 将微服务编译为jar包;
3.2 将其构建成Docker镜像;
3.3根据服务情况选择对应的工作负载来进行交付;Deployment、Service、Ingress:system:Deployment;auth:Deployment;gateway: Deployment、 service;monitor: Deployment、 Service、 Ingressui:	Deployment、 Service、 Ingress;	nginx/haproxy

01-mysql (Service、StatefulSet)

kubectl create ns dev

01-mysql-ruoyi-sts-svc.yaml

apiVersion: v1
kind: Service
metadata:name: mysql-ruoyi-svcnamespace: dev
spec:clusterIP: Noneselector:app: mysqlrole: ruoyiports:- port: 3306targetPort: 3306---
apiVersion: apps/v1
kind: StatefulSet
metadata:name: mysql-ruoyinamespace: dev
spec:serviceName: "mysql-ruoyi-svc"replicas: 1selector:matchLabels:app: mysqlrole: ruoyitemplate:metadata:labels:app: mysqlrole: ruoyispec:containers:- name: dbimage: mysql:5.7args:- "--character-set-server=utf8"env:- name: MYSQL_ROOT_PASSWORDvalue: oldxu- name: MYSQL_DATABASEvalue: ry-cloudports:- containerPort: 3306volumeMounts:- name: datamountPath: /var/lib/mysql/volumeClaimTemplates:- metadata:name: dataspec:accessModes: ["ReadWriteMany"]storageClassName: "nfs"resources:requests:storage: 6Gi

解析mysql对应的IP

${statefulSetName}-${headlessName}.{namspace}.svc.cluster.local[root@master01 01-mysql]#  dig @10.96.0.10 mysql-ruoyi-0.mysql-ruoyi-svc.dev.svc.cluster.local +short
10.244.2.129

在这里插入图片描述

连接mysql,导入sql文件

yum install -y mysql
mysql -uroot -poldxu -h10.244.2.129
mysql -uroot -poldxu -h10.244.2.129 -B ry-cloud < ry_20220814.sql

02-redis/

(这里使用的是无状态部署,做缓存。 按情况而定也可参考mysql的部署方法,做成有状态部署来redis)
在这里插入图片描述

01-redis-deploy.yaml

apiVersion: apps/v1
kind: Deployment
metadata:name: redis-servernamespace: dev
spec:replicas: 1selector:matchLabels:app: redistemplate:metadata:labels:app: redisspec:containers:- name: cacheimage: redisports:- containerPort: 6379

02-redis-service.yaml

apiVersion: v1
kind: Service
metadata:name: redis-svcnamespace: dev
spec:selector:app: redisports:- port: 6379targetPort: 6379

验证redis

[root@master01 02-redis]# dig @10.96.0.10 redis-svc.dev.svc.cluster.local +short
10.111.240.148kubectl describe svc -n dev redis-svc

在这里插入图片描述

sudo yum install epel-release
sudo yum install redis
[root@master01 02-redis]# redis-cli -h 10.111.240.148

03-nacos/

官方的nacos k8s参考资料https://github.com/nacos-group/nacos-k8s/blob/master/README-CN.md
在这里插入图片描述
迁移思路:
在这里插入图片描述

安装nacos的mysql数据库

01-mysql-nacos-sts-svc.yaml

apiVersion: v1
kind: Service
metadata:name: mysql-nacos-svcnamespace: dev
spec:clusterIP: Noneselector:app: mysqlrole: nacosports:- port: 3306targetPort: 3306---
apiVersion: apps/v1
kind: StatefulSet
metadata:name: mysql-nacos-stsnamespace: dev
spec:serviceName: "mysql-nacos-svc"replicas: 1selector:matchLabels:app: mysqlrole: nacostemplate:metadata:labels:app: mysqlrole: nacosspec:containers:- name: dbimage: mysql:5.7args:- "--character-set-server=utf8"env:- name: MYSQL_ROOT_PASSWORDvalue: oldxu- name: MYSQL_DATABASEvalue: ry-configports:- containerPort: 3306volumeMounts:- name: datamountPath: /var/lib/mysql/volumeClaimTemplates:- metadata:name: dataspec:accessModes: ["ReadWriteMany"]storageClassName: "nfs"resources:requests:storage: 6Gi
[root@master01 03-nacos]# dig @10.96.0.10 mysql-nacos-sts-0.mysql-nacos-svc.dev.svc.cluster.local +short
10.244.2.130

在这里插入图片描述

导入config的sql文件

mysql -uroot -poldxu -h10.244.2.130 -B ry-config < ry_config_20220510.sql 

02-nacos-configmap.yaml

configmap(填写对应数据库地址、名称、端口、用户名及密码)

apiVersion: v1
kind: ConfigMap
metadata:name: nacos-cmnamespace: dev
data:mysql.host: "mysql-nacos-sts-0.mysql-nacos-svc.dev.svc.cluster.local"mysql.db.name: "ry-config"mysql.port: "3306"mysql.user: "root"mysql.password: "oldxu"

03-nacos-sts-deploy-svc.yaml

#可提前下载,因为镜像大小1GB多
docker pull nacos/nacos-peer-finder-plugin:1.1
docker pull nacos/nacos-server:v2.1.1#自动PV,引用pvc 、pod反亲和性保证每个节点部署一个pod、initContainer找到nacos集群的IP、
apiVersion: v1
kind: Service
metadata:name: nacos-svcnamespace: dev
spec:clusterIP: Noneselector:app: nacosports:- name: serverport: 8848targetPort: 8848- name: client-rpcport: 9848targetPort: 9848- name: raft-rpcport: 9849targetPort: 9849- name: old-raft-rpcport: 7848targetPort: 7848---apiVersion: apps/v1
kind: StatefulSet
metadata:name: nacosnamespace: dev
spec:serviceName: "nacos-svc"replicas: 3selector:matchLabels:app: nacostemplate:metadata:labels:app: nacosspec:affinity:                                                 # 避免Pod运行到同一个节点上了podAntiAffinity:requiredDuringSchedulingIgnoredDuringExecution:- labelSelector:matchExpressions:- key: appoperator: Invalues: ["nacos"]topologyKey: "kubernetes.io/hostname"  initContainers:- name: peer-finder-plugin-installimage: nacos/nacos-peer-finder-plugin:1.1imagePullPolicy: AlwaysvolumeMounts:- name: datanmountPath: /home/nacos/plugins/peer-findersubPath: peer-findercontainers:- name: nacosimage: nacos/nacos-server:v2.1.1resources:requests:memory: "800Mi"cpu: "500m"ports:- name: client-portcontainerPort: 8848- name: client-rpccontainerPort: 9848- name: raft-rpccontainerPort: 9849- name: old-raft-rpccontainerPort: 7848env:- name: MODE  value: "cluster"- name: NACOS_VERSIONvalue: 2.1.1- name: NACOS_REPLICASvalue: "3"- name: SERVICE_NAME value: "nacos-svc"- name: DOMAIN_NAME value: "cluster.local"- name: NACOS_SERVER_PORT   value: "8848"- name: NACOS_APPLICATION_PORTvalue: "8848"- name: PREFER_HOST_MODEvalue: "hostname"- name: POD_NAMESPACE      valueFrom:fieldRef:apiVersion: v1fieldPath: metadata.namespace- name: MYSQL_SERVICE_HOSTvalueFrom:configMapKeyRef:name: nacos-cmkey: mysql.host- name: MYSQL_SERVICE_DB_NAMEvalueFrom:configMapKeyRef:name: nacos-cmkey: mysql.db.name- name: MYSQL_SERVICE_PORTvalueFrom:configMapKeyRef:name: nacos-cmkey: mysql.port- name: MYSQL_SERVICE_USERvalueFrom:configMapKeyRef:name: nacos-cmkey: mysql.user- name: MYSQL_SERVICE_PASSWORDvalueFrom:configMapKeyRef:name: nacos-cmkey: mysql.passwordvolumeMounts:- name: datanmountPath: /home/nacos/plugins/peer-findersubPath: peer-finder- name: datanmountPath: /home/nacos/datasubPath: data- name: datanmountPath: /home/nacos/logssubPath: logsvolumeClaimTemplates:- metadata:name: datanspec:storageClassName: "nfs"accessModes: ["ReadWriteMany"]resources:requests:storage: 20Gi

访问验证:
http://nacos.oldxu.net:30080/nacos/
在这里插入图片描述

04-nacos-ingress.yaml

打#号的是新版本的写法

apiVersion: extensions/v1beta1    
kind: Ingress
metadata:name: nacos-ingressnamespace: dev
spec:ingressClassName: "nginx"rules:- host: nacos.oldxu.nethttp:paths:- path: /pathType: Prefixbackend:serviceName: nacos-svcservicePort: 8848#         service:
#         name: nacos-svc
#         port: 
#           name: server

04-sentinel/

sentinel迁移思路

Sentinel
1、编写Dockerfile 、entrypoint.sh
2、推送到Harbor镜像仓库;
3、使用Deployment就可以运行该镜像;
4、使用Service、 Ingress来讲 其对外提供访问;

编写sentinel的Dockerfile

#下载包
wget https://linux.oldxu.net/sentinel-dashboard-1.8.5.jar
docker login harbor.oldxu.net

Dockerfile 与 entrypoint.sh

Dockerfile

FROM openjdk:8-jre-alpine
COPY ./sentinel-dashboard-1.8.5.jar /sentinel-dashboard.jar
COPY ./entrypoint.sh /entrypoint.sh
RUN chmod +x /entrypoint.sh
EXPOSE 8718 8719
CMD ["/bin/sh","-c","/entrypoint.sh"]

entrypoint.sh

JAVA_OPTS="-Dserver.port=8718 \
-Dcsp.sentinel.dashboard.server=localhost:8718 \
-Dproject.name=sentinel-dashboard \
-Dcsp.sentinel.api.port=8719 \
-Xms${XMS_OPTS:-150m} \
-Xmx${XMX_OPTS:-150m}"java ${JAVA_OPTS} -jar /sentinel-dashboard.jar
[root@master01 04-sentinel]# ls
Dockerfile  entrypoint.sh  sentinel-dashboard-1.8.5.jardocker build -t harbor.oldxu.net/springcloud/sentinel-dashboard:v1.0 .
docker push harbor.oldxu.net/springcloud/sentinel-dashboard:v1.0

01-sentinel-deploy.yaml

kubectl create secret docker-registry harbor-admin \--docker-username=admin \--docker-password=Harbor12345 \--docker-server=harbor.oldxu.net \-n dev
apiVersion: apps/v1
kind: Deployment
metadata:name: sentinel-servernamespace: dev
spec:replicas: 1selector:matchLabels:app: sentineltemplate:metadata:labels:app: sentinelspec:imagePullSecrets:- name: harbor-admincontainers:- name: sentinelimage: harbor.oldxu.net/springcloud/sentinel-dashboard:v2.0ports:- name: servercontainerPort: 8718- name: apicontainerPort: 8719

02-sentinel-svc.yaml

apiVersion: v1
kind: Service
metadata:name: sentinel-svcnamespace: dev
spec:selector:app: sentinelports:- name: serverport: 8718targetPort: 8718- name: apiport: 8719targetPort: 8719

03-sentinel-ingress.yaml

写#号的是新版本的写法。

#apiVersion: networking.k8s.io/v1
apiVersion: extensions/v1beta1
kind: Ingress
metadata:name: sentinel-ingressnamespace: dev
spec:ingressClassName: "nginx"rules:- host: sentinel.oldxu.nethttp:paths:- path: /pathType: Prefixbackend:serviceName: sentinel-svcservicePort: 8718#service:#  name: sentinel-svc#  port:#    name: server

访问 http://sentinel.oldxu.net:30080/#/dashboard/metric/sentinel-dashboard
在这里插入图片描述

05-skywalking/

迁移思路
在这里插入图片描述

本次Skywalking采用内置H2作为存储,也可考虑采用ElasticSearch作为数据存储。
在这里插入图片描述

01-skywalking-oap-deploy.yaml


在这里插入图片描述

02-skywalking-ui-deploy.yaml

apiVersion: apps/v1
kind: Deployment
metadata:name: skywalking-uinamespace: dev
spec:replicas: 1selector:matchLabels:app: sky-uitemplate:metadata:labels:app: sky-uispec:containers:- name: uiimage: apache/skywalking-ui:8.9.1ports:- containerPort: 8080env:- name: SW_OAP_ADDRESSvalue: "http://skywalking-oap-svc:12800"
---
apiVersion: v1
kind: Service
metadata:name: skywalking-ui-svcnamespace: dev
spec:selector:app: sky-uiports:- name: uiport: 8080targetPort: 8080
[root@master01 05-skywalking]# dig @10.96.0.10 skywalking-oap-svc.dev.svc.cluster.local  +short
10.111.30.115

03-skywalking-ingress.yaml

带#号的是新版本的写法。

apiVersion: extensions/v1beta1
#apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:name: skywalking-ingress    namespace: dev
spec:ingressClassName: "nginx"rules:- host: sky.oldxu.nethttp:paths: - path: /pathType: Prefixbackend:serviceName: skywalking-ui-svcservicePort: 8080#service:#  name: skywalking-ui-svc#  port:#    name: ui

访问sky.oldxu.net:30080
在这里插入图片描述

04-skywalking-agent-demo.yaml (客户端demo)

将Skywalking-agent制作为Docker镜像,后续业务容器通过sidecar 模式挂载 agent

下载agent 和 制作dockerfile ,推送镜像

wget https://linux.oldxu.net/apache-skywalking-javaagent-8.8.0.tgz
wget https://linux.oldxu.net/apache-skywalking-java-agent-8.8.0.tgz[root@master01 04-skywalking-agent-demo]# cat Dockerfile 
FROM alpine
ADD ./apache-skywalking-java-agent-8.8.0.tgz /[root@master01 04-skywalking-agent-demo]# ls
apache-skywalking-java-agent-8.8.0.tgz  Dockerfile
docker build -t harbor.oldxu.net/springcloud/skywalking-java-agent:8.8 .
docker push harbor.oldxu.net/springcloud/skywalking-java-agent:8.8

#使用边车模式的思想来实现 (类似的有ELK收集Pod的日志)
业务容器通过sidecar模式挂载制作好的skywalking-agent镜像

apiVersion: apps/v1
kind: Deployment
metadata:name: skywalking-agent-demonamespace: dev
spec:replicas: 1selector:matchLabels:app: demotemplate:metadata:labels:app: demospec:imagePullSecrets:- name: harbor-adminvolumes:   #定义共享的存储卷- name: skywalking-agentemptyDir: {}initContainers: #初始化容器,将这个容器中的数据拷贝到共享的卷中- name: init-skywalking-agentimage: harbor.oldxu.net/springcloud/skywalking-java-agent:8.8command:- 'sh'- '-c'- 'mkdir -p /agent; cp -r /skywalking-agent/* /agent;'volumeMounts:- name: skywalking-agentmountPath: /agentcontainers:- name: webimage: nginxvolumeMounts:- name: skywalking-agentmountPath: /skywalking-agent/

06-service-all/ (ruoyi业务层面 system , auth , gateway ,monitor ,ui)

迁移思路
在这里插入图片描述

6.1 迁移微服务ruoyi-system

1 maven编译system项目

对应的路径及信息

cd /root/k8sFile/project/danji-ruoyi/guanWang
[root@node4 guanWang]# ls
logs  note.txt  RuoYi-Cloud  skywalking-agent  startServer.sh[root@node4 guanWang]# ls RuoYi-Cloud/
bin  docker  LICENSE  pom.xml  README.md  ruoyi-api  ruoyi-auth  ruoyi-common  ruoyi-gateway  ruoyi-modules  ruoyi-ui  ruoyi-visual  sql
[root@node4 RuoYi-Cloud]# pwd
/root/k8sFile/project/danji-ruoyi/guanWang/RuoYi-Cloud
[root@node4 RuoYi-Cloud]# ls
bin  docker  LICENSE  pom.xml  README.md  ruoyi-api  ruoyi-auth  ruoyi-common  ruoyi-gateway  ruoyi-modules  ruoyi-ui  ruoyi-visual  sql
[root@node4 RuoYi-Cloud]# [root@node4 RuoYi-Cloud]# mvn package -Dmaven.test.skip=true -pl ruoyi-modules/ruoyi-system/ -am

在这里插入图片描述

2 编写Dockerfile

vim ruoyi-modoles/ruoyi-system/DockerfileFROM openjdk:8-jre-alpine
COPY ./target/*.jar /ruoyi-modules-system.jar
COPY ./entrypoint.sh /entrypoint.sh
RUN chmod +x /entrypoint.sh
EXPOSE 8080
CMD ["/bin/sh","-c","/entrypoint.sh"]

3 编写entrypoint.sh

在此之前回顾传统部署system运行时的指令:

#启动ruoyi-system
nohup java -javaagent:./skywalking-agent/skywalking-agent.jar \
-Dskywalking.agent.service_name=ruoyi-system \
-Dskywalking.collector.backend_service=192.168.79.35:11800 \
-Dspring.profiles.active=dev \
-Dspring.cloud.nacos.config.file-extension=yml \
-Dspring.cloud.nacos.discovery.server-addr=192.168.79.35:8848 \
-Dspring.cloud.nacos.config.server-addr=192.168.79.35:8848 \
-jar RuoYi-Cloud/ruoyi-modules/ruoyi-system/target/ruoyi-modules-system.jar &>/var/log/system.log &
#entrypoint.sh
[root@node4 ruoyi-system]# cat entrypoint.sh 
#设定端口
PARAMS="--server.port=${Server_Port:-8080}"#JVM堆内存设置,
JAVA_OPTS="-Xms${XMS_OPTS:-150m} -Xmx${XMX_OPTS:-150m}"#Nacos相关选项
NACOS_OPTS=" \
-Djava.security.egd=file:/dev/./urandom \
-Dfile.encoding=utf8 \
-Dspring.profiles.active=${Nacos_Active:-dev} \
-Dspring.cloud.nacos.config.file-extension=yml \
-Dspring.cloud.nacos.discovery.server-addr=${Nacos_Server_Addr:-127.0.0.1:8848} \
-Dspring.cloud.nacos.config.server-addr=${Nacos_Server_Addr:-127.0.0.1:8848} 
"#skywalking选项:
#边车模式的initContainer将skywalking.jar塞到了pod里面。
SKY_OPTS="-javaagent:/skywalking-agent/skywalking-agent.jar \
-Dskywalking.agent.service_name=ruoyi-system \
-Dskywalking.collector.backend_service=${Sky_Server_Addr:-localhost:11800}
"# 启动命令(指定sky选项、jvm堆内存选项、jar包,最后跟上params参数)
java ${SKY_OPTS} ${NACOS_OPTS} ${JAVA_OPTS} -jar /ruoyi-modules-system.jar ${PARAMS}
#路径及文件信息
[root@node4 ruoyi-system]# ls
Dockerfile  entrypoint.sh  pom.xml  src  target

4 制作镜像和推送

docker build -t harbor.oldxu.net/springcloud/ruoyi-system:v1.0 .
docker push harbor.oldxu.net/springcloud/ruoyi-system:v1.0

5 修改system组件配置

通过Kubernetes运行system之前,先登录Nacos修改ruoyi-system-dev.yml的相关配置信息;
修改redis地址,新增sentienl字段、 mysql地址

# spring配置
spring:cloud:sentinel:eager: truetransport:dashboard: sentinel-svc.dev.svc.cluster.local:8718 redis:host: redis-svc.dev.svc.cluster.localport: 6379password: datasource:druid:stat-view-servlet:enabled: trueloginUsername: adminloginPassword: 123456dynamic:druid:initial-size: 5min-idle: 5maxActive: 20maxWait: 60000timeBetweenEvictionRunsMillis: 60000minEvictableIdleTimeMillis: 300000validationQuery: SELECT 1 FROM DUALtestWhileIdle: truetestOnBorrow: falsetestOnReturn: falsepoolPreparedStatements: truemaxPoolPreparedStatementPerConnectionSize: 20filters: stat,slf4jconnectionProperties: druid.stat.mergeSql\=true;druid.stat.slowSqlMillis\=5000datasource:# 主库数据源master:driver-class-name: com.mysql.cj.jdbc.Driverurl: jdbc:mysql://mysql-ruoyi-svc.dev.svc.cluster.local:3306/ry-cloud?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8username: rootpassword: oldxu# 从库数据源# slave:# username: # password: # url: # driver-class-name: # seata: true    # 开启seata代理,开启后默认每个数据源都代理,如果某个不需要代理可单独关闭# seata配置
seata:# 默认关闭,如需启用spring.datasource.dynami.seata需要同时开启enabled: false# Seata 应用编号,默认为 ${spring.application.name}application-id: ${spring.application.name}# Seata 事务组编号,用于 TC 集群名tx-service-group: ${spring.application.name}-group# 关闭自动代理enable-auto-data-source-proxy: false# 服务配置项service:# 虚拟组和分组的映射vgroup-mapping:ruoyi-system-group: defaultconfig:type: nacosnacos:serverAddr: 127.0.0.1:8848group: SEATA_GROUPnamespace:registry:type: nacosnacos:application: seata-serverserver-addr: 127.0.0.1:8848namespace:# mybatis配置
mybatis:# 搜索指定包别名typeAliasesPackage: com.ruoyi.system# 配置mapper的扫描,找到所有的mapper.xml映射文件mapperLocations: classpath:mapper/**/*.xml# swagger配置
swagger:title: 系统模块接口文档license: Powered By ruoyilicenseUrl: https://ruoyi.vip
#验证redis 、 mysql 、sentinel-svc
[root@master01 bin]# dig @10.96.0.10 redis-svc.dev.svc.cluster.local +short
10.111.240.148[root@master01 bin]# dig @10.96.0.10 sentinel-svc.dev.svc.cluster.local +short
10.111.31.36[root@master01 bin]# dig @10.96.0.10 mysql-ruoyi-svc.dev.svc.cluster.local +short
10.244.1.130

01-system-deploy.yaml

apiVersion: apps/v1
kind: Deployment
metadata:name: ruoyi-systemnamespace: dev
spec:replicas: 2selector:matchLabels:app: systemtemplate:metadata:labels:app: systemspec:imagePullSecrets:- name: harbor-adminvolumes:- name: skywalking-agentemptyDir: {}initContainers:- name: init-sky-java-agentimage: harbor.oldxu.net/springcloud/skywalking-java-agent:8.8command:- 'sh'- '-c'- 'mkdir -p /agent; cp -r /skywalking-agent/* /agent/;'volumeMounts:- name: skywalking-agentmountPath: /agentcontainers:- name: systemimage: harbor.oldxu.net/springcloud/ruoyi-system:v1.0env:- name: Nacos_Activevalue: dev- name: Nacos_Server_Addrvalue: "nacos-svc.dev.svc.cluster.local:8848"- name: Sky_Server_Addrvalue: "skywalking-oap-svc.dev.svc.cluster.local:11800"- name: XMS_OPTSvalue: 200m- name: XMX_OPTSvalue: 200mports:- containerPort: 8080livenessProbe:        tcpSocket:port: 8080initialDelaySeconds: 60periodSeconds: 10timeoutSeconds: 10volumeMounts:- name: skywalking-agentmountPath: /skywalking-agent/        

在这里插入图片描述

#验证nacos和 skywalking-oap
[root@master01 bin]# dig @10.96.0.10 nacos-svc.dev.svc.cluster.local +short
10.244.1.129
10.244.0.143
10.244.2.154[root@master01 bin]# dig @10.96.0.10 skywalking-oap-svc.dev.svc.cluster.local +short
10.111.30.115

登录nacos、sentinel、skywalking查看状态
nacos:
在这里插入图片描述
sentinel:
在这里插入图片描述
skywalking:
在这里插入图片描述

6.2 迁移微服务ruoyi-auth

1、编译auth项目

[root@node4 RuoYi-Cloud]# pwd
/root/k8sFile/project/danji-ruoyi/guanWang/RuoYi-Cloudmvn package -Dmaven.test.skip=true -pl ruoyi-auth/ -am

在这里插入图片描述

2、编写dockerfile和entrypoint.sh

``shell
[root@node4 ruoyi-auth]# pwd
/root/k8sFile/project/danji-ruoyi/guanWang/RuoYi-Cloud/ruoyi-auth
[root@node4 ruoyi-auth]# ls
Dockerfile entrypoint.sh pom.xml src target

dockerfile
```shell
FROM openjdk:8-jre-alpine
COPY ./target/*.jar /ruoyi-auth.jar
COPY ./entrypoint.sh /entrypoint.sh
RUN chmod +x /entrypoint.shEXPOSE 8080
CMD ["/bin/sh","-c","/entrypoint.sh"]

entrypoint.sh

[root@node4 ruoyi-auth]# cat entrypoint.sh 
# 设定端口,默认不传参则为8080端口       
PARAMS="--server.port=${Server_Port:-8080}"#JVM堆内存设定
JAVA_OPTS="-Xms${XMS_OPTS:-100M} -Xmx${XMX_OPTS:-100}"# Nacos相关选项
NACOS_OPTS="
-Djava.security.egd=file:/dev/./urandom \
-Dfile.encoding=utf8 \
-Dspring.profiles.active.file=${Nacos_Active:-dev} \
-Dspring.cloud.nacos.config.file-extension=yml \
-Dspring.cloud.nacos.discovery.server-addr=${Nacos_Server_Addr:-127.0.0.1:8848} \
-Dspring.cloud.nacos.config.server-addr=${Nacos_Server_Addr:-127.0.0.1:8848}
"#Skywalking相关选项
SKY_OPTS="
-javaagent:/skywalking-agent/skywalking-agent.jar \
-Dskywalking.agent.service_name=ruoyi-auth \
-Dskywalking.collector.backend_service=${Sky_Server_Addr:-localhost:11800}
"# 启动命令(指定sky选项、jvm堆内存选项、jar包,最后跟上params参数)
java ${SKY_OPTS} ${NACOS_OPTS} ${JAVA_OPTS} -jar /ruoyi-auth.jar ${PARAMS}

3、制作镜像,推送

docker build -t harbor.oldxu.net/springcloud/ruoyi-auth:v1.0 .
docker push harbor.oldxu.net/springcloud/ruoyi-auth:v1.0

4、去nacos修改ruoyi-auth-dev.yml

使用Kubernetes运行auth之前,先通过Nacos修改对应ruoyi-auth-dev.yml相关配置;

spring:cloud:sentinel:eager: truetransport:dashboard: sentinel-svc.dev.svc.cluster.local:8718 redis:host: redis-svc.dev.svc.cluster.localport: 6379password: 

5、02-auth-deploy.yaml

运行auth应用

[root@master01 06-all-service]# cat 02-auth-deploy.yaml 
apiVersion: apps/v1
kind: Deployment
metadata:name: ruoyi-authnamespace: dev
spec:replicas: 2selector:matchLabels:app: authtemplate:metadata:labels:app: authspec:imagePullSecrets:- name: harbor-adminvolumes:- name: skywalking-agentemptyDir: {}initContainers:- name: init-sky-java-agentimage: harbor.oldxu.net/springcloud/skywalking-java-agent:8.8command:- 'sh'- '-c'- 'mkdir -p /agent; cp -r /skywalking-agent/* /agent/;'volumeMounts:- name: skywalking-agentmountPath: /agentcontainers:- name: authimage: harbor.oldxu.net/springcloud/ruoyi-auth:v1.0env:- name: Nacos_Activevalue: dev- name: Nacos_Server_Addrvalue: "nacos-svc.dev.svc.cluster.local:8848"          - name: Sky_Server_Addrvalue: "skywalking-oap-svc.dev.svc.cluster.local:11800"- name: XMS_OPTSvalue: 200m- name: XMX_OPTSvalue: 200mports:- containerPort: 8080livenessProbe:tcpSocket:port: 8080initialDelaySeconds: 60periodSeconds: 10timeoutSeconds: 10volumeMounts:- name: skywalking-agentmountPath: /skywalking-agent/

在这里插入图片描述

6.3 迁移微服务ruoyi-gateway

1、编译gateway项目

[root@node4 RuoYi-Cloud]# pwd
/root/k8sFile/project/danji-ruoyi/guanWang/RuoYi-Cloud
[root@node4 RuoYi-Cloud]# ls
bin  docker  LICENSE  pom.xml  README.md  ruoyi-api  ruoyi-auth  ruoyi-common  ruoyi-gateway  ruoyi-modules  ruoyi-ui  ruoyi-visual  sql
mvn package -Dmaven.test.skip=true -pl ruoyi-gateway/ -am

在这里插入图片描述

2、编写dockerfile和entrypoint

[root@node4 ruoyi-gateway]# ls
Dockerfile  entrypoint.sh  pom.xml  src  target

Dockerfile

#如果使用alpine镜像(openjdk:8-jre-alpine),会出现[网关异常处理]请求路径:/code
FROM openjdk:8-jre
COPY ./target/*.jar /ruoyi-gateway.jar
COPY ./entrypoint.sh /entrypoint.sh
RUN chmod +x /entrypoint.sh
EXPOSE 8080
CMD ["/bin/sh","-c","/entrypoint.sh"]

entrypoint.sh

# 设定端口,默认不传参则为8080端口
PARAMS="--server.port=${Server_Port:-8080}"#JVM堆内存设定
JAVA_OPTS="-Xms${XMS_OPTS:-100m} -Xmx${XMX_OPTS:-100m}
"#Nacos相关选项
NACOS_OPTS="
-Djava.security.egd=file:/dev/./urandom \
-Dfile.encoding=utf8 \
-Dspring.profiles.active=${Nacos_Active:-dev} \
-Dspring.cloud.nacos.config.file-extension=yml \
-Dspring.cloud.nacos.discovery.server-addr=${Nacos_Server_Addr:-127.0.0.1:8848} \
-Dspring.cloud.nacos.config.server-addr=${Nacos_Server_Addr:-127.0.0.1:8848}
"# Skywalking相关选项
SKY_OPTS="
-javaagent:/skywalking-agent/skywalking-agent.jar \
-Dskywalking.agent.service_name=ruoyi-gateway \
-Dskywalking.collector.backend_service=${Sky_Server_Addr:-localhost:11800}
"#启动命令(指定sky选项、jvm堆内存选项、jar包,最后跟上params参数)
java ${SKY_OPTS} ${NACOS_OPTS} ${JAVA_OPTS} -jar /ruoyi-gateway.jar ${PARAMS}

3、制作镜像并推送仓库

docker build -t harbor.oldxu.net/springcloud/ruoyi-gateway:v1.0 .
docker push harbor.oldxu.net/springcloud/ruoyi-gateway:v1.0

4、修改gateway组件配置(ruoyi-gateway-dev.yml)

使用Kubernetes运行gateway之前,先通过Nacos修改对应ruoyi-gateway-dev.yml的相关配置;

spring:redis:host: redis-svc.dev.svc.cluster.localport: 6379password: sentinel:eager: truetransport:dashboard: sentinel-svc.dev.svc.cluster.local:8718datasource:ds1:nacos:server-addr: nacos-svc.dev.svc.cluster:8848dataId: sentinel-ruoyi-gatewaygroupId: DEFAULT_GROUPdata-type: jsonrule-type: flow          cloud:nacos:discovery:server-addr: nacos-svc.dev.svc.cluster.local:8848config:server-addr: nacos-svc.dev.svc.cluster.local:8848gateway:discovery:locator:lowerCaseServiceId: trueenabled: trueroutes:# 认证中心- id: ruoyi-authuri: lb://ruoyi-authpredicates:- Path=/auth/**filters:# 验证码处理- CacheRequestFilter- ValidateCodeFilter- StripPrefix=1# 代码生成- id: ruoyi-genuri: lb://ruoyi-genpredicates:- Path=/code/**filters:- StripPrefix=1# 定时任务- id: ruoyi-joburi: lb://ruoyi-jobpredicates:- Path=/schedule/**filters:- StripPrefix=1# 系统模块- id: ruoyi-systemuri: lb://ruoyi-systempredicates:- Path=/system/**filters:- StripPrefix=1# 文件服务- id: ruoyi-fileuri: lb://ruoyi-filepredicates:- Path=/file/**filters:- StripPrefix=1# 安全配置
security:# 验证码captcha:enabled: truetype: math# 防止XSS攻击xss:enabled: trueexcludeUrls:- /system/notice# 不校验白名单ignore:whites:- /auth/logout- /auth/login- /auth/register- /*/v2/api-docs- /csrf

5、 03-gateway-deploy-svc.yaml

apiVersion: apps/v1
kind: Deployment
metadata:name: ruoyi-gatewaynamespace: dev
spec:replicas: 2selector:matchLabels:app: gatewaytemplate:metadata:labels:app: gatewayspec:imagePullSecrets:- name: harbor-adminvolumes:- name: skywalking-agentemptyDir: {}initContainers:- name: init-sky-java-agentimage: harbor.oldxu.net/springcloud/skywalking-java-agent:8.8command:- 'sh'- '-c'- 'mkdir -p /agent; cp -r /skywalking-agent/* /agent/;'volumeMounts:- name: skywalking-agentmountPath: /agentcontainers:- name: gatewayimage: harbor.oldxu.net/springcloud/ruoyi-gateway:v2.0env:- name: Nacos_Activevalue: dev- name: Nacos_Server_Addrvalue: "nacos-svc.dev.svc.cluster.local:8848"- name: Sky_Server_Addrvalue: "skywalking-oap-svc.dev.svc.cluster.local:11800"- name: XMS_OPTSvalue: 500m- name: XMX_OPTSvalue: 500Mports:- containerPort: 8080livenessProbe:tcpSocket:port: 8080initialDelaySeconds: 60periodSeconds: 10timeoutSeconds: 10volumeMounts:- name: skywalking-agentmountPath: /skywalking-agent/   ---
apiVersion: v1
kind: Service
metadata:name: gateway-svcnamespace: dev
spec:selector:app: gatewayports:- port: 8080targetPort: 8080  

在这里插入图片描述

6.4 迁移微服务ruoyi-monitor

1 编译monitor项目

[root@node4 RuoYi-Cloud]# pwd
/root/k8sFile/project/danji-ruoyi/guanWang/RuoYi-Cloud[root@node4 RuoYi-Cloud]# ls
bin  docker  LICENSE  pom.xml  README.md  ruoyi-api  ruoyi-auth  ruoyi-common  ruoyi-gateway  ruoyi-modules  ruoyi-ui  ruoyi-visual  sql[root@node4 RuoYi-Cloud]# mvn package -Dmaven.test.skip=true -pl ruoyi-visual/ruoyi-monitor/ -am

在这里插入图片描述

2 编写dockerfile 和 entrypoint.sh

cd /root/k8sFile/project/danji-ruoyi/guanWang/RuoYi-Cloud/ruoyi-visual/ruoyi-monitor[root@node4 ruoyi-monitor]# ls
Dockerfile  entrypoint.sh  pom.xml  src  target

dockerfile

FROM openjdk:8-jre-alpine
COPY ./target/*.jar  /ruoyi-monitor.jar
COPY ./entrypoint.sh /entrypoint.sh
RUN chmod +x /entrypoint.sh
EXPOSE 8080
CMD ["/bin/sh", "-c", "/entrypoint.sh"]

entrypoint.sh

#设定端口,默认不传参则为8080端口
PARAMS="--server.port=${Server_Port:-8080}"#JVM堆内存设定
JAVA_OPTS="-Xms${XMS_OPTS:-100m} -Xmx${XMX_OPTS:-100m}"# Nacos相关选项
NACOS_OPTS="
-Djava.security.egd=file:/dev/./urandom \
-Dfile.encoding=utf8 \
-Dspring.profiles.active=${Nacos_Active:-dev} \
-Dspring.cloud.nacos.config.file-extension=yml \
-Dspring.cloud.nacos.discovery.server-addr=${Nacos_Server_Addr:-127.0.0.1:8848} \
-Dspring.cloud.nacos.config.server-addr=${Nacos_Server_Addr:-127.0.0.1:8848}
"#Skywalking相关选项
SKY_OPTS="
-javaagent:/skywalking-agent/sky-java-agent.jar \
-Dskywalking.agent.service_name=ruoyi-monitor \
-Dskywalking.collector.backend_service=${Sky_Server_Addr:-11800}
"#启动命令(指定sky选项、jvm堆内存选项、jar包,最后跟上params参数)
java ${SKY_OPTS} ${NACOS_OPTS} ${JAVA_OPTS} -jar /ruoyi-monitor.jar ${PARAMS}

3 制作镜像并推送仓库

docker build -t  harbor.oldxu.net/springcloud/ruoyi-monitor:v1.0 .
docker push harbor.oldxu.net/springcloud/ruoyi-monitor:v1.0

4 修改monitor组件配置(ruoyi-monitor-dev.yml)

使用Kubernetes运行monitor之前,先通过Nacos修改对应ruoyi-monitor-dev.yml的相关配置;

# spring
spring:cloud:sentinel:eager: truetransport:dashboard: sentinel-svc.dev.svc.cluster.local:8718 security:user:name: ruoyipassword: 123456boot:admin:ui:title: 若依服务状态监控

5、04-monitor-deploy-svc-ingress.yaml

apiVersion: apps/v1
kind: Deployment
metadata:name: ruoyi-monitornamespace: dev
spec:replicas: 1selector:matchLabels:app: monitortemplate:metadata:labels:app: monitorspec:imagePullSecrets:- name: harbor-adminvolumes:- name: skywalking-agentemptyDir: {}initContainers:- name: init-sky-java-agentimage: harbor.oldxu.net/springcloud/skywalking-java-agent:8.8command:- 'sh'- '-c'- 'mkdir -p /agent; cp -r /skywalking-agent/* /agent/;'volumeMounts:- name: skywalking-agentmountPath: /agentcontainers:- name: monitorimage: harbor.oldxu.net/springcloud/ruoyi-monitor:v3.0env:- name: Nacos_Activevalue: dev- name: Nacos_Server_Addrvalue: "nacos-svc.dev.svc.cluster.local:8848"- name: Sky_Server_Addrvalue: "skywalking-oap-svc.dev.svc.cluster.local:11800"- name: XMS_OPTSvalue: 200m- name: XMX_OPTSvalue: 200mports:- containerPort: 8080livenessProbe:tcpSocket:port: 8080initialDelaySeconds: 60periodSeconds: 10timeoutSeconds: 10volumeMounts:- name: skywalking-agentmountPath: /skywalking-agent/---
apiVersion: v1
kind: Service
metadata:name: monitor-svcnamespace: dev
spec:selector:app: monitorports:- port: 8080targetPort: 8080---
#apiVersion: networking.k8s.io/v1
apiVersion: extensions/v1beta1
kind: Ingress
metadata:name: monitor-ingressnamespace: dev
spec:ingressClassName: "nginx"rules:- host: "monitor.oldxu.net"http:paths:- path: /pathType: Prefixbackend:serviceName: monitor-svcservicePort: 8080#service:#  name: monitor-svc#  port:#    number: 8080

有个蛇皮问题。(monitor.oldxu.net:30080 会重定向到 monitor.oldxu.net/login),这是monitor程序的哪里搞了重定向?
还有静态文件js 、css文件会走80端口,不是走30080端口。
在这里插入图片描述
在这里插入图片描述

6.5 迁移微服务ruoyi-ui 前端

1 修改前端配置ruoyi-ui/vue.config.js

[root@node4 ruoyi-ui]# pwd
/root/k8sFile/project/danji-ruoyi/guanWang/RuoYi-Cloud/ruoyi-ui

修改网关的地址

  devServer: {host: '0.0.0.0',port: port,open: true,proxy: {// detail: https://cli.vuejs.org/config/#devserver-proxy[process.env.VUE_APP_BASE_API]: {target: `http://gateway-svc.dev.svc.cluster.local:8080`,changeOrigin: true,pathRewrite: {['^' + process.env.VUE_APP_BASE_API]: ''}}},disableHostCheck: true},css: {
[root@master01 06-all-service]# dig @10.96.0.10 gateway-svc.dev.svc.cluster.local +short
10.97.133.31

2 编译前端项目

npm install --registry=https://registry.npmmirror.com
npm run build:prod

在这里插入图片描述

3 编写Dockerfile

[root@node4 ruoyi-ui]# ls
babel.config.js  bin  build  dist  Dockerfile  node_modules  package.json  package-lock.json  public  README.md  src  vue.config.js  vue.config.js.bak  vue.config.js-danji
[root@node4 ruoyi-ui]# 
[root@node4 ruoyi-ui]# cat Dockerfile 
FROM nginx
COPY ./dist /code/

4 制作镜像并推送仓库

docker build -t harbor.oldxu.net/springcloud/ruoyi-ui:v1.0 .
docker push harbor.oldxu.net/springcloud/ruoyi-ui:v1.0

5 创建ConfigMap ( ruoyi.oldxu.net.conf)

ruoyi.oldxu.net.conf

server {listen 80;server_name ruoyi.oldxu.net;charset utf-8;root /code;location / {try_files $uri $uri/ /index.html;index index.html index.htm;}location /prod-api/ {proxy_set_header Host $http_host;proxy_set_header X-Real-IP $remote_addr;proxy_set_header REMOTE-HOST $remote_addr;proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;proxy_pass http://gateway-svc.dev.svc.cluster.local:8080/;}
}
kubectl create configmap ruoyi-ui-conf --from-file=ruoyi.oldxu.net.conf -n dev

6、 05-ui-dp-svc-ingress.yaml

apiVersion: apps/v1
kind: Deployment
metadata:name: ruoyi-uinamespace: dev
spec:replicas: 2selector:matchLabels:app: uitemplate:metadata:labels:app: uispec:imagePullSecrets:- name: harbor-admincontainers:- name: uiimage: harbor.oldxu.net/springcloud/ruoyi-ui:v1.0ports:- containerPort: 80readinessProbe:tcpSocket:port: 80initialDelaySeconds: 60periodSeconds: 10timeoutSeconds: 10livenessProbe:tcpSocket:port: 80initialDelaySeconds: 60periodSeconds: 10timeoutSeconds: 10volumeMounts:- name: ngxconfsmountPath: /etc/nginx/conf.d/        volumes:- name: ngxconfsconfigMap:name: ruoyi-ui-conf---
apiVersion: v1
kind: Service
metadata:name: ui-svcnamespace: dev
spec:selector:app: uiports:- port: 80targetPort: 80---
#apiVersion: networking.k8s.io/v1
apiVersion: extensions/v1beta1
kind: Ingress
metadata:name: ui-ingressnamespace: dev
spec:ingressClassName: "nginx" rules:- host: "ruoyi.oldxu.net"http:paths:- path: /pathType: Prefixbackend:serviceName: ui-svcservicePort: 80#service:#  name: ui-svc#  port:#    number: 80            

访问:
在这里插入图片描述

END

其他/迁移小结

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.luyixian.cn/news_show_103807.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

“井电双控”地下水远程计量设施-实现地下水资源合理利用

“井电双控”地下水远程计量设施&#xff08;MGTR-W4122C&#xff09;是针对取水计量控制系统开发智能终端产品。集预收费、流量监测、电量监测、余额提醒、欠费停机、无线传输、远程控制等多种功能于一体&#xff0c;并可根据项目需求选择实体IC卡和APP电子卡取水两种方式。其…

换肤实现及LayoutInflater原理

文章目录 背景实现换肤步骤解析插件 apk 的包信息获取插件 apk 的 Resources 对象替换资源 简单的插件化换肤实现和存在的问题换肤如何动态刷新&#xff1f;控件换肤刷新的性能考虑如何降低 xml 布局中 View 的替换成本LayoutInflater 原理LayoutInflater.Factory2 替换 View 小…

David Silver Reinforcement Learning -- Markov process

1 Introduction 这个章节介绍关键的理论概念。 马尔科夫过程的作用&#xff1a; 1&#xff09;马尔科夫过程描述强化学习环境的方法&#xff0c;环境是完全能观测的&#xff1b; 2&#xff09;几乎所有的RL问题可以转换成MDP的形式&#xff1b; 2 Markov Processes 2.1 Mark…

从源码全面解析LinkedBlockingQueue的来龙去脉

&#x1f44f;作者简介&#xff1a;大家好&#xff0c;我是爱敲代码的小黄&#xff0c;独角兽企业的Java开发工程师&#xff0c;CSDN博客专家&#xff0c;阿里云专家博主&#x1f4d5;系列专栏&#xff1a;Java设计模式、数据结构和算法、Kafka从入门到成神、Kafka从成神到升仙…

mall-swarm微服务商城系统

mall-swarm是一套微服务商城系统&#xff0c;采用了 Spring Cloud 2021 & Alibaba、Spring Boot 2.7、Oauth2、MyBatis、Docker、Elasticsearch、Kubernetes等核心技术&#xff0c;同时提供了基于Vue的管理后台方便快速搭建系统。mall-swarm在电商业务的基础集成了注册中心…

【Excel统计分析插件】上海道宁为您提供统计分析、数据可视化和建模软件——Analyse-it

Analyse-it是Microsoft Excel中的 统计分析插件 它为Microsoft Excel带来了 易于使用的统计软件 Analyse-it在软件中 引入了一些新的创新统计分析 Analyse-it与 许多Excel加载项开发人员不同 使用完善的软件开发和QA实践 包括单元/集成/系统测试 敏捷开发、代码审查 …

HCIA-RS实验-ENSP搭建一个基础的IP网络

HCIA-RS是华为认证网络工程师&#xff08;Routing & Switching&#xff09;的缩写。通过考取HCIA-RS证书&#xff0c;可以证明自己有能力设计、实现和维护小型网络。而HCIA-RS实验则是考试的一部分&#xff0c;是考生必须要完成的实践环节。这将是第一篇文章&#xff0c;后…

【Android Framework (八) 】- Service

文章目录 知识回顾启动第一个流程initZygote的流程system_serverServiceManagerBinderLauncher的启动AMS 前言源码分析1.startService2.bindService 拓展知识1:Service的两种启动方式对Service生命周期有什么影响&#xff1f;2:Service的启动流程3:Service的onStartCommand返回…

紧密联结玩家 | 2023 Google 游戏开发者峰会

玩家的选择是对游戏莫大的认可&#xff0c;重视玩家反馈并和他们建立联系是您的游戏取得成功的关键。我们也在努力创造更多机会&#xff0c;让您的游戏从琳琅满目的列表中脱颖而出&#xff0c;帮助您吸引更多用户。 上篇内容我们介绍了帮助您优化游戏性能的几大功能更新&#x…

❀五一劳动节来啦❀

今年“五一”&#xff0c;4月29日至5月3日放假调休&#xff0c;共5天。 如果你在5月4日到5月6日请假3天&#xff0c;加上5月7日周日&#xff0c;就可以形成9天的假期。 一&#xff0c;五一劳动节的由来⭐ 国际劳动节又称“五一国际劳动节”“国际示威游行日”&#xff08;英语…

GPT详细安装教程-GPT软件国内也能使用

GPT (Generative Pre-trained Transformer) 是一种基于 Transformer 模型的自然语言处理模型&#xff0c;由 OpenAI 提出&#xff0c;可以应用于各种任务&#xff0c;如对话系统、文本生成、机器翻译等。GPT-3 是目前最大的语言模型之一&#xff0c;其预训练参数超过了 13 亿个…

python+vue 健康体检预约管理系统

该专门体检预约管理系统包括会员和管理员。其主要功能包括个人中心、会员管理、体检服务管理、类型管理、订单信息管理、取消订单管理、 体检报告管理、通知信息管理、交流论坛、系统管理等功能。 目 录 一、绪论 1 1.1研发背景和意义 2 1.2 国内研究动态 3 1.3论文主…

Cookies和Session案例-注册

1. 注册功能改进 1.1 service 将之前的注册案例的代码进行优化&#xff0c;将获取sqlsession工厂对象、获取sqlsession、获取mapper等操作从servlet中分离出来转变为三层架构的形式 在service目录下创建UserService public class UserService {SqlSessionFactory sqlSessionFa…

Docker compose-实现多服务、nginx负载均衡、--scale参数解决端口冲突问题

Docker compose-实现多服务、nginx负载均衡、--scale参数解决端口冲突问题 问题&#xff1a;scale参数端口冲突解决方法&#xff1a;nginx实现多服务、负载均衡修改docker-compose.yml配置新增nginx本地配置文件验证启动容器查看容器状态访问web应用 问题&#xff1a;scale参数…

Linux中的YUM源仓库和NFS文件共享服务(うたかたの夢)

YUM仓库源的介绍和相关信息 简介 yum是一个基于RPM包&#xff08;是Red-Hat Package Manager红帽软件包管理器的缩写&#xff09;构建的软件更新机制&#xff0c;能够自动解决软件包之间的依赖关系。 yum由仓库和客户端组成&#xff0c;也就是整个yum由两部分组成&#xff0…

Python小姿势 - 知识点:

知识点&#xff1a; Python的字符串格式化 标题&#xff1a; Python字符串格式化实例解析 顺便介绍一下我的另一篇专栏&#xff0c; 《100天精通Python - 快速入门到黑科技》专栏&#xff0c;是由 CSDN 内容合伙人丨全站排名 Top 4 的硬核博主 不吃西红柿 倾力打造。 基础知识…

Docker的实际应用

一、 数据持久化 我们什么情况下要做数据持久化呢&#xff1f; 一定是在做容器之前先预判好哪些文件是要永久存储的&#xff0c; 而不会跟着它容器的一个生命周期而消失。 比如说配置文件、 日志文件、 缓存文件或者应用数据等等。 数据初始化有三种类型。 第一种 volumes&…

什么是分库分表?为什么需要分表?什么时候分库分表

不急于上手实战 ShardingSphere 框架&#xff0c;先来复习下分库分表的基础概念&#xff0c;技术名词大多晦涩难懂&#xff0c;不要死记硬背理解最重要&#xff0c;当你捅破那层窗户纸&#xff0c;发现其实它也就那么回事。 什么是分库分表 分库分表是在海量数据下&#xff0…

SCI论文自由投稿Vs专栏投稿,哪个更好中?

我们首先来看下以下几种期刊的发表方式&#xff1a; 正刊 正刊也就是自由投稿方式的发表方式&#xff0c;是期刊正常出版的期刊&#xff0c;比如一本SCI期刊是双月刊&#xff0c;一年出版6期&#xff0c;没有设定主题&#xff0c;包含多个研究方向的文章。每年按照半月/月/双…

100种思维模型之指数对数思维模型-54

对数、指数&#xff0c;生活中的2种增长曲线&#xff1b;对数增长曲线&#xff0c;即在开始时增长很快&#xff0c;但随着时间的推移&#xff0c;收益会减少并变得更加困难&#xff1b;而指数增长曲线&#xff0c;即开始时增长缓慢&#xff0c;但随着时间的推移&#xff0c;收益…