Kubernetes(k8s) 笔记总结(三)

news2024/11/27 6:38:36

提示:针对kubernetes的服务网络学习。

文章目录

  • 一、Kubernetes的 Service服务发现 ClusterIP方式
    • 1. Service 介绍
    • 2. Service 暴露ClusterIP的方式(集群内部访问)
    • 3. Service 暴露NodePort方式(集群外也可以访问)
  • 二、Kubernets 之 Ingress
    • 1. Ingress 介绍
    • 2. Ingress 安装
    • 3. Ingress 实战域名访问
    • 4. Ingress高级用法 路径重写
    • 5. Ingress 流量限制
  • 三、kubernetes 之 存储抽象
    • 1. 存储层架构
    • 2. NFS系统搭建
    • 3. NFS挂载
    • 4. PV与PVC挂载(适合挂载目录)
    • 5. ConfigMap挂载(适合挂载配置文件)
    • 6. Secret (适用于保存敏感信息)


一、Kubernetes的 Service服务发现 ClusterIP方式

1. Service 介绍

什么是Service?

Service就是将一组 Pods 公开为网络服务的抽象方法。(意思就是将多个Pod分到一个Service统一的操作。)

在这里插入图片描述

2. Service 暴露ClusterIP的方式(集群内部访问)

命令行方式:

# 1. 暴露名为my-dep的Deploy,--port就是service要暴露的端口,--target-port是service到pod的端口。
[root@k8s-master ~]$ kubectl expose deployment my-dep --port=8000 --target-port=80 --type=ClusterIP(默认就是CLusterIP)
service/my-dep exposed # 会显示创建的service

# 2. 查看pod的标签
kubectl get pod --show-labels

# 2. 使用标签检索Pod
kubectl get pod -l app=my-dep

在这里插入图片描述

查看service,并且测试:

[root@k8s-master ~]$ kubectl get service
NAME         TYPE        CLUSTER-IP    EXTERNAL-IP   PORT(S)    AGE
kubernetes   ClusterIP   10.96.0.1     <none>        443/TCP    32h
my-dep       ClusterIP   10.96.4.197   <none>        8000/TCP   24s
[root@k8s-master ~]# curl 10.96.4.197:8000
hello,world2@@@
[root@k8s-master ~]# curl 10.96.4.197:8000
hello,world!

通过配置文件,也可以创建Service:

apiVersion: v1
kind: Service
metadata:
  labels:
    app: my-dep
  name: my-dep
spec:
  selector:
    app: my-dep
  ports:
  - port: 8000
    protocol: TCP
    targetPort: 80

访问Service的方式:

  • 通过IP:直接通过IP访问。
  • 通过Service的名称访问:
  • 通过域名进行操作,域名规则:服务明.所在名称空间.svc 都可以的。
    在这里插入图片描述
    Service是具有服务发现效果的,如果进行了缩容,那么就不会将请求发给下线的pod。
    以上几种方式就是ClusterIP方式:
  • ClusterIP就是集群IP,暴露出来的IP只能在集群内部访问。
    在这里插入图片描述

3. Service 暴露NodePort方式(集群外也可以访问)


# 1. 获取service列表
kubectl get svc
# 2. 删除之前的service
kubectl delete svc my-dep
# 3. 创建一个NodePort的service
# 将type指定为NodePort
kubectl expose deployment my-dep --port=8000 --target-port=80 --type=NodePort

在这里插入图片描述

此外,还会随机暴露一个端口:

  • 通过公网IP + 该端口,可以访问service里面的pod应用。
    在这里插入图片描述

NodePort范围在 30000-32767 之间。
在这里插入图片描述

二、Kubernets 之 Ingress

1. Ingress 介绍

Ingress定义:Service的统一网关入口。

官网地址:https://kubernetes.github.io/ingress-nginx/

网络的三个层次:

  • Ingress网关入口,Ingress底层就是nginx。
  • service层网络
  • Pod层网络

在这里插入图片描述

2. Ingress 安装

k8s默认是没有安装Ingress的。

# 官方下载(可能太慢)
wget https://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-v0.47.0/deploy/static/provider/baremetal/deploy.yaml

# 所以可以考虑修改镜像
vi ingress.yaml
#将image的值改为如下值:
registry.cn-hangzhou.aliyuncs.com/lfy_k8s_images/ingress-nginx-controller:v0.46.0

# -A 参数可以查看全部service,默认defalut名称空间的
kubectl get svc -A
# 检查安装的结果
kubectl get pod,svc -n ingress-nginx

