ConfigMap(可变应用配置管理)

news2025/1/12 5:57:32

实验环境

实验环境:
1、win10,vmwrokstation虚机;
2、k8s集群:3台centos7.6 1810虚机,1个master节点,2个node节点
   k8s version:v1.22.2
   containerd://1.5.5

实验软件(无)

1 基础知识

1.1 什么是ConfigMap(可变配置管理)

前面我们学习了一些常用的资源对象的使用,但是单纯依靠这些资源对象,还不足以满足我们的日常需求,一个重要的需求就是应用的配置管理敏感信息的存储和使用(如:密码、Token 等)容器运行资源的配置安全管控身份认证等等。

对于应用的可变配置在 Kubernetes 中是通过一个 ConfigMap 资源对象来实现的,我们知道许多应用经常会有从配置文件、命令行参数或者环境变量中读取一些配置信息的需求,这些配置信息我们肯定不会直接写死到应用程序中去的,比如你一个应用连接一个 redis 服务,下一次想更换一个了的,还得重新去修改代码,重新制作一个镜像,这肯定是不可取的,而 ConfigMap 就给我们提供了向容器中注入配置信息的能力,不仅可以用来保存单个属性,还可以用来保存整个配置文件,比如我们可以用来配置一个 redis 服务的访问地址,也可以用来保存整个 redis 的配置文件。接下来我们就来了解下 ConfigMap 这种资源对象的使用方法。

1.2 ConfigMap和配置中心:apollo/nacos的区别

注意:ConfigMap是肯定的会用到的,它当然没有apollo,nacos功能强大,但是这些注册中心是需要应用程序去做一个对接的,而ConfigMap就是,你把配置写给我,我给你注入进去就可以了,如果你是volume的话,我给你挂载进去就可以了。至于你的程序要怎么做热更新,怎么自动读取,那是你程序的事情。这个k8s它是管不了的。当然,我们是可以通过一些额外的手段可以做到,即使你的程序不支持热更新,我们也可以让它做一个reload操作的,是可以做到的;

像redeis,mysql这些配置,只要你应用层面和apollo/nacos对接做了配置的话,那么 在apollo/nacos后台直接改个配置,这边就直接下发下去,就直接生效了。

这个configmap可能更多的还是在一个简单的配置方面,它和你的应用代码的耦合度就没那么高。但是你想利用configmap去做apollo/nacos这样的一个事情,应该是可以做到的。 就是你想通过configmmap去实现一个,去开发一个类似于apollo这样的一个配置中心,应该是可以做到的。

1.3 只有通过 Kubernetes API 创建的 Pod 才能使用 ConfigMap

只有通过 Kubernetes API 创建的 Pod 才能使用 ConfigMap,其他方式创建的(比如静态 Pod)不能使用;ConfigMap 文件大小限制为 1MB(ETCD 的要求)。

2 实战演示:cupid:

2.1 创建ConfigMap

2.1.1 通过资源清单文件方法创建ConfigMap

ConfigMap 资源对象使用 key-value 形式的键值对来配置数据,这些数据可以在 Pod 里面使用,如下所示的资源清单:

apiVersion: v1
kind: ConfigMap
metadata:
  name: cm-demo
  namespace: default
data:
  data.1: hello
  data.2: world
  config: |
    property.1=value-1
    property.2=value-2
    property.3=value-3

其中配置数据在 data 属性下面进行配置,前两个被用来保存单个属性,后面一个被用来保存一个配置文件

注意:yaml中|>d的用法。 老师当时讲课这里也有点模糊。。。

(1)我们可以看到 config 后面有一个竖线符 |这在 yaml 中表示保留换行,每行的缩进和行尾空白都会被去掉(最后一行的空白和换行符会被取掉,前面换行被被保留),而额外的缩进会被保留。

lines: |
  我是第一行
  我是第二行
    我是吴彦祖
      我是第四行
  我是第五行

# JSON
{"lines": "我是第一行\n我是第二行\n  我是吴彦祖\n     我是第四行\n我是第五行"}

(2)除了竖线之外还可以使用 > 右尖括号,用来表示折叠换行,只有空白行才会被识别为换行,原来的换行符都会被转换成空格。

