当前位置: 首页 > news >正文

k8s的对外服务---ingress

service的作用体现在两个方面:

  1. 集群内部:不断追踪pod的变化。他会更新endpoint中的pod对象,基于pod的IP地址不断变化的一种服务发现机制。

  2. 集群外部:类似负载均衡器,把流量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的数据流向图:

  1. 客户端发起请求域名将先到DNS

  2. DNS开始解析域名。映射到ingress-controller所在的节点

  3. ingress-controller以pod形式运行在节点上。hostnetwork可以和节点主机共享网络

  4. ingress的配置来定义URL的地址

  5. 根据ingress的标签匹配将请求转发到service

  6. service寻找endpoints发现匹配能够转发的pod

  7. 最终还是由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创建的

  1. url请求先到ingress

  1. ingress根据标签匹配ingress-nodeport

  1. 通过标签寻找指定的service

  1. 最终由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的部署方式

  1. daemonset方式

  2. deployment方式

daemonset方式的特点

daemonset方式一般用于对外集群

因为对外的业务经常变更使用daemonset可以自动发现服务配置所以用于对外

设置对外服务的标签:traefik-type: external

  1. 每个节点都会部署一个traefik

  2. 具有节点感知功能。可以自动发现、更新容器的配置。不需要手动重载。可以直接生效

缺点:资源占用较多。资源利用率不是很好。无法扩缩容。

大型的集群中daemonset可能会运行多个traefik的实例。尤其是在节点上不需要大量容器运行的情况下。

deployment方式的特点

deployment方式一般用于对内集群

因为集群内部相对稳定,更新和变化也比较少,适合deployment

设置对内服务标签:traefik-type: internal

  1. 集中办公控制,可以使用少量的实例来运行处理整个集群的流量

  2. 容易升级和维护

缺点:deployment的负载均衡不会均分到每个节点。

他无法感知容器内部配置的变化,需要手动更新

nginx-ingress和traefik-ingress的区别

相同点:

  1. 工作原理一样。都是七层代理

  2. 都可以动态更新配置

  3. 都可以自动发现服务

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的类型:

  1. nginx-ingress-controller

  2. traefik-ingress-controller

这两个都是开源的控制器

nginx-ingress-controller控制器三种模式:

  1. deployment+loadbalancer:公有云提供负载均衡的公网地址

  2. daemonset+hostnetwork+nodeselector:和节点服务共享网络,一个节点一个controller pod。使用宿主机的端口性能最好,适合大并发

  3. deployment+nodeport:最常见也是最常用,也是最简单的方法。但是性能不太好,多了一层nat地址转发。

适用于高并发、大集群使用

traefik-ingress-controller控制器模式:

daemonset:对外,开源自动更新容器配置。使用hostnetwork模式 使用节点网络

deployment:对内 无法自动更新配置。使用nodeport模式。

适用于小集群

https:

  1. 生成证书和密钥

  2. 创建secret保存证书和密钥

加密认证:

  1. htpasswd -c auth:认证文件只能是auth

  2. 创建ingress时指定认证的类型、导入密钥文件、最后加上密钥信息

  3. 定义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学习计划&#xff1a;PS教程全套零基础教学视频&#xff08;全套81节全新版本&#xff09;...

游戏云化好吗?游戏云化会带来什么?

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

制造业企业数字化转型难点剖析及解决之法

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

golang 服务端遇到strict-origin-when-cross-origin,解决跨域整理

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

分布式事务Seata实战-AT模式(注册中心为Eureka)

大致记录Seata的AT模式下创建项目过程中需要注意的点和可能遇到的问题。 本项目是以官网的给的示例&#xff08;即下图&#xff09;进行创建的&#xff0c;以Eureka为注册中心。 官网&#xff1a;Seata AT 模式 | Apache Seata™ 官方代码示例&#xff1a; 快速启动 | Apac…...

windows vscode jsoncpp cmake c++ 构建项目

jsoncpp的编译和使用推荐文章&#xff1a;jsoncpp的编译和使用 | 爱编程的大丙 (subingwen.cn)https://www.subingwen.cn/cpp/jsoncpp/从这个链接下载jsoncpp-master&#xff1a;https://github.com/open-source-parsers/jsoncpp 可以把这个文件夹名字改成jsoncpp&#xff0c;…...

按照一定规则批量修改文件夹内文件的名称

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

Git项目分支管理规范

一、分支管理 创建项目时&#xff0c;会针对不同环境创建两个常设分支(也可以算主分支&#xff0c;永久不会删除) master&#xff1a;生产环境的稳定分支&#xff0c;生产环境基于该分支构建。仅用来发布新版本&#xff0c;除了从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压缩包删除密码方法,有哪些?

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

代码随想录算法训练营day24 || 回溯法原理讲解,77.组合

回溯方法的理论原理与定义 回溯算法是潜藏于递归过程之中一种操作&#xff0c;与递归操作相辅相成&#xff1b;初步理解&#xff0c;有递归必有回溯&#xff0c;使用回溯最好的方式是递归&#xff0c;至于其他的方式有待探索。回溯是一种多重循环的变体&#xff0c;其本质就是…...

RPA与通知机器人的完美结合