# 最后别忘记把svc暴露的端口要放行

如果下载不到,考虑使用该文件: http://cdn.itholmes.com/itholmes-learn/k8s/install-Ingress.yaml

在这里插入图片描述

这样就可以通过http://139.198.183.197:30269/ 或者 https://139.198.183.197:139.198.183.197:30921/ 来进行访问测试了。


Ingress架构图:
在这里插入图片描述

3. Ingress 实战域名访问

实战架构:
在这里插入图片描述

实战环境搭建:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: hello-server
spec:
  replicas: 2
  selector:
    matchLabels:
      app: hello-server
  template:
    metadata:
      labels:
        app: hello-server
    spec:
      containers:
      - name: hello-server
        image: registry.cn-hangzhou.aliyuncs.com/lfy_k8s_images/hello-server
        ports:
        - containerPort: 9000
---
apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    app: nginx-demo
  name: nginx-demo
spec:
  replicas: 2
  selector:
    matchLabels:
      app: nginx-demo
  template:
    metadata:
      labels:
        app: nginx-demo
    spec:
      containers:
      - image: nginx
        name: nginx
---
apiVersion: v1
kind: Service
metadata:
  labels:
    app: nginx-demo
  name: nginx-demo
spec:
  selector:
    app: nginx-demo
  ports:
  - port: 8000
    protocol: TCP
    targetPort: 80
---
apiVersion: v1
kind: Service
metadata:
  labels:
    app: hello-server
  name: hello-server
spec:
  selector:
    app: hello-server
  ports:
  - port: 8000
    protocol: TCP
    targetPort: 9000

上面配置文件作用:创建了多个Pod,并且将Pod按照Service进行了分配。

接下来就是告诉Ingress当访问哪个域名的时候,走哪个service。相当于给Ingress配置规则。

配置Ingress,当访问hello.abc.com域名时,走名为hello-server的service的8000端口:

apiVersion: networking.k8s.io/v1
kind: Ingress  
metadata:
  name: ingress-host-bar
spec:
  ingressClassName: nginx
  rules:
  - host: "hello.abc.com"
    http:
      paths:
      - pathType: Prefix
        path: "/"
        backend:
          service:
            name: hello-server
            port:
              number: 8000
# 可以配置多个规则
  - host: "demo.abc.com"
    http:
      paths:
      - pathType: Prefix
        path: "/nginx"  # 把请求会转给下面的服务,下面的服务一定要能处理这个路径,不能处理就是404
        backend:
          service:
            name: nginx-demo  ## java,比如使用路径重写,去掉前缀nginx
            port:
              number: 8000

在这里插入图片描述

# kubectl get ingress可以查看ingress的一些明细
[root@k8s-master ~]$ kubectl get ingress
NAME               CLASS   HOSTS                        ADDRESS      PORTS   AGE
ingress-host-bar   nginx   hello.abc.com,demo.abc.com   172.31.0.4   80      9s

知识点:可以使用utools的hosts插件,来控制本地域名映射方便测试。
在这里插入图片描述

在这里插入图片描述

这样进行测试访问,就完成了(此处,青云网站阻挡了,得使用一个备案过得域名才行。)。


还可以根据path路径,配置Ingress规则,走哪条service。

# 1. 获取明细列表
kubectl get ing
# 2. 修改配置文件
kubectl edit ing ingress名称

4. Ingress高级用法 路径重写

也可以参考一些rewrite一些功能啥的:

  • 官网地址:https://kubernetes.github.io/ingress-nginx/
    在这里插入图片描述

5. Ingress 流量限制

去官方看看案例教程就可以
在这里插入图片描述

三、kubernetes 之 存储抽象

1. 存储层架构

存储层:
在这里插入图片描述

2. NFS系统搭建

NFS系统:网络文件系统。

NFS系统原理:就是再各个节点都创建一份相同的存储空间,然后不断进行同步。
在这里插入图片描述
NFS架构图:
在这里插入图片描述


第一步:NFS环境搭建

# 在所有节点都进行nfs环境安装 
yum install -y nfs-utils

第二步:在master节点配置nfs主节点。