lines: >
  我是第一行
  我也是第一行
  我仍是第一行
  我依旧是第一行

  我是第二行
  这么巧我也是第二行

# JSON
{"lines": "我是第一行 我也是第一行 我仍是第一行 我依旧是第一行\n我是第二行 这么巧我也是第二行"}

(3)除了这两个指令之外,我们还可以使用竖线和加号或者减号进行配合使用,+ 表示保留文字块末尾的换行,- 表示删除字符串末尾的换行。

value: |
  hello
  hello

# {"value": "hello\nhello"}

value: |-
  hello

# {"value": "hello"}

value: |+
  hello

# {"value": "hello\n\n"} (有多少个回车就有多少个\n)

:round_pushpin:step2:查看ConfigMap的帮助信息

当然同样的我们可以使用kubectl create -f xx.yaml来创建上面的 ConfigMap 对象,但是如果我们不知道怎么创建 ConfigMap 的话,不要忘记 kubectl 是我们最好的帮手,可以使用kubectl create configmap -h来查看关于创建 ConfigMap 的帮助信息:

[root@master1 ~]#kubectl create configmap --help
Create a config map based on a file, directory, or specified literal value.
……
Examples:
  # Create a new configmap named my-config based on folder bar
  kubectl create configmap my-config --from-file=path/to/bar

  # Create a new configmap named my-config with specified keys instead of file basenames on disk
  kubectl create configmap my-config --from-file=key1=/path/to/bar/file1.txt --from-file=key2=/path/to/bar/file2.txt

  # Create a new configmap named my-config with key1=config1 and key2=config2
  kubectl create configmap my-config --from-literal=key1=config1 --from-literal=key2=config2

我们可以看到可以从一个给定的目录来创建一个 ConfigMap 对象。

:round_pushpin:step3:创建测试文件

比如我们创建 testcm 的目录,该目录下面包含一些配置文件,redis 和 mysql 的连接信息,如下:

cd ~
mkdir testcm
cd testcm/
echo host=127.0.0.1 > redis.conf
echo port=6379 >> redis.conf
echo host=127.0.0.1 > mysql.conf
echo port=3306 >> mysql.conf
cat redis.conf
cat mysql.conf

2.1.2 通过from-file关键字创建ConfigMap

2.1.2.1 from-file 关键字:使用指定的目录进行创建 ConfigMap

然后,我们就可以使用 from-file 关键字来创建包含这个目录下面所有配置文件的 ConfigMap

[root@master1 ~]#kubectl create cm  cm-demo1 --from-file=testcm/
configmap/cm-demo1 created

其中 from-file 参数指定在该目录下面的所有文件都会被用在 ConfigMap 里面创建一个键值对,键的名字就是文件名,值就是文件的内容。

创建完成后,同样我们可以使用如下命令来查看 ConfigMap 列表:

[root@master1 ~]#kubectl get cm
NAME               DATA   AGE
cm-demo1           2      62s

可以看到已经创建了一个 cm-demo1 的 ConfigMap 对象,然后可以使用 describe 命令查看详细信息:

[root@master1 ~]#kubectl describe cm cm-demo1
Name:         cm-demo1
Namespace:    default
Labels:       <none>
Annotations:  <none>

Data
====
mysql.conf:
----
host=127.0.0.1
port=3306

redis.conf:
----
host=127.0.0.1
port=6379


BinaryData
====

Events:  <none>

我们可以看到两个 key 是 testcm 目录下面的文件名称,对应的 value 值就是文件内容。

这里值得注意的是如果文件里面的配置信息很大的话,describe 的时候可能不会显示对应的值,要查看完整的键值,可以使用如下命令:

[root@master1 ~]#kubectl get cm cm-demo1 -oyaml
apiVersion: v1
data:
  mysql.conf: |
    host=127.0.0.1
    port=3306
  redis.conf: |
    host=127.0.0.1
    port=6379
kind: ConfigMap
metadata:
  creationTimestamp: "2021-11-23T13:45:25Z"
  name: cm-demo1
  namespace: default
  resourceVersion: "545155"
  uid: 36ba65dc-eb13-4bc6-aa2e-0968d7729ecd
