k8s的对外服务---ingress
service的作用体现在两个方面:
-
集群内部:不断追踪pod的变化。他会更新endpoint中的pod对象,基于pod的IP地址不断变化的一种服务发现机制。
-
集群外部:类似负载均衡器,把流量IP+端口,不涉及转发url(http、https)。把请求转发到pod当中。
service有四种类型:
ClusterIP:创建service的默认类型
NodePort:容器端口 > service端口 > nodeport。 设定了nodeport后,每个节点都会有一个端口被打开。 端口范围:30000-32767。 访问:节点ip+30000-32767实现负载均衡
loadbalancer:云平台上的一种service服务。云平台提供负载均衡的IP地址
extrenal:域名映射。
什么是ingress?
ingress是一个API对象,通过yaml文件进行配置。
ingress的作用:是定义请求如何转发到service的规则。相当于一个配置模板
ingress通过http和https暴露集群内部的service。
ingress给service提供外部的URL域名,负载均衡以及ssl/tls(加密的https)的能力。实现一个基于域名的负载均衡。
ingress-controller
ingress-controller的作用就是具体的实现反向代理和负载均衡的程序。对ingress定义的规则进行解析。根据ingress的配置规则进行请求转发。
ingress-controlle是以pod的方式运行在集群中
ingress-controller不是k8s自带的组件功能。他是一个统称,只要这个组件可以实现反向代理和负载均衡可以对ingress进行解析的、可以根据规则请求转发的都是ingress-controller
nginx-ingress-controller、traefik都是开源的ingress-controller
ingress资源的定义项
1、 定义外部流量的路由规则
2、 定义了服务的暴露方式、主机名、访问路径和其他的选项。
3、 实现负载均衡。这是由ingress-controller实现的。
ingress暴露服务的方式
1、 deployment+LoadBalancer模式:这种模式是将ingress部署在公有云。例如:华为云、阿里云、腾讯云等
在ingress的配置文件内会有一个type。type会以键值对形式设置 type: LoadBalancer
公有云平台会为 LoadBalancer 的service创建一个负载均衡器。绑定一个公网地址。通过域名指向公网地址。就可以实现集群对外暴露。
2、 DaemonSet+hostnetwork+nodeSelector模式:
其中DaemonSet会在每个节点创建一个pod。
hostnetwork表示pod和节点主机共享网络命名空间。容器内可以直接使用节点主机的IP+端口。pod中的容器可以直接访问主机上的网络资源。
nodeSelector根据标签来选择部署的节点。nginx-ingress-controller部署的节点。
缺点:直接利用节点主机的网络和端口。一个node之内部署一个ingress-controller pod。
DaemonSet+hostnetwork+nodeSelector模式性能最好,比较适合大并发的生产环境。
ingress的数据流向图:
-
客户端发起请求域名将先到DNS
-
DNS开始解析域名。映射到ingress-controller所在的节点
-
ingress-controller以pod形式运行在节点上。hostnetwork可以和节点主机共享网络
-
ingress的配置来定义URL的地址
-
根据ingress的标签匹配将请求转发到service
-
service寻找endpoints发现匹配能够转发的pod
-
最终还是由ingress-controller将(http/https)请求转发到不同的pod上。实现负载均衡
service和endpoints在这里起发现和监控的总用
实际的负载均衡由ingress-controller实现
DaemonSet+hostnetwork+nodeSelector模式如何实现?
实验部署:
master01 20.0.0.32
node01 20.0.0.34
node02 20.0.0.35master01--
修改ingress的yaml文件
vim mandatory.yaml
191 #kind: Deployment
192 kind: DaemonSet
200 # replicas: 1
215 hostNetwork: true
220 test1: "true"每台节点主机都添加nginx-ingress-controller镜像
tar -xf ingree.contro-0.30.0.tar.gz
docker load -i ingree.contro-0.30.0.tarmaster01--
kubectal get pod -n ingress-nginxkubectl label nodes node02 ingress=truekubectl apply -f mandatory.yamlmaster01---
vim nginx.yaml
apiVersion: v1
kind: PersistentVolumeClaim
metadata:name: nfs-pvc
spec:accessModes:- ReadWriteManystorageClassName: nfs-client-storageclassresources:requests:storage: 2Gi---
#定义pod
apiVersion: apps/v1
kind: Deployment
metadata:name: nginx-applabels:app: nginx1
spec:replicas: 3selector:matchLabels:app: nginx1template:metadata:labels:app: nginx1spec:containers:- name: nginximage: nginx:1.22volumeMounts:- name: nfs-pvcmountPath: /usr/share/nginx/htmlvolumes:- name: nfs-pvcpersistentVolumeClaim:claimName: nfs-pvc---
#定义serviceapiVersion: v1
kind: Service
metadata:name: nginx-app-svc
spec:ports:- protocol: TCPport: 80targetPort: 80selector:app: nginx1---
#定义ingressapiVersion: networking.k8s.io/v1
kind: Ingress
metadata:name: nginx-app-ingress
spec:rules:- host: www.test1.comhttp:paths:- path: /
#匹配工作目录的根目录pathType: Prefix
#根据前缀进行匹配 只要是/开头的都可以匹配到例如/ www.test1.com/www1/www2/www3backend:
#指定后台服务器service:name: nginx-app-svcport:number: 80
vim /etc/hosts
20.0.0.32 master01
20.0.0.34 node01
20.0.0.35 node02 www.test1.com
20.0.0.36 hub.test.com k8s5
#做域名和地址映射k8s5---
进入挂载卷之后
echo 123 > index.htmlmaster01---
curl www.test1.com
#测试网页是否可以访问
实验完成!
创建地址映射
回到k8s主机查看共享目录是否生成
测试访问是否成功
8181端口,nginx-controller默认配置的一个bachend。反向代理的端口。
所有请求当中。只要是不符合ingress配置的请求就会转发到8181端口
deployment+NodePort模式
deployment+NodePort的数据流向图:
实验部署:
master01---
vim mandatory.yaml
191 kind: Deployment
215 #hostNetwork: true
200 replicas: 1
219 kubernetes.io/os: linux
220 #test1: "true"kubectl apply -f mandatory.yaml wget https://gitee.com/mirrors/ingress-nginx/raw/nginx-0.30.0/deploy/static/provider/baremetal/service-nodeport.yaml
#获取service.yaml文件vim service-nodeport.yaml
apiVersion: v1
kind: Service
metadata:name: ingress-nginxnamespace: ingress-nginxlabels:app.kubernetes.io/name: ingress-nginxapp.kubernetes.io/part-of: ingress-nginx
spec:type: NodePortports:- name: httpport: 80targetPort: 80protocol: TCP- name: httpsport: 443targetPort: 443protocol: TCPselector:app.kubernetes.io/name: ingress-nginxapp.kubernetes.io/part-of: ingress-nginx
#执行这个yaml文件,会生成一个service。在ingress-nginx这个命名空间生成一个service。
#所有的controller的请求都会从这个定义的service的nodeport的端口。
#把请求转发到自定义的service的podkubectl apply -f service-nodeport.yamlvim nodeport.yaml
apiVersion: v1
kind: PersistentVolumeClaim
metadata:name: nfs-pvc2
spec:accessModes:- ReadWriteManystorageClassName: nfs-client-storageclassresources:requests:storage: 2Gi---
apiVersion: apps/v1
kind: Deployment
metadata:name: nginx-app2labels:app: nginx2
spec:replicas: 3selector:matchLabels:app: nginx2template:metadata:labels:app: nginx2spec:containers:- name: nginximage: nginx:1.22volumeMounts:- name: nfs-pvc2mountPath: /usr/share/nginx/htmlvolumes:- name: nfs-pvc2persistentVolumeClaim:claimName: nfs-pvc2
---
apiVersion: v1
kind: Service
metadata:name: nginx-app-svc1
spec:ports:- protocol: TCPport: 80targetPort: 80selector:app: nginx2
---
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:name: nginx-app-ingress
spec:rules:- host: www.test2.comhttp:paths:- path: /pathType: Prefixbackend:service:name: nginx-app-svc1port:number: 80kubectl apply -f nodeport.yamlk8s5---
查看挂载目录
echo 123 > index.htmlmaster01---
vim /etc/hosts
20.0.0.32 master01
20.0.0.34 node01
20.0.0.35 node02 www.test1.com www.test2.com
20.0.0.36 hub.test.com k8s5 www.test1.comcurl www.test2.com:31456
实验完成!
nodeport不再是deployment的service创建的
而是由ingress创建的
-
url请求先到ingress
-
ingress根据标签匹配ingress-nodeport
-
通过标签寻找指定的service
-
最终由service找到deployment
核心的控制组件时nginx-ingress-controller
host----ingress的配置找到pod----controller----把请求发到pod
nodeport-----controller-----ingress----service----pod
nodeport暴露端口的方式是最简单的。nodeport多了一层net(地址转换)
并发量大的对性能会有一定影响。内部都会用nodeport
通过虚拟主机的方式实现http代理
通过ingress的方式实现:一个ingress可以访问不同的主机
实验举例:
vim pod1.yaml
apiVersion: apps/v1
kind: Deployment
metadata:name: deployment1labels:test: nginx1
spec:replicas: 1selector:matchLabels:test: nginx1template:metadata:labels:test: nginx1spec:containers:- name: nginx1image: nginx:1.22---
apiVersion: v1
kind: Service
metadata:name: svc-1
spec:ports:- port: 80targetPort: 80protocol: TCPselector:test: nginx1vim pod2.yaml
apiVersion: apps/v1
kind: Deployment
metadata:name: deployment1labels:test2: nginx2
spec:replicas: 1selector:matchLabels:test2: nginx2template:metadata:labels:test2: nginx2spec:containers:- name: nginx2image: nginx:1.22---
apiVersion: v1
kind: Service
metadata:name: svc-2
spec:ports:- port: 80targetPort: 80protocol: TCPselector:test2: nginx2vim pod-ingress.yaml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:name: ingress1
spec:rules:- host: www.test1.comhttp:paths:- path: /pathType: Prefixbackend:service:name: svc-1port:number: 80---
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:name: ingress2
spec:rules:- host: www.test2.comhttp:paths:- path: /pathType: Prefixbackend:service:name: svc-2port:number: 80
kubectl apply -f pod.yaml
kubectl apply -f pod2.yaml
kubectl apply -f pod-ingress.yamlvim /etc/hosts
20.0.0.32 master01
20.0.0.34 node01 www.test1.com www.test2.com
20.0.0.35 node02 www.test1.com www.test2.com
20.0.0.36 hub.test.com k8s5 www.test1.comcurl www.test1.com:31456
curl www.test2.com:31456
访问成功实验完成!
daemonset+hostnetwork+nodeselector实现访问多个主机
实验举例:
vim daemoset-hostnetwork-nodeselector1.yamlapiVersion: v1
kind: PersistentVolumeClaim
metadata:name: nfs-pvc1
spec:accessModes:- ReadWriteManystorageClassName: nfs-client-storageclassresources:requests:storage: 2Gi---
apiVersion: apps/v1
kind: Deployment
metadata:name: nginx-app1labels:app: nginx1
spec:replicas: 1selector:matchLabels:app: nginx1template:metadata:labels:app: nginx1spec:containers:- name: nginximage: nginx:1.22volumeMounts:- name: nfs-pvc1mountPath: /usr/share/nginx/htmlvolumes:- name: nfs-pvc1persistentVolumeClaim:claimName: nfs-pvc1
---
apiVersion: v1
kind: Service
metadata:name: nginx-app-svc1
spec:ports:- protocol: TCPport: 80targetPort: 80selector:app: nginx1
---
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:name: nginx-app-ingress1
spec:rules:- host: www.test1.comhttp:paths:- path: /pathType: Prefixbackend:service:name: nginx-app-svc1port:number: 80kubectl apply -f daemoset-hostnetwork-nodeselector1.yamlvim daemoset-hostnetwork-nodeselector2.yaml
apiVersion: v1
kind: PersistentVolumeClaim
metadata:name: nfs-pvc2
spec:accessModes:- ReadWriteManystorageClassName: nfs-client-storageclassresources:requests:storage: 2Gi---
apiVersion: apps/v1
kind: Deployment
metadata:name: nginx-app2labels:app: nginx2
spec:replicas: 1selector:matchLabels:app: nginx2template:metadata:labels:app: nginx2spec:containers:- name: nginximage: nginx:1.22volumeMounts:- name: nfs-pvc2mountPath: /usr/share/nginx/htmlvolumes:- name: nfs-pvc2persistentVolumeClaim:claimName: nfs-pvc2
---
apiVersion: v1
kind: Service
metadata:name: nginx-app-svc2
spec:ports:- protocol: TCPport: 80targetPort: 80selector:app: nginx2
---
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:name: nginx-app-ingress2
spec:rules:- host: www.test2.comhttp:paths:- path: /pathType: Prefixbackend:service:name: nginx-app-svc2port:number: 80kubectl apply -f daemoset-hostnetwork-nodeselector2.yamlvim mandatory.yaml
192 kind: DaemonSet
200 #replicas: 1
215 hostNetwork: true
219 #kubernetes.io/os: linux
220 test1: "true"kubectl apply -f mandatory.yamlcurl www.test1.com
curl www.test2.com
实验完成!!
通过虚拟主机的方式实现http代理
通过ingress的方式实现:一个ingress可以访问不同的主机
实验举例:
vim pod1.yaml
apiVersion: apps/v1
kind: Deployment
metadata:name: deployment1labels:test: nginx1
spec:replicas: 1selector:matchLabels:test: nginx1template:metadata:labels:test: nginx1spec:containers:- name: nginx1image: nginx:1.22---
apiVersion: v1
kind: Service
metadata:name: svc-1
spec:ports:- port: 80targetPort: 80protocol: TCPselector:test: nginx1vim pod2.yaml
apiVersion: apps/v1
kind: Deployment
metadata:name: deployment1labels:test2: nginx2
spec:replicas: 1selector:matchLabels:test2: nginx2template:metadata:labels:test2: nginx2spec:containers:- name: nginx2image: nginx:1.22---
apiVersion: v1
kind: Service
metadata:name: svc-2
spec:ports:- port: 80targetPort: 80protocol: TCPselector:test2: nginx2vim pod-ingress.yaml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:name: ingress1
spec:rules:- host: www.test1.comhttp:paths:- path: /pathType: Prefixbackend:service:name: svc-1port:number: 80---
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:name: ingress2
spec:rules:- host: www.test2.comhttp:paths:- path: /pathType: Prefixbackend:service:name: svc-2port:number: 80
kubectl apply -f pod.yaml
kubectl apply -f pod2.yaml
kubectl apply -f pod-ingress.yamlvim /etc/hosts
20.0.0.32 master01
20.0.0.34 node01 www.test1.com www.test2.com
20.0.0.35 node02 www.test1.com www.test2.com
20.0.0.36 hub.test.com k8s5 www.test1.comcurl www.test1.com:31456
curl www.test2.com:31456
访问成功实验完成!
ingress实现https代理访问
https拥有证书和密钥。
需要创建证书和密钥
secrets保存密钥信息。部署pod时把secrets挂载到pod
实验举例:
openssl req -x509 -sha256 -nodes -days 365 -newkey rsa:2048 -keyout tls.key -out tls.crt -subj "/CN=nginxsvc/O=nginxsvc"
#req:生成证书文件命令
#x509:生成x.509自签名的证书
#-sha256:表示使用shaa-256的散列算法
#-nodes:表示生成的密钥不加密
#-days 365:证书有效期是365天
#-newkey rsa:2048:表示使用RSA的密钥队,长度是2048位
#-keyout tls.key:生成密钥文件
#-out tls.crt:生成证书文件
#-subj "/CN=nginxsvc/O=nginxsvc":表示添加一个主题
#CN:common name 名称
#O:表示organization组织kubectl create secret tls tls-secret --key tls.key --cert tls.crt
#创建secret保存密钥和证书vim ingress-https.yaml
#定义pod
apiVersion: apps/v1
kind: Deployment
metadata:name: nginx-httpslabels:app: https
spec:replicas: 3selector:matchLabels:app: httpstemplate:metadata:labels:app: httpsspec:containers:- name: nginximage: nginx:1.22---
#定义service
apiVersion: v1
kind: Service
metadata:name: nginx-svc
spec:ports:- port: 80targetPort: 80protocol: TCPselector:app: https---
#定义ingress和加密key
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:name: nginx-ingress-https
spec:tls:- hosts:- www.123ccc.comsecretName: tls-secret
#加密的配置保存在ingress当中
#请求---ingress-controller---ingress---转发到service
#目的是为了先验证通过,再实现转发到service对应的pod
#在代理进行时就要先验证密钥队,然后再把请求转发到service对应的podrules:- host: www.123ccc.comhttp:paths:- path: /pathType: Prefixbackend:
#定义使用那个service的名称service:name: nginx-svc
#定义使用那个pod的名称port:number: 80kubectl apply -f ingress-https.yamlkubectl get svc -n ingress-nginx -o widecurl -k https://www.123ccc.com:端口号
https方式同样可以实现负载均衡轮询
内部:DNS解析、地址映射
外部:收费
nginx的登录账户认证
实验举例:
htpasswd -c auth zyg
New password: 123456
Re-type new password: 123456kubectl create secret generic basic-auth --from-file=authvim basic-auth.yamlapiVersion: networking.k8s.io/v1
kind: Ingress
metadata:name: ingress-authannotations:
#开启认证模块的配置nginx.ingress.kubernetes.io/auth-type: basic
#设置认证类型为basic。是k8s自带的认证加密模块nginx.ingress.kubernetes.io/auth-secret: basic-auth
#把认证的加密模块导入到ingress当中nginx.ingress.kubernetes.io/auth-realm: 'Authentication Required-zyg'
#设置认证窗口的提示信息。
spec:rules:- host: www.zyg.comhttp:paths:- path: /pathType: Prefixbackend:service:name: nginx-svcport:number: 80
#使用http创建basic-auth
#开启认证加密的文件
#创建ingress开启认证模式
#将auth配置文件导入ingress当中
在虚拟机访问测试
nginx的重写重定向
实验举例:
vim nginx-rewite.yaml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:name: nginx-rewriteannotation:nginx.ingress.kubernetes.io/rewrite-target: https://www.123ccc.com:30416
#访问页面会跳转到指定页面
spec:rules:- host: www.zyg1.comhttp:paths:- path: /pathType: Prefixbackend:service:name: nginx-svcport:number: 80
#只要访问www.zyg.com:端口号就可以跳转到www.123ccc.com:端口号
kubectl apply -f nginx-rewite.yaml
traefik ingress controller
traefik是一个为了让部署微服务更加快捷而诞生的http的反向代理,负载均衡。是七层代理工作在应用层和nginx-ingress-controller一样
traefik可以实时的和k8s的api进行交互可以感知后端servic以及pod的变化。可以自动更新配置和重载。
traefik它可以自动感知后端的变化
traefik的部署方式
-
daemonset方式
-
deployment方式
daemonset方式的特点
daemonset方式一般用于对外集群
因为对外的业务经常变更使用daemonset可以自动发现服务配置所以用于对外
设置对外服务的标签:traefik-type: external
-
每个节点都会部署一个traefik
-
具有节点感知功能。可以自动发现、更新容器的配置。不需要手动重载。可以直接生效
缺点:资源占用较多。资源利用率不是很好。无法扩缩容。
大型的集群中daemonset可能会运行多个traefik的实例。尤其是在节点上不需要大量容器运行的情况下。
deployment方式的特点
deployment方式一般用于对内集群
因为集群内部相对稳定,更新和变化也比较少,适合deployment
设置对内服务标签:traefik-type: internal
-
集中办公控制,可以使用少量的实例来运行处理整个集群的流量
-
容易升级和维护
缺点:deployment的负载均衡不会均分到每个节点。
他无法感知容器内部配置的变化,需要手动更新
nginx-ingress和traefik-ingress的区别
相同点:
-
工作原理一样。都是七层代理
-
都可以动态更新配置
-
都可以自动发现服务
traefik-ingress的自动更新重载更快,更方便
nginx-ingress相对较慢
traefik-ingress的并发能力只有nginx-ingress的6成 60%
deployment方式
实验举例:
先启动rbac权限再启动deployment最后启动uivim traefik-ingress-nginx.yaml
apiVersion: apps/v1
kind: Deployment
metadata:name: nginx-traefiklabels:nginx: traefik
spec:replicas: 3selector:matchLabels:nginx: traefiktemplate:metadata:labels:nginx: traefikspec:containers:- name: nginximage: nginx:1.22---
apiVersion: v1
kind: Service
metadata:name: nginx-traefik-svc1
spec:ports:- port: 80targetPort: 80protocol: TCPselector:nginx: traefik---
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:name: nginx-traefik-test1
spec:rules:- host: www.yyw.comhttp:paths:- path: /pathType: Prefixbackend:service:name: nginx-traefik-svc1port:number: 80到浏览器访问测试:20.0.0.32:31095
测试自动发现机制
修改yaml文件中的副本数测试
总结
ingress的类型:
-
nginx-ingress-controller
-
traefik-ingress-controller
这两个都是开源的控制器
nginx-ingress-controller控制器三种模式:
-
deployment+loadbalancer:公有云提供负载均衡的公网地址
-
daemonset+hostnetwork+nodeselector:和节点服务共享网络,一个节点一个controller pod。使用宿主机的端口性能最好,适合大并发
-
deployment+nodeport:最常见也是最常用,也是最简单的方法。但是性能不太好,多了一层nat地址转发。
适用于高并发、大集群使用
traefik-ingress-controller控制器模式:
daemonset:对外,开源自动更新容器配置。使用hostnetwork模式 使用节点网络
deployment:对内 无法自动更新配置。使用nodeport模式。
适用于小集群
https:
-
生成证书和密钥
-
创建secret保存证书和密钥
加密认证:
-
htpasswd -c auth:认证文件只能是auth
-
创建ingress时指定认证的类型、导入密钥文件、最后加上密钥信息
-
定义ingress的规则
annotations:
#开启认证模块的配置nginx.ingress.kubernetes.io/auth-type: basic
#设置认证类型为basic。是k8s自带的认证加密模块nginx.ingress.kubernetes.io/auth-secret: basic-auth
#把认证的加密模块导入到ingress当中nginx.ingress.kubernetes.io/auth-realm: 'Authentication Required-zyg'
#设置认证窗口的提示信息。
重定向:
在指定的ingres文件当中声明的url都会跳转到这个地址
nginx.ingress.kubernetes.io/rewrite-target: https://www.123ccc.com:30416
#在指定的ingres文件当中声明的url都会跳转到这个地址
相关文章:

k8s的对外服务---ingress
service的作用体现在两个方面: 集群内部:不断追踪pod的变化。他会更新endpoint中的pod对象,基于pod的IP地址不断变化的一种服务发现机制。 集群外部:类似负载均衡器,把流量IP端口,不涉及转发url(http、htt…...

element-ui的el-upload组件实现上传拖拽排序图片顺序(sortablejs)
<template><!-- 省略其他配置 --><el-upload ref"upload" :file-list.sync"fileList"></el-upload></template><script>import Sortable from sortablejs;export default {data() {return {fileList: []};},mounted()…...

【PS】PS设计图欣赏、学习、借鉴
【PS】PS设计图欣赏、学习、借鉴 bilibili萌新PS学习计划:PS教程全套零基础教学视频(全套81节全新版本)...

游戏云化好吗?游戏云化会带来什么?
随着云计算技术的飞速发展,游戏云化成为游戏产业中备受关注的话题。这一新兴技术给玩家和游戏行业带来了全新的可能性。本文将深入探讨游戏云化的概念、优势以及可能带来的影响。 1、什么是游戏云化? 游戏云化是指将游戏的各个环节,包括游戏…...

制造业企业数字化转型难点剖析及解决之法
导语 全球正在由工业经济向数字经济转型过渡,制造业正在且并将长期处于数字化转型发展阶段,并沿着数字化、网络化、智能化阶段不断跃升。但如何找准数字化转型的切入点,以低耗能、低成本、高效率的方式加快制造业转型升级的步伐,仍…...

golang 服务端遇到strict-origin-when-cross-origin,解决跨域整理
golang 服务端遇到strict-origin-when-cross-origin,解决跨域整理 以下内容由chatgpt中文网 动态生成,助力开发找我 代码汇总: func Cors() gin.HandlerFunc {return func(c *gin.Context) {method : c.Request.Methodorigin : c.Request.Header.Get(…...

分布式事务Seata实战-AT模式(注册中心为Eureka)
大致记录Seata的AT模式下创建项目过程中需要注意的点和可能遇到的问题。 本项目是以官网的给的示例(即下图)进行创建的,以Eureka为注册中心。 官网:Seata AT 模式 | Apache Seata™ 官方代码示例: 快速启动 | Apac…...

windows vscode jsoncpp cmake c++ 构建项目
jsoncpp的编译和使用推荐文章:jsoncpp的编译和使用 | 爱编程的大丙 (subingwen.cn)https://www.subingwen.cn/cpp/jsoncpp/从这个链接下载jsoncpp-master:https://github.com/open-source-parsers/jsoncpp 可以把这个文件夹名字改成jsoncpp,…...

按照一定规则批量修改文件夹内文件的名称
#一个小朋友问我的问题,写好后,就想着分享出来# #目前只想到这一个普通的方法,应该还有更巧妙的方法,读者可以自己思考# 需求:给定文件夹40001,要求将该文件夹内的图片按照40001_00000001,40002_00000002…...

Git项目分支管理规范
一、分支管理 创建项目时,会针对不同环境创建两个常设分支(也可以算主分支,永久不会删除) master:生产环境的稳定分支,生产环境基于该分支构建。仅用来发布新版本,除了从release测试分支或 hotfix-*Bug修复分支进行m…...

ycsb压测mongodb
下载解压 https://github.com/brianfrankcooper/YCSB/releases/download/0.17.0/ycsb-mongodb-binding-0.17.0.tar.gz tar -zxvf ycsb-mongodb-binding-0.17.0.tar.gzycsb提前已经在workload文件夹下准备好了几个压测场景分别对应workload[a:f] workloads/workloada 样例 …...

【zip密码】Zip压缩包删除密码方法,有哪些?
大家都知道压缩包可以进行加密,但是当我们不需要加密压缩包的时候,该如何删除zip压缩包密码呢?那么zip压缩包密码取消都有什么方法呢?今天将方法总结分享给大家。 最原始的方法,就是通过解压文件,将解压出…...

代码随想录算法训练营day24 || 回溯法原理讲解,77.组合
回溯方法的理论原理与定义 回溯算法是潜藏于递归过程之中一种操作,与递归操作相辅相成;初步理解,有递归必有回溯,使用回溯最好的方式是递归,至于其他的方式有待探索。回溯是一种多重循环的变体,其本质就是…...

RPA与通知机器人的完美结合
写在前面 在现代快节奏的工作环境中,我们经常会面临多个任务同时进行的情况,你还在为时间不够用、忙碌而惆怅吗?你还在为时刻盯着电脑流程而烦恼吗?你还在为及时收不到自己的自动化任务进度而焦躁吗?别担心࿰…...

openssl3.2 - 官方demo学习 - signature - rsa_pss_direct.c
文章目录 openssl3.2 - 官方demo学习 - signature - rsa_pss_direct.c概述笔记END openssl3.2 - 官方demo学习 - signature - rsa_pss_direct.c 概述 用RSA私钥签名 d2i_PrivateKey_ex()可以从内存载入私钥数据, 得到私钥EVP_PKEY* 从私钥产生ctx, 对ctx进行签名初始化, 设置…...

高效批量剪辑技巧:一键按指定时长精准分割视频的方法,轻松制作视频
随着社交媒体和数字内容的快速发展,视频制作的需求也日益增长。在制作视频时,我们经常需要将长视频分割成多个片段,或者将多个片段连接在一起。为了提高效率,我们可以使用一些高效的批量剪辑技巧,一键按指定时长精准分…...

Android基础知识
1. Activity的生命周期 onCreate:Activity在启动时会被创建,后面一般不会在调用该方法(除非例外情况,将Activity回收,例如内存不足);onStart:Activity启动时,会调用该方…...

linux下把动态库变成静态库
1.用nm命令获取动态库中的所有符号列表,假如动态库的文件为lib.so nm -gD lib.so > lib.txt 将把符号列表输出到名为lib.txt的文本文件中 2.创建个新的静态库文件,使用ar命令可以创建一个空的静态库文件 ar -rcs lib.a 3.将动态库中的每个符号提…...

基于STM32单片机设计的智能水温控制系统
一、前言 1.1 项目介绍 【1】项目功能介绍 随着科技的快速发展和智能化生活的普及,人们对生活品质的需求日益提高,对家用电器自动化与智能化控制的要求也越来越高。在家庭用水场景中,热水器、浴缸以及智能水暖系统的温控需求尤为突出。传统水温控制系统往往功能单一、操作…...

PIL——图像读取、裁剪、保存操作
一、读取 Image.open(figure_path)二、裁剪 image.crop()image.crop() : 从图像中提取出某个矩形大小的图像。它接收一个四元素的元组作为参数,各元素为(x1, y1, x2, y2),即 左上角坐标、右下角坐标。坐标系统的原点(…...

Windows 下 QT开发环境的搭建:
下载QT:Index of /archive/qt/5.14 下载Cmake :CMake - Upgrade Your Software Build System (1)QT在windows,C, 打包exe: step1:window上安装QT软件: Windows下的QT系统开发环境搭建_qt windows-CSDN博客. step2:新建一个界面工程: (1)打…...

深度学习中Numpy的一些注意点(多维数组;数据类型转换、数组扁平化、np.where()、np.argmax()、图像拼接、生成同shape的图片)
文章目录 1多维数组压缩维度扩充维度 2numpy类型转换深度学习常见的float32类型。 3数组扁平化4np.where()的用法5np.argmax()6图像拼接7生成同shape的图片,指定数据类型 1多维数组 a.shape(3,2);既数组h3,w2 a.shape(2,3,2);这里第一个2表示axis0维度上…...

(2023版)斯坦福CS231n学习笔记:DL与CV教程 (56) | 卷积神经网络
前言 📚 笔记专栏:斯坦福CS231N:面向视觉识别的卷积神经网络(23)🔗 课程链接:https://www.bilibili.com/video/BV1xV411R7i5💻 CS231n: 深度学习计算机视觉(2017…...

表单验证 ---- 在Vue2中使用ElementUI进行表单验证
目录 前言 给表单绑定对应属性 在data中定义数据对象和表单的定义规则 与数据对象双向绑定 对整个表单进行验证 前言 在做项目时,对于表单进行验证是我们必不可少的 例如 搭建一个基本的登录界面 <div class"form"><h1>登录</h1>&…...

HarmonyOS 转场动画 ForEach控制
本文 我们继续说组件的专场特效 上文 HarmonyOS 转场动画 我们通过if控制了转场效果 本文 我们通过 ForEach 控制它的加载和删除 这时候就有人会好奇 ForEach 怎么控制删除呢? 很简单 循环次数不同 例如 第一次 10个 第二次 5个 那么后面的五个就相当于删除啦 我们…...

2024--Django平台开发-订单项目管理(十四)
day14 订单管理系统 1.关于登录 1.1 UI美化 页面美化,用BootStrap 自定义BooStrapForm类实现。 class BootStrapForm:exclude_filed_list []def __init__(self, *args, **kwargs):super().__init__(*args, **kwargs)# {title:对象,"percent":对象}fo…...

Docker 安装 CentOS
Docker 安装 CentOS CentOS(Community Enterprise Operating System)是 Linux 发行版之一,它是来自于 Red Hat Enterprise Linux(RHEL) 依照开放源代码规定发布的源代码所编译而成。由于出自同样的源代码,因此有些要求高度稳定性…...

方案解决:5G基站节能及数字化管理
截至2023年10月,我国5G基站总数达321.5万个,占全国通信基站总数的28.1%。然而,随着5G基站数量的快速增长,基站的能耗问题也逐渐日益凸显,基站的用电给运营商带来了巨大的电费开支压力,降低5G基站的能耗成为…...

JavaScript深浅拷贝的几种方式
文章目录 前言深拷贝1. JSON.parse(JSON.strigify(Str))2. lodash.deepclone3. structuredClone 浅拷贝总结 前言 深浅拷贝主要是针对于引用类型而言的 深拷贝 1. JSON.parse(JSON.strigify(Str)) 序列化的作用是存储(对象本身存储的只是一个地址映射,如果断电&a…...

VBA窗体跟随活动单元格【简易版】(2/2)
上一篇博客(文章连接如下)中使用工作表事件Worksheet_SelectionChange实现了窗体跟随活动单元格的动态效果。 VBA窗体跟随活动单元格【简易版】(1/2) 为了在用户滚动工作表窗体之后仍能够实现跟随效果,需要使用Application.Windows(1).Visibl…...