# 1. 在master节点执行如下命令(也就是master就是 nfs主节点 了)
# 以下是个配置暴露规则
echo "/nfs/data/ *(insecure,rw,sync,no_root_squash)" > /etc/exports
# 2. 创建对应文件夹
mkdir -p /nfs/data
# 3. 启动rpcbind服务
systemctl enable rpcbind --now
# 4. 启动nfc服务
systemctl enable nfs-server --now
# 5. 让配置生效
exportfs -r
# 6. 进行查看
exportfs
# 7. 通过showmount查看ip暴露了哪些目录
[root@k8s-master ~]$ showmount -e 172.31.0.2
Export list for 172.31.0.2:
/nfs/data *

在这里插入图片描述

第三步:在node节点配置,从节点。

# 1. 在master节点通过该命令可以查看IP暴露了那些目录
[root@k8s-master ~]$ showmount -e 172.31.0.2
Export list for 172.31.0.2:
/nfs/data *

# 2. 在node节点执行以下命令:
# 创建对应目录,执行以下命令挂载 nfs 服务器上的共享目录到本机路径 /root/nfsmount
mkdir -p /nfs/data

# 挂载远程172.31.0.2(master)服务器下的/nfs/data这个服务。
mount -t nfs 172.31.0.2:/nfs/data /nfs/data
# 这样无论在那个节点进行测试都会同步。 
echo "hello nfs server" > /nfs/data/test.txt

这样NFS就搭建成功。

3. NFS挂载

NFS进行挂载:

apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    app: nginx-pv-demo
  name: nginx-pv-demo
spec:
  replicas: 2
  selector:
    matchLabels:
      app: nginx-pv-demo
  template:
    metadata:
      labels:
        app: nginx-pv-demo
    spec:
      containers:
      - image: nginx
        name: nginx
        volumeMounts:
        - name: html
          mountPath: /usr/share/nginx/html
      volumes:
        - name: html
          nfs:
            server: 172.31.0.2 # 改为自己nfs-server的ip地址(也就是master)
            path: /nfs/data/nginx-pv

注意:可能需要先创建出对应目录来/nfs/data/nginx-pv。不然,pod无法启动起来。
在这里插入图片描述
提示:nfs系统不算是很好的方式。(一者没办法定义每个Pod的容量;二者如果Pod被清除了对应卷的资源不会被清除,无法释放。)

4. PV与PVC挂载(适合挂载目录)

PV:持久卷(Persistent Volume),将应用需要持久化的数据保存到指定位置
PVC:持久卷申明(Persistent Volume Claim),申明需要使用的持久卷规格(申请多少容量)

在这里插入图片描述


第一步:创建pv池(静态供应)。

# 在nfs主节点(对应master节点),创建三个模块
mkdir -p /nfs/data/01
mkdir -p /nfs/data/02
mkdir -p /nfs/data/03

创建PV:(master节点运行)

apiVersion: v1
kind: PersistentVolume
metadata:
  name: pv01-10m
spec:
  capacity:
    storage: 10M
  accessModes:
    - ReadWriteMany
  storageClassName: nfs
  nfs:
    path: /nfs/data/01
    server: 172.31.0.2
---
apiVersion: v1
kind: PersistentVolume
metadata:
  name: pv02-1gi
spec:
  capacity:
    storage: 1Gi
  accessModes:
    - ReadWriteMany
  storageClassName: nfs
  nfs:
    path: /nfs/data/02
    server: 172.31.0.2
---
apiVersion: v1
kind: PersistentVolume
metadata:
  name: pv03-3gi
spec:
  capacity:
    storage: 2Gi
  accessModes:
    - ReadWriteMany
  storageClassName: nfs
  nfs:
    path: /nfs/data/03
    server: 172.31.0.2
# 查看PV池相关信息
kubectl get persistentvolume

第二步:PVC创建与绑定。(相当于写一个规格申请)

kind: PersistentVolumeClaim
apiVersion: v1
metadata:
  name: nginx-pvc
spec:
  accessModes:
    - ReadWriteMany
  resources:
    requests:
      storage: 200Mi
  storageClassName: nfs

在这里插入图片描述
删除了就会释放:
在这里插入图片描述
删除了在重新应用上,发现并不会再原来的pv创建原因如下:
在这里插入图片描述

第三步:创建Pod并且绑定PVC。

apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    app: nginx-deploy-pvc
  name: nginx-deploy-pvc
spec:
  replicas: 2
  selector:
    matchLabels:
      app: nginx-deploy-pvc
  template:
    metadata:
      labels:
        app: nginx-deploy-pvc
    spec:
      containers:
      - image: nginx
        name: nginx
        volumeMounts:
        - name: html
          mountPath: /usr/share/nginx/html
      volumes:
        - name: html
          persistentVolumeClaim:
            claimName: nginx-pvc