[root@master1 ~]#
2.1.2.2 from-file 关键字:使用指定的文件进行创建 ConfigMap

除了通过文件目录进行创建,我们也可以使用指定的文件进行创建 ConfigMap,同样的,以上面的配置文件为例,我们创建一个 redis 的配置的一个单独 ConfigMap 对象:

[root@master1 ~]#kubectl create cm cm-demo2 --from-file=testcm/redis.conf -n default
configmap/cm-demo2 created

[root@master1 ~]#kubectl get cm cm-demo2
NAME       DATA   AGE
cm-demo2   1      9s
[root@master1 ~]#kubectl get cm cm-demo2  -oyaml
apiVersion: v1
data:
  redis.conf: |
    host=127.0.0.1
    port=6379
kind: ConfigMap
metadata:
  creationTimestamp: "2021-11-23T13:53:19Z"
  name: cm-demo2
  namespace: default
  resourceVersion: "545815"
  uid: 1aaf155c-2673-4b3e-b0d1-de869284f16c
[root@master1 ~]#

我们可以看到一个关联 redis.conf 文件配置信息的 ConfigMap 对象创建成功了,另外值得注意的是 --from-file 这个参数可以使用多次,比如我们这里使用两次分别指定 redis.conf 和 mysql.conf 文件,就和直接指定整个目录是一样的效果了。

kubectl create cm cm-demo2 --from-file=testcm/redis.conf --from-file=testcm/mysql.conf -n default
2.1.2.3 from-file 关键字:使用字符串进行创建ConfigMap

另外,通过帮助文档我们可以看到我们还可以直接使用字符串进行创建,通过 --from-literal 参数传递配置信息,同样的,这个参数可以使用多次,格式如下:

[root@master1 ~]#kubectl create configmap cm-demo3 --from-literal=db.host=localhost --from-literal=db.port=3306
configmap/cm-demo3 created

[root@master1 ~]#kubectl get cm cm-demo3 -oyaml
apiVersion: v1
data:
  db.host: localhost
  db.port: "3306"
kind: ConfigMap
metadata:
  creationTimestamp: "2021-11-23T14:03:05Z"
  name: cm-demo3
  namespace: default
  resourceVersion: "546633"
  uid: 4dafaf3f-7e98-40e0-87df-a8b45b49ce30
[root@master1 ~]#

注意:一般数据较小的话,可以直接在资源配置清单里写一下,数据量比较大的话,就可以写到文件里进行创建使用。

2.2 Pod中使用ConfigMap

ConfigMap 创建成功了,那么我们应该怎么在 Pod 中来使用呢?我们说 ConfigMap 这些配置数据可以通过很多种方式在 Pod 里使用,主要有以下几种方式:

  • 设置环境变量的值

  • 在容器里设置命令行参数

  • 在数据卷里面挂载配置文件

2.2.1 使用 ConfigMap 填充我们的环境变量

注意:首先,我们可以来看一下关于在pod中cm的可用字段

[root@master1 ~]#kubectl explain pod.spec.containers.env.valueFrom
[root@master1 ~]#kubectl explain pod.spec.containers.envFrom

:round_pushpin:step1:创建pod的资源清单文件

首先,我们使用 ConfigMap 来填充我们的环境变量,如下所示的 Pod 资源对象:

[root@master1 ~]#vim testcm1-pod.yaml
apiVersion: v1
kind: Pod
metadata:
  name: testcm1-pod
spec:
  containers:
    - name: testcm1
      image: busybox
      command: [ "/bin/sh", "-c", "env" ]
      env:
        - name: DB_HOST
          valueFrom:
            configMapKeyRef: #这里Ref翻译为引用
              name: cm-demo3
              key: db.host #注意:这个db.host仅仅只是cm-demo3这个ConnfigMap里的Key.
        - name: DB_PORT
          valueFrom:
            configMapKeyRef:
              name: cm-demo3
              key: db.port
      envFrom:
        - configMapRef:
            name: cm-demo1

:round_pushpin:step2:部署

[root@master1 ~]#kubectl apply -f testcm1-pod.yaml
pod/testcm1-demo created

:round_pushpin:step3: 查看效果