写在前面 在现代快节奏的工作环境中&#xff0c;我们经常会面临多个任务同时进行的情况&#xff0c;你还在为时间不够用、忙碌而惆怅吗&#xff1f;你还在为时刻盯着电脑流程而烦恼吗&#xff1f;你还在为及时收不到自己的自动化任务进度而焦躁吗&#xff1f;别担心&#xff0…...

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进行签名初始化, 设置…...

高效批量剪辑技巧:一键按指定时长精准分割视频的方法,轻松制作视频

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

Android基础知识

1. Activity的生命周期 onCreate&#xff1a;Activity在启动时会被创建&#xff0c;后面一般不会在调用该方法&#xff08;除非例外情况&#xff0c;将Activity回收&#xff0c;例如内存不足&#xff09;&#xff1b;onStart&#xff1a;Activity启动时&#xff0c;会调用该方…...

linux下把动态库变成静态库

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

基于STM32单片机设计的智能水温控制系统

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

PIL——图像读取、裁剪、保存操作

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

Docker 离线安装指南

参考文章 1、确认操作系统类型及内核版本 Docker依赖于Linux内核的一些特性&#xff0c;不同版本的Docker对内核版本有不同要求。例如&#xff0c;Docker 17.06及之后的版本通常需要Linux内核3.10及以上版本&#xff0c;Docker17.09及更高版本对应Linux内核4.9.x及更高版本。…...

手游刚开服就被攻击怎么办?如何防御DDoS?

开服初期是手游最脆弱的阶段&#xff0c;极易成为DDoS攻击的目标。一旦遭遇攻击&#xff0c;可能导致服务器瘫痪、玩家流失&#xff0c;甚至造成巨大经济损失。本文为开发者提供一套简洁有效的应急与防御方案&#xff0c;帮助快速应对并构建长期防护体系。 一、遭遇攻击的紧急应…...

抖音增长新引擎:品融电商,一站式全案代运营领跑者

抖音增长新引擎&#xff1a;品融电商&#xff0c;一站式全案代运营领跑者 在抖音这个日活超7亿的流量汪洋中&#xff0c;品牌如何破浪前行&#xff1f;自建团队成本高、效果难控&#xff1b;碎片化运营又难成合力——这正是许多企业面临的增长困局。品融电商以「抖音全案代运营…...

大数据学习(132)-HIve数据分析

​​​​&#x1f34b;&#x1f34b;大数据学习&#x1f34b;&#x1f34b; &#x1f525;系列专栏&#xff1a; &#x1f451;哲学语录: 用力所能及&#xff0c;改变世界。 &#x1f496;如果觉得博主的文章还不错的话&#xff0c;请点赞&#x1f44d;收藏⭐️留言&#x1f4…...

Go 语言并发编程基础:无缓冲与有缓冲通道

在上一章节中&#xff0c;我们了解了 Channel 的基本用法。本章将重点分析 Go 中通道的两种类型 —— 无缓冲通道与有缓冲通道&#xff0c;它们在并发编程中各具特点和应用场景。 一、通道的基本分类 类型定义形式特点无缓冲通道make(chan T)发送和接收都必须准备好&#xff0…...

【SSH疑难排查】轻松解决新版OpenSSH连接旧服务器的“no matching...“系列算法协商失败问题

【SSH疑难排查】轻松解决新版OpenSSH连接旧服务器的"no matching..."系列算法协商失败问题 摘要&#xff1a; 近期&#xff0c;在使用较新版本的OpenSSH客户端连接老旧SSH服务器时&#xff0c;会遇到 "no matching key exchange method found"​, "n…...

git: early EOF

macOS报错&#xff1a; Initialized empty Git repository in /usr/local/Homebrew/Library/Taps/homebrew/homebrew-core/.git/ remote: Enumerating objects: 2691797, done. remote: Counting objects: 100% (1760/1760), done. remote: Compressing objects: 100% (636/636…...

AD学习(3)

1 PCB封装元素组成及简单的PCB封装创建 封装的组成部分&#xff1a; &#xff08;1&#xff09;PCB焊盘&#xff1a;表层的铜 &#xff0c;top层的铜 &#xff08;2&#xff09;管脚序号&#xff1a;用来关联原理图中的管脚的序号&#xff0c;原理图的序号需要和PCB封装一一…...

Windows 下端口占用排查与释放全攻略

Windows 下端口占用排查与释放全攻略​ 在开发和运维过程中&#xff0c;经常会遇到端口被占用的问题&#xff08;如 8080、3306 等常用端口&#xff09;。本文将详细介绍如何通过命令行和图形化界面快速定位并释放被占用的端口&#xff0c;帮助你高效解决此类问题。​ 一、准…...

SFTrack:面向警务无人机的自适应多目标跟踪算法——突破小尺度高速运动目标的追踪瓶颈

【导读】 本文针对无人机&#xff08;UAV&#xff09;视频中目标尺寸小、运动快导致的多目标跟踪难题&#xff0c;提出一种更简单高效的方法。核心创新在于从低置信度检测启动跟踪&#xff08;贴合无人机场景特性&#xff09;&#xff0c;并改进传统外观匹配算法以关联此类检测…...