# 查看pvc信息:
[root@k8s-master ~]$ kubectl get pvc
NAME        STATUS   VOLUME     CAPACITY   ACCESS MODES   STORAGECLASS   AGE
nginx-pvc   Bound    pv03-3gi   2Gi        RWX            nfs            6m42s
# 查看pvc,pv的关系
[root@k8s-master ~]$ kubectl get pvc,pv
NAME                              STATUS   VOLUME     CAPACITY   ACCESS MODES   STORAGECLASS   AGE
persistentvolumeclaim/nginx-pvc   Bound    pv03-3gi   2Gi        RWX            nfs            7m43s

NAME                        CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS      CLAIM               STORAGECLASS   REASON   AGE
persistentvolume/pv01-10m   10M        RWX            Retain           Available                       nfs                     17m
persistentvolume/pv02-1gi   1Gi        RWX            Retain           Released    default/nginx-pvc   nfs                     17m
persistentvolume/pv03-3gi   2Gi        RWX            Retain           Bound       default/nginx-pvc   nfs                     17m

这样PV与PVC搭建完成。


还有一种的动态供应PV池:

在这里插入图片描述

5. ConfigMap挂载(适合挂载配置文件)

ConfigMap抽取应用配置,并且可以自动更新。

以redis为案例:

[root@k8s-master 03]$ vi redis.conf
[root@k8s-master 03]$ cat redis.conf 
# ConfigMap挂载的配置文件,是引用的,并不是替换的。因此,写必须的就可以。
appendonly yes

第一步:先创建配置集。

# 1. 创建一个名为redis-conf的配置集
[root@k8s-master ~]$ kubectl create cm redis-conf --from-file=redis.conf
configmap/redis-conf created
# 2. 查看配置集
[root@k8s-master ~]$ kubectl get cm
NAME               DATA   AGE
kube-root-ca.crt   1      2d8h
redis-conf         1      7s
# 3. 其实配置集在k8s的etcd里面(专门存储配置的那个库)
# 可以通过 名称 + -oyaml 来查看对应的yaml配置。
kubectl get cm redis-conf -oyaml

解析一下配置:

[root@k8s-master ~]$ kubectl get cm redis-conf -oyaml
apiVersion: v1
data:    #data是所有真正的数据,key:默认是文件名   value:配置文件的内容
  redis.conf: |
    appendonly yes
kind: ConfigMap
metadata:
  name: redis-conf
  namespace: default

第二步:创建Pod,并且进行配置引用配置集。

创建Pod,并且

apiVersion: v1
kind: Pod
metadata:
  name: redis
spec:
  containers:
  - name: redis
    image: redis
    command:
      - redis-server
      - "/redis-master/redis.conf"  #指的是redis容器内部的位置
    ports:
    - containerPort: 6379
    volumeMounts:
    - mountPath: /data
      name: data
    - mountPath: /redis-master
      name: config
  volumes:
    - name: data
      emptyDir: {}
    - name: config
      configMap:
        name: redis-conf
        items:
        - key: redis.conf
          path: redis.conf

针对配置的一个解释:
在这里插入图片描述

可以去看看对应的pod的内部目录:
在这里插入图片描述

这样配置就算完成。

第三步:如果修改了ConfigMap,就检查是否更新。

apiVersion: v1
kind: ConfigMap
metadata:
  name: example-redis-config
data:
  redis-config: |
    maxmemory 2mb
    maxmemory-policy allkeys-lru 
kubectl exec -it redis -- redis-cli
# CONFIG GET key名 查询配置文件中的某个key的值。
127.0.0.1:6379> CONFIG GET maxmemory
127.0.0.1:6379> CONFIG GET maxmemory-policy

检查指定文件内容是否已经更新
修改了CM。Pod里面的配置文件会跟着变

配置值未更改,因为需要重新启动 Pod 才能从关联的 ConfigMap 中获取更新的值。
原因:我们的Pod部署的中间件自己本身没有热更新能力

6. Secret (适用于保存敏感信息)


像密码,认证令牌,SSH密钥等都属于敏感信息。

# 1. 就是设置一个用户密码邮箱之类的,例如下面登录私有docker库的用户名密码。
kubectl create secret docker-registry leifengyang-docker \
--docker-username=leifengyang \
--docker-password=Lfy123456 \
--docker-email=534096094@qq.com