这个 Pod 运行后会输出如下所示的信息:

1.这里可以先看下当前pod的状态,虽然后面会处于报错状态,但是是正常现象,因为pod执行完就退出了
[root@master1 ~]#kubectl get po --watch
NAME           READY   STATUS              RESTARTS   AGE
testcm1-demo   0/1     ContainerCreating   0          11s
testcm1-demo   1/1     Running             0          19s
testcm1-demo   0/1     Completed           0          20s
[root@master1 ~]#kubectl get po
NAME           READY   STATUS      RESTARTS   AGE
testcm1-demo   0/1     Completed   0          29s

2.看下这个pod的日志
[root@master1 ~]#kubectl logs testcm1-demo
KUBERNETES_SERVICE_PORT=443
KUBERNETES_PORT=tcp://10.96.0.1:443
HOSTNAME=testcm1-demo
DB_PORT=3306
SHLVL=1
HOME=/root
mysql.conf=host=127.0.0.1 #特备注意下这里:这里的key:value是一个整体,是作为文件名`mysql.conf`的value的;
port=3306

redis.conf=host=127.0.0.1
port=6379

KUBERNETES_PORT_443_TCP_ADDR=10.96.0.1
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
KUBERNETES_PORT_443_TCP_PORT=443
KUBERNETES_PORT_443_TCP_PROTO=tcp
KUBERNETES_SERVICE_PORT_HTTPS=443
KUBERNETES_PORT_443_TCP=tcp://10.96.0.1:443
KUBERNETES_SERVICE_HOST=10.96.0.1
PWD=/
DB_HOST=localhost

#注意,再过一段时间,该pod的状态会发生变化:
[root@master1 ~]#kubectl get po
NAME           READY   STATUS             RESTARTS       AGE
testcm1-demo   0/1     CrashLoopBackOff   6 (4m9s ago)   11m
[root@master1 ~]#kubectl describe pod testcm1-demo
Events:
  Type     Reason     Age                   From               Message
  ----     ------     ----                  ----               -------
  Normal   Scheduled  13m                   default-scheduler  Successfully assigned default/testcm1-demo to node2
  Normal   Pulled     13m                   kubelet            Successfully pulled image "busybox" in 15.215119749s
  Normal   Pulled     12m                   kubelet            Successfully pulled image "busybox" in 15.285785182s
  Normal   Pulled     12m                   kubelet            Successfully pulled image "busybox" in 15.197121258s
  Normal   Created    11m (x4 over 13m)     kubelet            Created container testcm1
  Normal   Pulled     11m                   kubelet            Successfully pulled image "busybox" in 15.218663485s
  Normal   Started    11m (x4 over 13m)     kubelet            Started container testcm1
  Normal   Pulling    10m (x5 over 13m)     kubelet            Pulling image "busybox"
  Warning  BackOff    3m11s (x40 over 12m)  kubelet            Back-off restarting failed container
[root@master1 ~]#

我们可以看到 DB_HOST 和 DB_PORT 都已经正常输出了,另外的环境变量是因为我们这里直接把 cm-demo1 给注入进来了,所以把他们的整个键值给输出出来了,这也是符合预期的。

image-20211124195039734

image-20211124195039734

image-20211124195159503

image-20211124195159503

2.2.2 使用 ConfigMap来设置命令行参数

:round_pushpin:step1:创建资源清单文件

另外我们也可以使用 ConfigMap来设置命令行参数,ConfigMap 也可以被用来设置容器中的命令或者参数值,如下 Pod:

[root@master1 ~]#vim testcm2-pod.yaml
apiVersion: v1
kind: Pod
metadata:
  name: testcm2-pod
spec:
  containers:
    - name: testcm2
      image: busybox
      command: [ "/bin/sh", "-c", "echo $(DB_HOST) $(DB_PORT)" ]
      env:
        - name: DB_HOST
          valueFrom:
            configMapKeyRef:
              name: cm-demo3
              key: db.host
        - name: DB_PORT
          valueFrom:
            configMapKeyRef:
              name: cm-demo3
              key: db.port

:round_pushpin:step2:部署并验证效果

运行这个 Pod 后会输出如下信息:

[root@master1 ~]#kubectl apply -f testcm2-pod.yaml
pod/testcm2-demo created
[root@master1 ~]#kubectl get po --watch
NAME           READY   STATUS              RESTARTS   AGE
testcm2-demo   0/1     ContainerCreating   0          9s
testcm2-demo   0/1     Completed           0          20s
^C
[root@master1 ~]#kubectl logs testcm2-demo
localhost 3306
[root@master1 ~]#
  • 注意:

注意:有的同学可能会说,既然我可以在容器中的命令行参数里使用这个变量,那么我是否可以在我的ConfigMap里去使用我的环境变量呢?

kind: ConfigMap
apiVersion: v1
metadata:
  name: cm-demo
  namespace: default
data:
  data.1: hello
  data.2: world
  config: |
    property.1=value-1
    property.2=value-2
    property.3=value-3

image-20211124214229171

image-20211124214229171

2.2.3 通过数据卷来使用ConfigMap

:round_pushpin:step1:创建资源清单文件

另外一种是非常常见的使用 ConfigMap 的方式:通过数据卷使用,在数据卷里面使用 ConfigMap,就是将文件填入数据卷,在这个文件中,键就是文件名,键值就是文件内容,如下资源对象所示:

[root@master1 ~]#vim testcm3-pod.yaml
apiVersion: v1
kind: Pod
metadata:
  name: testcm3-pod
spec:
  volumes:
    - name: config-volume
      configMap:
        name: cm-demo2
  containers:
    - name: testcm3
      image: busybox
      command: [ "/bin/sh", "-c", "cat /etc/config/redis.conf" ]
      volumeMounts:
      - name: config-volume
        mountPath: /etc/config

我们先来查看下当前cm-demo2这个ConfigMap的内容:

[root@master1 ~]#kubectl get cm
NAME               DATA   AGE
cm-demo1           2      43h
cm-demo2           1      43h
cm-demo3           2      43h
kube-root-ca.crt   1      25d
[root@master1 ~]#kubectl get cm cm-demo2 -oyaml
apiVersion: v1
data:
  redis.conf: |
    host=127.0.0.1
    port=6379
kind: ConfigMap
metadata:
  creationTimestamp: "2021-11-23T13:53:19Z"
  name: cm-demo2
  namespace: default
  resourceVersion: "545815"
  uid: 1aaf155c-2673-4b3e-b0d1-de869284f16c
[root@master1 ~]#

:round_pushpin:step2:部署应用

[root@master1 ~]#kubectl apply -f testcm3-pod.yaml
pod/testcm3-pod created

:round_pushpin:step3:查看日志

[root@master1 ~]#kubectl get po --watch
NAME          READY   STATUS              RESTARTS   AGE
testcm3-pod   0/1     ContainerCreating   0          3s
testcm3-pod   0/1     Completed           0          19s
^C
[root@master1 ~]#kubectl logs testcm3-pod
host=127.0.0.1
port=6379
[root@master1 ~]#

:round_pushpin:step4:当然我们也可以在 ConfigMap 只被映射的数据卷里去控制路径,如下 Pod 定义:

总感觉奇奇怪怪的:。。。

apiVersion: v1
kind: Pod
metadata:
  name: testcm4-pod
spec:
  volumes:
    - name: config-volume
      configMap:
        name: cm-demo1
        items:
        - key: mysql.conf
          path: path/to/msyql.conf
  containers:
    - name: testcm4
      image: busybox
      command: [ "/bin/sh","-c","cat /etc/config/path/to/msyql.conf" ]
      volumeMounts:
      - name: config-volume
        mountPath: /etc/config

运行这个Pod的,查看日志:

[root@master1 ~]#kubectl apply -f testcm4-pod.yaml
pod/testcm4-pod created
[root@master1 ~]#kubectl get po --watch
NAME          READY   STATUS              RESTARTS   AGE
testcm4-pod   0/1     ContainerCreating   0          2s
testcm4-pod   0/1     Completed           0          21s
^C
[root@master1 ~]#kubectl logs testcm4-pod
host=127.0.0.1
port=3306
[root@master1 ~]#

实验结束。