# 2. 命令格式为
kubectl create secret docker-registry regcred \
  --docker-server=<你的镜像仓库服务器> \
  --docker-username=<你的用户名> \
  --docker-password=<你的密码> \
  --docker-email=<你的邮箱地址>

# 3. 获取secret相关信息
kubectl get secret

创建一个Pod拉取的镜像,登录私有docker库:

apiVersion: v1
kind: Pod
metadata:
  name: private-nginx
spec:
  containers:
  - name: private-nginx
    image: leifengyang/guignginx:v1.0
  imagePullSecrets:
  - name: leifengyang-docker

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

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

相关文章

十一、51单片机之串口通信

1、通信的关键 (1)事先约定。通信之前规定好的&#xff0c;如通信速率&#xff0c;起始信号&#xff0c;结束信号等。 (2)通信传输的基本信息单元。 (3)信息的编码、传输、解码。 2、通信相关的概念 2.1、同步和异步 (1)同步通信要求接收端时钟频率与发送端时钟频率一致&a…

【Python爬虫项目实战】Python爬虫采集弹幕数据

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录前言一、开发工具二、环境搭建三、数据来源查询分析四、代码实现1. 发送请求2.设置编码格式3.解析数据4.保存数据总结前言 今天给大家介绍的是Python爬虫采集弹幕数…

django项目中使用logging记录日志

前提 基于已有项目https://blog.csdn.net/qq_38122800/article/details/128583379?spm1001.2014.3001.5502 1、修改settings.py 在settings.py文件中添加如下代码: 先导入模块: import os,time#配置日志cur_path os.path.dirname(os.path.realpath(__file__)) # log_pat…

Vue3——第九章(依赖注入:provide、inject)

一、Prop 逐级透传问题 通常情况下&#xff0c;当我们需要从父组件向子组件传递数据时&#xff0c;会使用 props。如果需要给深层子组件传递数据&#xff0c;会非常麻烦&#xff0c;如下图&#xff1a; provide 和 inject 可以帮助我们解决这一问题。一个父组件相对于其所有的…

【memcpy和memove函数的详解】

1.memcpy函数详解 模拟实现memcpy函数 2.memmove函数详解 模拟实现memmove函数 memset函数详解 memcpy函数 了解一个函数&#xff0c;就查询该函数的相关信息 memcpy函数在库中的声明如下&#xff1a; void * memcpy ( void * destination, const void * source, size_…

Node.js安装与编写

Node.js是JavaScript运行环境&#xff0c;是可以让JavaScript运行在服务端的开发平台。 Node.js对一些特殊用例进行优化&#xff0c;提供替代的API。 Node.js本质上是为文件系统、数据库之类的资源提供接口。 Node.js是单线程的&#xff0c;通过事件循环&#xff08;event l…

05【JSP-MVC】

文章目录05【JSP-MVC】一、JSP简介1.1 JSP概述1.1.1 HTML和Servlet的弊端1.1.1 什么是JSP1.2 JSP体验&#xff1a;1.2.2 JSP的执行过程1.2.2 JSP和Servlet是什么关系&#xff1f;二、JSP的脚本元素2.1 JSP中的注释&#xff1a;2.2 JSP脚本表达式2.3 JSP代码片段2.4 JSP声明2.5 …

数字音频接口DAI之I2S/PCM

I2S/PCM数字音频接口概述数字音频接口DAI&#xff0c;即Digital Audio Interfaces&#xff0c;顾名思义&#xff0c;DAI表示在板级或板间传输数字音频信号的方式。相比于模拟接口&#xff0c;数字音频接口抗干扰能力更强&#xff0c;硬件设计简单&#xff0c;DAI在音频电路设计…

深度学习——循环神经网络RNN(笔记)

循环神经网络RNN&#xff1a;对于序列模型的神经网络 1.回顾&#xff1a;潜变量自回归模型 使用潜变量ht总结过去的信息 ①xt跟当前的ht和x(t-1)相关 ②ht跟ht-1和xt-1相关 ③n元语法模型中&#xff0c;单词xt在时间t的条件概率取决于前面n-1个单词 隐藏层和隐藏状态的区别…

【ESP32Cam项目1】:ESP32Cam人脸检测(ArduinoESP32底层、Python版opencv)

人脸检测项目效果图&#xff1a; 人脸检测效果视频&#xff1a; 暮年的主页 - 抖音 (douyin.com) 人脸检测项目目标&#xff1a; 大家好&#xff01;近期拿到了便宜的ESP32Cam开发板&#xff0c;摄像头让我想起来人脸识别&#xff0c;于是ESP32Cam人脸检测项目由此诞生。后期还…