另外需要注意的是,当 ConfigMap 以数据卷的形式挂载进 Pod 的时,这时更新 ConfigMap(或删掉重建ConfigMap)Pod 内挂载的配置信息会热更新这时可以增加一些监测配置文件变更的脚本,然后重加载对应服务就可以实现应用的热更新。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【算法日志】动态规划:动态规划简介及其简单应用(day33)

算法随想录刷题60Day 目录 动态规划简介 动态规划简单应用 斐波那契 爬楼梯 使用最小开支爬楼 动态规划简介 动态规划(Dynamic Programming)是一种解决复杂问题的算法设计思想。它的主要思路是将原问题拆分若干个子问题&#xff0c;并分别求解这些子问题&#xff0c;最后将…

如何轻松打造美容行业预约小程序,无需编程基础

随着移动互联网的快速发展&#xff0c;小程序已经成为了很多企业和个人开展业务的重要阵地。而在美容行业&#xff0c;开发一款美容预约小程序无疑是一个非常有前景的选择。本文将介绍如何使用乔拓云平台&#xff0c;通过简单的几步操作&#xff0c;制作出一款功能强大的美容预…

Mybatis配置说明

目录 创建maven项目&#xff0c;添加mybatis&#xff0c;mysql依赖的jar包 创建mybatis全局配置文件,配置数据库连接信息,配置sql映射文件 创建sql映射文件 创建一个访问接口 测试 mybatis原是apache的一个开源项目&#xff0c;2010年转投谷歌,从ibtais3.0开始改名为myba…

Ansible 临时命令搭建安装仓库

创建一个名为/ansible/yum.sh 的 shell 脚本&#xff0c;该脚本将使用 Ansible 临时命令在各个受管节点上安装 yum 存储库. 存储库1&#xff1a; 存储库的名称为 EX294_BASE 描述为 EX294 base software 基础 URL 为 http://content/rhel8.0/x86_64/dvd/BaseOS GPG 签名检查为…

【附安装包】Midas Civil2019安装教程

软件下载 软件&#xff1a;Midas Civil版本&#xff1a;2019语言&#xff1a;简体中文大小&#xff1a;868.36M安装环境&#xff1a;Win11/Win10/Win8/Win7硬件要求&#xff1a;CPU2.5GHz 内存4G(或更高&#xff09;下载通道①百度网盘丨64位下载链接&#xff1a;https://pan.…

solidity0.8.0的应用案例11:透明代理合约

选择器冲突 智能合约中,函数选择器(selector)是函数签名的哈希的前4个字节。例如mint(address account)的选择器为bytes4(keccak256("mint(address)")),也就是0x6a627842. 由于函数选择器仅有4个字节,范围很小,因此两个不同的函数可能会有相同的选择器,例如…

【正点原子STM32连载】第二十章 通用定时器脉冲计数实验 摘自【正点原子】APM32F407最小系统板使用指南

1&#xff09;实验平台&#xff1a;正点原子stm32f103战舰开发板V4 2&#xff09;平台购买地址&#xff1a;https://detail.tmall.com/item.htm?id609294757420 3&#xff09;全套实验源码手册视频下载地址&#xff1a; http://www.openedv.com/thread-340252-1-1.html# 第二…

页眉横线怎么删除?4个方法,高效删除!

“刚写了一篇文章&#xff0c;但格式上出了点问题&#xff0c;页眉上一直有一条横线&#xff0c;想把它删掉但是一直都删不掉。这是为什么呢&#xff1f;有什么方法可以删除页眉横线吗&#xff1f;” 在使用Word时&#xff0c;用户可以按个人的需求对页面进行调整。在页眉上可以…

老铁,测试小白也可以飙车了!XMind2TestCase,逼格满满!

目录 一、XMind测试用例通用模板 二、导入TestLink 三、导入禅道&#xff08;ZenTao) 四、使用Web转换工具 总结 “ 测&#xff01;不&#xff01;用&#xff01;脑&#xff1f;别傻了&#xff0c;用XMind2TestCase&#xff0c;测试更轻松&#xff0c;更牛掰&#xff01; …

移动端和PC端对比【组件库+调试vconsole +构建vite/webpack+可视化echarts/antv】