一文总结ACE代码框架

一、前言ACE_Engine框架是OpenAtom OpenHarmony&#xff08;简称“OpenHarmony”&#xff09;的UI开发框架&#xff0c;为开发者提供在进行应用UI开发时所必需的各种组件&#xff0c;以及定义这些组件的属性、样式、事件及方法&#xff0c;通过这些组件可以方便进行OpenHarmony…

JavaScript面试题

目录1.★★ 介绍一下JS的内置类型有哪些&#xff1f;2.★★★★ 介绍一下 typeof 区分类型的原理3.★★★ 介绍一下类型转换4.★★★★ 说说你对 JavaScript 的作用域的理解。什么是作用域链&#xff1f;5.★★ 解释下 let 和 const 的块级作用域6.★★★★ 说说你对执行上下文…

用Vue+Nodejs+Axios+express连接Sqlserver做一个动态网页demo

文章目录一、主要工具二、流程2.1. 安装Node2.2. 新建Vue工程并启动2.3. 前后端通信2.3.1. 修改前端2.3.2. 用axios来发起请求2.3.3. 创建服务端程序一、主要工具 Vue做前端页面Nodejs做服务器后端&#xff08;Nodejs是一个JS的运行环境&#xff0c;可以让JS像其它后端语言一样…

使用超体素上下文和基于图的优化从MLS点云对城市地区的树木进行实例分割

Abstract 在本文中&#xff0c;开发了一种用于从城市场景中的 MLS 数据集中提取树木的实例分割方法。所提出的方法利用超体素结构来组织点云&#xff0c;然后从超体素的局部上下文中提取去除趋势的几何特征。结合局部上下文的去趋势特征&#xff0c;将采用随机森林&#xff08…

Qt基于CTK Plugin Framework搭建插件框架--创建插件

文章目录一、前言二、工程搭建2.1、新建Qt工程2.2、CTK环境配置三、CTK Plugin Framework使用3.1、主函数启动插件框架3.2、插件的创建3.3、插件的使用一、前言 CTK保姆级编译教程&#xff1a;https://blog.csdn.net/Mr_robot_strange/article/details/128547331?spm1001.201…

JavaGUI:多功能计算器(五)--Swing实现双语数据包+菜单切换(完整源码)

JavaGUI&#xff1a;多功能计算器&#xff08;五&#xff09;–Swing实现双语数据包菜单切换&#xff08;完整源码&#xff09; 【背景提示】 “软件国际化”就是实现多种语言显示切换。 1.在前端网页上&#xff0c;可通过探测本地化语言环境实现自动切换&#xff1b; 2.在操…

C++ 20 原子引用 (一)

C 20 原子引用 &#xff08;一&#xff09; std::atomic_ref{} std::atomic_ref类型对其引用的对象进行原子操作。 使用std::atomic_ref 进行多线程读写时不会造成数据争用。被引用对象的生命周期必须超过std::atomic_ref 。操作std::atomic_ref 的子对象是未定义行为。 错…

Docker版RabbitMQ安装延迟队列插件及延迟队列项目应用实战

前言 在项目中经常有延迟业务处理的背景&#xff0c;此时可以借助于Rabbitmq的延迟队列进行实现&#xff0c;但Rabbitmq本身并不支持延迟队列&#xff0c;但可以通过安装插件的方式实现延迟队列 环境准备 首先确认目前项目使用的Rabbitmq的版本&#xff0c;这里博主的版本是3.…

STM32系列(HAL库)——使用ESP8266-01S物联网模块连接Onenet云平台上报DHT11温湿度

前言 本篇主要讲解如何使用ESP8266-01S物联网模块连接Onenet云平台&#xff0c;并上报DHT11模块的温湿度数据。本文单片机主控采用STM32F405RGT6&#xff0c;使用其他主控的话基本要求有2个串口&#xff0c;一个串口用于调试使用&#xff0c;另一个用于ESP模块通讯。 一、前…

SOLIDWORKS 2023工程图和出详图新功能 创建更智能化 更高精度的工程详图

工程图是传达您设计意图的重要文档&#xff0c;您设计的产品越复杂&#xff0c;越需要详细注释说明。SOLIDWORKS 2023增强的工程图和出详图功能将帮助您创建更智能化、更高精度的工程详图&#xff0c;并且扩展新功能使您的设计工作延伸到更多的业务领域。您现在可以从更高层级的…