目录 组件库 移动端 vue vant PC端 react antd vue element 调试&#xff1a;vconsole vs dev tools中的控制台&#xff08;Console&#xff09; ​​​​​​​vconsole&#xff1a;在真机上调试 构建工具 webpack 原理 Babel&#xff1a;JS编译器&#xff08;…

学员心得 | 突破瓶颈!云计算HCIE帮我走出职场舒适区

大家好&#xff0c;我是誉天云计算的吴同学&#xff0c;是安徽的一名“大龄考生”。读研后我已工作多年&#xff1a;在上海奋斗七年&#xff0c;回到老家又安稳了十年。这期间做过领导&#xff0c;也当过小兵&#xff0c;起起伏伏走到今天&#xff0c;才发现职业与技术都已然面…

7年测试经验之谈 —— 编写一个接口自动化测试程序

下面是一个简单的接口自动化测试程序的示例&#xff0c;使用requests库发送HTTP请求并使用unittest框架进行断言&#xff1a; import requests import unittestclass ApiTests(unittest.TestCase):def setUp(self):self.base_url "http://api.example.com/"def tes…

C# 工厂模式

一、概述 工厂模式&#xff08;Factory Pattern&#xff09;是一种创建型设计模式&#xff0c;它提供了一种创建对象的最佳方式。在C#中&#xff0c;工厂模式通过定义一个公共接口或抽象类来创建对象&#xff0c;而具体的对象创建则由工厂类来实现。 工厂模式主要包含三个角色…

Jmeter性能测试 —— TPS拐点寻找

寻找TPS性能拐点1、准备脚本①在本地电脑调试Jmeter压测脚本 寻找TPS性能拐点1、准备脚本①在本地电脑调试Jmeter压测脚本 2、执行压力测试①执行压测脚本 jmeter –n –t xianchengzuse.jmx ②记录业务压测数据 3、监控服务器性能指标 ①监控CPU输入top命令 ②监控内存 fre…

AcrelEMS-HIM高速公路综合能效解决方案-安科瑞黄安南

高速公路供配电行业背景 合能效解决方案 高速公路电力监控及综合能效管理系统 高速公路典型硬件

游戏中的图片打包流程,免费的png打包plist工具,一款把若干资源图片拼接为一张大图的免费工具

手机游戏开发中&#xff0c;为了提高图片渲染性能&#xff0c;经常需要将小图片合并成一张大图进行渲染。如果手工来做的话就非常耗时。TexturePacker就是一款非常不错方便的处理工具。TexturePacker虽然非常优秀&#xff0c;但不是免费的。 对于打包流程&#xff0c;做游戏的…

读SQL学习指南(第3版)笔记03_创建和填充数据库

1. 创建数据表 1.1. sql CREATE TABLE person(person_id SMALLINT UNSIGNED,fname VARCHAR(20),lname VARCHAR(20),eye_color CHAR(2),birth_date DATE,street VARCHAR(30),city VARCHAR(20),state VARCHAR(20),country VARCHAR(20),postal_code VARCHAR(20),CONSTRAINT pk_p…

软件测试技术分享丨使用Postman搞定各种接口token实战

现在许多项目都使用jwt来实现用户登录和数据权限&#xff0c;校验过用户的用户名和密码后&#xff0c;会向用户响应一段经过加密的token&#xff0c;在这段token中可能储存了数据权限等&#xff0c;在后期的访问中&#xff0c;需要携带这段token&#xff0c;后台解析这段token才…

凯迪正大—变比测试仪

一、产品简介 KDB-II全自动变比组别测试仪是根据 《中华人民共和国电力行业标准》制造的高电压测试设备&#xff0c;按通用技术条件 DL/T963-2005设计&#xff0c;依据《电力设备交接和预防性试验规程》&#xff0c;可有效监督变压器产品出厂及使用过程中的质量&#xff0c;防…

java.lang.IllegalStateException: Failed to load ApplicationContext异常

错误原由 今天在编写SpringBoot项目整合MyBatis框架的过程中&#xff0c;产生了这个错误 java.lang.IllegalStateException: Failed to load ApplicationContextat org.springframework.test.context.cache.DefaultCacheAwareContextLoaderDelegate.loadContext(DefaultCacheA…