kubernetes集群编排——service微服务

news2024/11/25 14:48:12

service微服务

创建测试示例

vim myapp.yml
apiVersion: apps/v1

kind: Deployment

metadata:

  labels:

    app: myapp

  name: myapp

spec:

  replicas: 6

  selector:

    matchLabels:

      app: myapp

  template:

    metadata:

      labels:

        app: myapp

    spec:

      containers:

      - image: myapp:v1

        name: myapp



---



apiVersion: v1

kind: Service

metadata:

  labels:

    app: myapp

  name: myapp

spec:

  ports:

  - port: 80

    protocol: TCP

    targetPort: 80

  selector:

    app: myapp

  type: ClusterIP
kubectl apply -f myapp.yml

kubectl get svc

默认使用iptables调度

ipvs模式

修改proxy配置

kubectl -n kube-system edit  cm kube-proxy
...

mode: "ipvs"

重启pod

kubectl -n kube-system get pod|grep kube-proxy | awk '{system("kubectl -n kube-system delete pod "$1"")}'

切换ipvs模式后,kube-proxy会在宿主机上添加一个虚拟网卡:kube-ipvs0,并分配service IP

ip a

ipvsadm -ln

clusterip

clusterip模式只能在集群内访问

vim myapp.yml
---

apiVersion: v1

kind: Service

metadata:

  labels:

    app: myapp

  name: myapp

spec:

  ports:

  - port: 80

    protocol: TCP

    targetPort: 80

  selector:

    app: myapp

  type: ClusterIP

service创建后集群DNS提供解析

kubectl get svc

dig -t A myapp.default.svc.cluster.local. @10.96.0.10

headless

vim myapp.yml
---

apiVersion: v1

kind: Service

metadata:

  labels:

    app: myapp

  name: myapp

spec:

  ports:

  - port: 80

    protocol: TCP

    targetPort: 80

  selector:

    app: myapp

  type: ClusterIP

  clusterIP: None
kubectl delete svc myapp

kubectl apply -f myapp.yml

headless模式不分配vip

kubectl get svc

headless通过svc名称访问,由集群内dns提供解析

dig -t A myapp.default.svc.cluster.local. @10.96.0.10

集群内直接使用service名称访问

kubectl run demo --image busyboxplus -it --rm

nslookup myapp

cat /etc/resolv.conf

curl myapp

curl myapp/hostname.html

nodeport

vim myapp.yml
---

apiVersion: v1

kind: Service

metadata:

  labels:

    app: myapp

  name: myapp

spec:

  ports:

  - port: 80

    protocol: TCP

    targetPort: 80

  selector:

    app: myapp

  type: NodePort
kubectl apply -f myapp.yml

kubectl get svc

nodeport在集群节点上绑定端口,一个端口对应一个服务

curl 192.168.92.12:32195

loadbalancer

vim myapp.yml
---

apiVersion: v1

kind: Service

metadata:

  labels:

    app: myapp

  name: myapp

spec:

  ports:

  - port: 80

    protocol: TCP

    targetPort: 80

  selector:

    app: myapp

  type: LoadBalancer
kubectl apply -f myapp.yml

默认无法分配外部访问IP

kubectl get svc

LoadBalancer模式适用云平台,裸金属环境需要安装metallb提供支持

metallb

官网:https://metallb.universe.tf/installation/

kubectl edit configmap -n kube-system kube-proxy
apiVersion: kubeproxy.config.k8s.io/v1alpha1

kind: KubeProxyConfiguration

mode: "ipvs"

ipvs:

  strictARP: true
kubectl -n kube-system get pod|grep kube-proxy | awk '{system("kubectl -n kube-system delete pod "$1"")}'

下载部署文件

wget https://raw.githubusercontent.com/metallb/metallb/v0.13.12/config/manifests/metallb-native.yaml

修改文件中镜像地址,与harbor仓库路径保持一致

vim metallb-native.yaml
...

image: metallb/speaker:v0.13.12

image: metallb/controller:v0.13.12

上传镜像到harbor

docker pull quay.io/metallb/controller:v0.13.12
docker pull quay.io/metallb/speaker:v0.13.12

docker tag quay.io/metallb/controller:v0.13.12 reg.westos.org/metallb/controller:v0.13.12
docker tag quay.io/metallb/speaker:v0.13.12 reg.westos.org/metallb/speaker:v0.13.12

docker push reg.westos.org/metallb/controller:v0.13.12
docker push reg.westos.org/metallb/speaker:v0.13.12

部署服务

kubectl apply -f metallb-native.yaml

kubectl -n metallb-system get pod

配置分配地址段

vim config.yaml
apiVersion: metallb.io/v1beta1
kind: IPAddressPool
metadata:
  name: first-pool
  namespace: metallb-system
spec:
  addresses:
  - 192.168.92.100-192.168.92.200

---
apiVersion: metallb.io/v1beta1
kind: L2Advertisement
metadata:
  name: example
  namespace: metallb-system
spec:
  ipAddressPools:
  - first-pool
​
kubectl apply -f config.yaml

kubectl get svc

通过分配地址从集群外访问服务

curl 192.168.92.100

curl 192.168.92.100/hostname.html

curl 192.168.92.100/hostname.html

curl 192.168.92.100/hostname.html

nodeport默认端口

vim myapp.yml
apiVersion: v1

kind: Service

metadata:

  labels:

    app: myapp

  name: myapp

spec:

  ports:

  - port: 80

    protocol: TCP

    targetPort: 80

    nodePort: 33333

  selector:

    app: myapp

  type: NodePort
kubectl apply -f myapp.yml

nodeport默认端口是30000-32767,超出会报错

vim /etc/kubernetes/manifests/kube-apiserver.yaml

添加如下参数,端口范围可以自定义

- --service-node-port-range=30000-50000

修改后api-server会自动重启,等apiserver正常启动后才能操作集群

externalname

vim externalname.yaml
apiVersion: v1

kind: Service

metadata:

  name: my-service

spec:

  type:  ExternalName

  externalName: www.westos.org
​kubectl apply -f externalname.yaml

dig -t A my-service.default.svc.cluster.local. @10.96.0.10

ingress-nginx

部署

官网:https://kubernetes.github.io/ingress-nginx/deploy/#bare-metal-clusters

下载部署文件

 wget https://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-v1.8.2/deploy/static/provider/baremetal/deploy.yaml

上传镜像到harbor

docker pull dyrnq/ingress-nginx-controller:v1.8.2

docker pull dyrnq/kube-webhook-certgen:v20230407

docker tag dyrnq/ingress-nginx-controller:v1.8.2 reg.westos.org/ingress-nginx/controller:v1.8.2

docker tag dyrnq/kube-webhook-certgen:v20230407 reg.westos.org/ingress-nginx/kube-webhook-certgen:v20230407

docker push reg.westos.org/ingress-nginx/controller:v1.8.2

docker push reg.westos.org/ingress-nginx/kube-webhook-certgen:v20230407

修改3个镜像路径

vim deploy.yaml
...
image: ingress-nginx/controller:v1.8.2
...
image: ingress-nginx/kube-webhook-certgen:v20230407
...
image: ingress-nginx/kube-webhook-certgen:v20230407

kubectl apply -f deploy.yaml

kubectl -n ingress-nginx get pod

kubectl -n ingress-nginx get svc

修改为LoadBalancer方式

kubectl -n ingress-nginx edit  svc ingress-nginx-controller
type: LoadBalancer

kubectl -n ingress-nginx get svc

创建ingress策略

vim ingress.yml
apiVersion: networking.k8s.io/v1

kind: Ingress

metadata:

  name: minimal-ingress

spec:

  ingressClassName: nginx

  rules:

  - http:

      paths:

      - path: /

        pathType: Prefix

        backend:

          service:

            name: myapp

            port:

              number: 80
kubectl apply -f ingress.yml
kubectl get pod

kubectl get svc

kubectl get ingress

ingress必须和输出的service资源处于同一namespace

测试

curl 192.168.92.100

回收资源

kubectl delete  -f myapp.yml

kubectl delete  -f ingress.yml

基于路径访问

文档: https://v1-25.docs.kubernetes.io/zh-cn/docs/concepts/services-networking/ingress/

创建svc

vim myapp-v1.yml
apiVersion: apps/v1

kind: Deployment

metadata:

  labels:

    app: myapp-v1

  name: myapp-v1

spec:

  replicas: 3

  selector:

    matchLabels:

      app: myapp-v1

  template:

    metadata:

      labels:

        app: myapp-v1

    spec:

      containers:

      - image: myapp:v1

        name: myapp-v1

---

apiVersion: v1

kind: Service

metadata:

  labels:

    app: myapp-v1

  name: myapp-v1

spec:

  ports:

  - port: 80

    protocol: TCP

    targetPort: 80

  selector:

    app: myapp-v1

  type: ClusterIP
kubectl apply -f myapp-v1.yml
vim myapp-v2.yml
apiVersion: apps/v1

kind: Deployment

metadata:

  labels:

    app: myapp-v2

  name: myapp-v2

spec:

  replicas: 3

  selector:

    matchLabels:

      app: myapp-v2

  template:

    metadata:

      labels:

        app: myapp-v2

    spec:

      containers:

      - image: myapp:v2

        name: myapp-v2

---

apiVersion: v1

kind: Service

metadata:

  labels:

    app: myapp-v2

  name: myapp-v2

spec:

  ports:

  - port: 80

    protocol: TCP

    targetPort: 80

  selector:

    app: myapp-v2

  type: ClusterIP
kubectl apply -f myapp-v2.yml
kubectl get svc

创建ingress

vim ingress1.yml
apiVersion: networking.k8s.io/v1

kind: Ingress

metadata:

  name: minimal-ingress

  annotations:

    nginx.ingress.kubernetes.io/rewrite-target: /

spec:

  ingressClassName: nginx

  rules:

  - host: myapp.westos.org

    http:

      paths:

      - path: /v1

        pathType: Prefix

        backend:

          service:

            name: myapp-v1

            port:

              number: 80



      - path: /v2

        pathType: Prefix

        backend:

          service:

            name: myapp-v2

            port:

              number: 80
kubectl apply -f ingress1.yml

kubectl describe ingress minimal-ingress

测试

vim /etc/hosts
...
192.168.92.100 myapp.westos.org myapp1.westos.org myapp2.westos.org

curl  myapp.westos.org/v1

curl  myapp.westos.org/v2

回收

kubectl delete -f ingress1.yml

基于域名访问

vim ingress2.yml
apiVersion: networking.k8s.io/v1

kind: Ingress

metadata:

  name: minimal-ingress

spec:

  ingressClassName: nginx

  rules:

  - host: myapp1.westos.org

    http:

      paths:

      - path: /

        pathType: Prefix

        backend:

          service:

            name: myapp-v1

            port:

              number: 80



  - host: myapp2.westos.org

    http:

      paths:

      - path: /

        pathType: Prefix

        backend:

          service:

            name: myapp-v2

            port:

              number: 80
kubectl apply -f ingress2.yml

kubectl describe ingress minimal-ingress

测试

curl  myapp1.westos.org

curl  myapp2.westos.org

回收

kubectl delete -f ingress2.yml

TLS加密

创建证书

openssl req -x509 -sha256 -nodes -days 365 -newkey rsa:2048 -keyout tls.key -out tls.crt -subj "/CN=nginxsvc/O=nginxsvc"

kubectl create secret tls tls-secret --key tls.key --cert tls.crt

vim ingress3.yml
apiVersion: networking.k8s.io/v1

kind: Ingress

metadata:

  name: ingress-tls

spec:

  tls:

    - hosts:

      - myapp.westos.org

      secretName: tls-secret

  ingressClassName: nginx

  rules:

  - host: myapp.westos.org

    http:

      paths:

      - path: /

        pathType: Prefix

        backend:

          service:

            name: myapp-v1

            port:

              number: 80
kubectl apply -f ingress3.yml

kubectl describe ingress ingress-tls

测试

curl -k https://myapp.westos.org

auth认证

创建认证文件

yum install -y httpd-tools

htpasswd -c auth hjl


cat auth


kubectl create secret generic basic-auth --from-file=auth

vim ingress3.yml
apiVersion: networking.k8s.io/v1

kind: Ingress

metadata:

  name: ingress-tls

  annotations:

    nginx.ingress.kubernetes.io/auth-type: basic

    nginx.ingress.kubernetes.io/auth-secret: basic-auth

    nginx.ingress.kubernetes.io/auth-realm: 'Authentication Required - hjl'

spec:

  tls:

    - hosts:

      - myapp.westos.org

      secretName: tls-secret

  ingressClassName: nginx

  rules:

  - host: myapp.westos.org

    http:

      paths:

      - path: /

        pathType: Prefix

        backend:

          service:

            name: myapp-v1

            port:

              number: 80
kubectl apply -f ingress3.yml

kubectl describe ingress ingress-tls

测试

curl -k https://myapp.westos.org -u hjl:westos

rewrite重定向

示例1:

vim ingress3.yml
apiVersion: networking.k8s.io/v1

kind: Ingress

metadata:

  name: ingress-tls

  annotations:

    nginx.ingress.kubernetes.io/auth-type: basic

    nginx.ingress.kubernetes.io/auth-secret: basic-auth

    nginx.ingress.kubernetes.io/auth-realm: 'Authentication Required - hjl'

    nginx.ingress.kubernetes.io/app-root: /hostname.html

spec:

  tls:

    - hosts:

      - myapp.westos.org

      secretName: tls-secret

  ingressClassName: nginx

  rules:

  - host: myapp.westos.org

    http:

      paths:

      - path: /

        pathType: Prefix

        backend:

          service:

            name: myapp-v1

            port:

              number: 80
kubectl apply -f ingress3.yml

kubectl describe ingress ingress-tls

测试

curl -k https://myapp.westos.org -u hjl:westos -I

示例二:

vim ingress3.yml
apiVersion: networking.k8s.io/v1

kind: Ingress

metadata:

  name: ingress-tls

  annotations:

    nginx.ingress.kubernetes.io/auth-type: basic

    nginx.ingress.kubernetes.io/auth-secret: basic-auth

    nginx.ingress.kubernetes.io/auth-realm: 'Authentication Required - hjl'

    #nginx.ingress.kubernetes.io/app-root: /hostname.html

    nginx.ingress.kubernetes.io/use-regex: "true"

    nginx.ingress.kubernetes.io/rewrite-target: /$2

spec:

  tls:

    - hosts:

      - myapp.westos.org

      secretName: tls-secret

  ingressClassName: nginx

  rules:

  - host: myapp.westos.org

    http:

      paths:

      - path: /

        pathType: Prefix

        backend:

          service:

            name: myapp-v1

            port:

              number: 80

      - path: /westos(/|$)(.*)

        pathType: ImplementationSpecific

        backend:

          service:

            name: myapp-v1

            port:

              number: 80
kubectl apply -f ingress3.yml

kubectl describe ingress ingress-tls

测试

curl -k https://myapp.westos.org -u hjl:westos

curl -k https://myapp.westos.org/westos/hostname.html -u hjl:westos

回收

kubectl delete -f ingress3.yml

canary金丝雀发布

基于header灰度

vim ingress4.yml
apiVersion: networking.k8s.io/v1

kind: Ingress

metadata:

  name: myapp-v1-ingress

spec:

  ingressClassName: nginx

  rules:

  - host: myapp.westos.org

    http:

      paths:

      - pathType: Prefix

        path: /

        backend:

          service:

            name: myapp-v1

            port:

              number: 80
kubectl apply -f ingress4.yml

kubectl get ingress

vim ingress5.yml
apiVersion: networking.k8s.io/v1

kind: Ingress

metadata:

  annotations:

    nginx.ingress.kubernetes.io/canary: "true"

    nginx.ingress.kubernetes.io/canary-by-header: stage

    nginx.ingress.kubernetes.io/canary-by-header-value: gray

  name: myapp-v2-ingress

spec:

  ingressClassName: nginx

  rules:

  - host: myapp.westos.org

    http:

      paths:

      - pathType: Prefix

        path: /

        backend:

          service:

            name: myapp-v2

            port:

              number: 80
[root@k8s2 ingress]# kubectl apply -f ingress5.yml

kubectl describe ingress myapp-v2-ingress

测试

curl  myapp.westos.org


curl -H "stage: gray" myapp.westos.org

基于权重灰度

vim ingress5.yml
apiVersion: networking.k8s.io/v1

kind: Ingress

metadata:

  annotations:

    nginx.ingress.kubernetes.io/canary: "true"

    #nginx.ingress.kubernetes.io/canary-by-header: stage

    #nginx.ingress.kubernetes.io/canary-by-header-value: gray

    nginx.ingress.kubernetes.io/canary-weight: "50"

    nginx.ingress.kubernetes.io/canary-weight-total: "100"



  name: myapp-v2-ingress

spec:

  ingressClassName: nginx

  rules:

  - host: myapp.westos.org

    http:

      paths:

      - pathType: Prefix

        path: /

        backend:

          service:

            name: myapp-v2

            port:

              number: 80
kubectl apply -f ingress5.yml

kubectl describe ingress myapp-v2-ingress

测试

vim ingress.sh
#!/bin/bash

v1=0
v2=0
for (( i=0; i<100; i++))
do
    response=`curl -s myapp.westos.org |grep -c v1`
    v1=`expr $v1 + $response`
    v2=`expr $v2 + 1 - $response`
done
echo "v1:$v1, v2:$v2"
sh ingress.sh

回收

kubectl delete -f ingress5.yml

业务域拆分

vim ingress6.yml
apiVersion: networking.k8s.io/v1

kind: Ingress

metadata:

  annotations:

    nginx.ingress.kubernetes.io/rewrite-target: /$1

  name: rewrite-ingress

spec:

  ingressClassName: nginx

  rules:

  - host: myapp.westos.org

    http:

      paths:

      - path: /user/(.*)

        pathType: Prefix

        backend:

          service:

            name: myapp-v1

            port:

              number: 80

      - path: /order/(.*)

        pathType: Prefix

        backend:

          service:

            name: myapp-v2

            port:

              number: 80
kubectl apply -f ingress6.yml

kubectl describe ingress rewrite-ingress

测试

curl  myapp.westos.org

curl  myapp.westos.org/user/hostname.html

curl  myapp.westos.org/order/hostname.html

回收

kubectl delete -f ingress6.yml

flannel网络插件

使用host-gw模式

kubectl -n kube-flannel edit  cm kube-flannel-cfg

重启pod生效

kubectl -n kube-flannel delete  pod --all

calico网络插件

部署

删除flannel插件

kubectl delete  -f kube-flannel.yml

删除所有节点上flannel配置文件,避免冲突

[root@k8s2 ~]# rm -f /etc/cni/net.d/10-flannel.conflist

[root@k8s3 ~]# rm -f /etc/cni/net.d/10-flannel.conflist

[root@k8s4 ~]# rm -f /etc/cni/net.d/10-flannel.conflist

下载部署文件

wget  https://raw.githubusercontent.com/projectcalico/calico/v3.25.0/manifests/calico.yaml

修改镜像路径

vim calico.yaml

下载镜像

docker push reg.westos.org/calico/kube-controllers:v3.25.0

docker push reg.westos.org/calico/cni:v3.25.0

docker push reg.westos.org/calico/node:v3.25.0

上传镜像到harbor

部署calico

kubectl apply -f calico.yaml

kubectl -n kube-system get pod -o wide

重启所有集群节点,让pod重新分配IP

等待集群重启正常后测试网络

curl  myapp.westos.org

网络策略

限制pod流量

vim networkpolicy.yaml
apiVersion: networking.k8s.io/v1

kind: NetworkPolicy

metadata:

  name: test-network-policy

  namespace: default

spec:

  podSelector:

    matchLabels:

      app: myapp-v1

  policyTypes:

    - Ingress

  ingress:

    - from:

        - podSelector:

            matchLabels:

              role: test

      ports:

        - protocol: TCP

          port: 80
kubectl apply -f networkpolicy.yaml

kubectl describe networkpolicies

控制的对象是具有app=myapp-v1标签的pod

kubectl get pod --show-labels

此时访问svc是不通的

kubectl get svc

kubectl run demo --image busyboxplus -it --rm

/ # curl 10.111.43.137

给测试pod添加指定标签后,可以访问

kubectl  get pod --show-labels

kubectl label pod demo role=test

kubectl  get pod --show-labels

/ # curl 10.111.43.137

限制namespace流量

vim networkpolicy.yaml
apiVersion: networking.k8s.io/v1

kind: NetworkPolicy

metadata:

  name: test-network-policy

  namespace: default

spec:

  podSelector:

    matchLabels:

      app: myapp

  policyTypes:

    - Ingress

  ingress:

    - from:

        - namespaceSelector:

            matchLabels:

              project: test

        - podSelector:

            matchLabels:

              role: test

      ports:

        - protocol: TCP

          port: 80
kubectl apply -f networkpolicy.yaml

kubectl describe networkpolicies

kubectl create namespace test

给namespace添加指定标签

kubectl label ns test project=test

kubectl get ns test --show-labels

kubectl -n test run demo --image busyboxplus -it --rm


/ # curl 10.111.43.137  

同时限制namespace和pod

vim networkpolicy.yaml
apiVersion: networking.k8s.io/v1

kind: NetworkPolicy

metadata:

  name: test-network-policy

  namespace: default

spec:

  podSelector:

    matchLabels:

      app: myapp

  policyTypes:

    - Ingress

  ingress:

    - from:

        - namespaceSelector:

            matchLabels:

              project: test

          podSelector:

            matchLabels:

              role: test

      ports:

        - protocol: TCP

          port: 80
kubectl apply -f networkpolicy.yaml

kubectl describe networkpolicies

给test命令空间中的pod添加指定标签后才能访问

[root@k8s2 calico]# kubectl -n test label pod demo role=test

[root@k8s2 calico]# kubectl -n test get pod --show-labels

限制集群外部流量

vim networkpolicy.yaml
apiVersion: networking.k8s.io/v1

kind: NetworkPolicy

metadata:

  name: test-network-policy

  namespace: default

spec:

  podSelector:

    matchLabels:

      app: myapp

  policyTypes:

    - Ingress

  ingress:

    - from:

        - ipBlock:

            cidr: 192.168.56.0/24

        - namespaceSelector:

            matchLabels:

              project: myproject

          podSelector:

            matchLabels:

              role: frontend

      ports:

        - protocol: TCP

          port: 80
kubectl apply -f networkpolicy.yaml

kubectl describe networkpolicies

kubectl get svc

curl 192.168.92.101

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

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

相关文章

趋势:实时的stable diffusion

视频中使用了实时模型&#xff1a;只需2~4 个步骤甚至一步即可生成768 x 768分辨率图像。 这项技术可以把任意的stable diffusion模型转为实时模型。 潜在一致性模型 LCM LCM 只需 4,000 个训练步骤&#xff08;约 32 个 A100 GPU 一小时&#xff09;即可从任何预训练的SD模型中…

每个程序员都应该知道的六种负载均衡算法

一个大型网络平台能轻松面对数百万请求而不产生崩溃&#xff0c;负载均衡器&#xff08;Load Balancer&#xff09;是绝对的关键组件。 负载均衡器会在多个服务器之间分配工作流&#xff0c;也就是将用户请求转发到不同的机器上&#xff0c;可以确保服务的高可用性、响应速度和…

揭秘重生奇迹mu中的幻术园

幻术园可以说是重生奇迹mu游戏进化中的一个里程碑&#xff0c;因为一个重要的地图区域就此开发出来&#xff0c;同时它还是继勇者大陆、仙踪林后的第三个新人出生地&#xff0c;所以这种象征性的意义更为重要&#xff0c;今天小编就带领大家进入到重生奇迹mu发布网下的幻术园中…

10+ Web3 新锐联合放送知识与奖励,一起瓜分 2000 美金!

Web3 时代&#xff0c;链接更多的参与者&#xff0c;激发共创活跃度&#xff0c;是一个成熟繁荣的项目和社区生态所必备的要素。深度协作与互动&#xff0c;始终是打破无形壁垒&#xff0c;构建高度融合和包容的社区生态的重要路径&#xff0c;也是培养用户和开发者参与建设的热…

浅谈低压无功补偿在分布式光伏现场中的应用-安科瑞 蒋静

摘要&#xff1a;分布式光伏电站由于建设时间短、技术成熟、收益明显而发展迅速&#xff0c;但光伏并网引起用户功率因数异常的问题也逐渐凸显。针对分布式光伏电站接入配电网后功率因数降低的问题&#xff0c;本文分析了低压无功补偿装置补偿失效的原因&#xff0c;并提出了一…

Seata入门系列【19】分布式事务之CAP、BASE理论

1 CAP理论 CAP是以下三个词语的缩写&#xff1a; Consistency&#xff1a;一致性Availability&#xff1a;可用性Partition tolerance&#xff1a;分区容忍性 CAP理论的基础概念就是在分布式系统中&#xff0c;无法同时满足以上三点。 下面我们以一个简单的分布式系统&…

如何减少自动化测试的误差?

自动化测试是一种利用软件工具或者硬件设备来代替人工执行测试用例的方法&#xff0c;它可以提高测试效率和质量&#xff0c;但也可能存在一些误差&#xff0c;影响测试结果的准确性和可信度。 造成自动化测试结果有误差的原因主要有以下两类&#xff1a; 系统误差&#xff1a…

服务器黑洞,如何秒解

想必这样的短信大家都应该见过吧&#xff0c;这其实是阿里云服务器被攻击后触发的黑洞机制的短信通知。还有很多朋友不知道&#xff0c;为什么要这么做。原因其实很简单啊&#xff0c;当同一个机房的ip段&#xff0c;如果说有一台服务器遭受低道攻击&#xff0c;那么很可能会造…

手机知识:手机“飞行模式”你真的会用吗,看完你就懂了

目录 “飞行模式”的实用技能 关于手机的谣言 回想一下&#xff0c;当你第一次知道手机上的“飞行模式”时&#xff0c;你认为这是一个怎样的功能&#xff1f; 普通青年&#xff1a;在飞机上要使用的模式。 文艺青年&#xff1a;手机终日忙忙碌碌&#xff0c;偶尔也需要放飞…

香港高端人才通行证计划申请攻略:条件+材料清单+流程!

香港高端人才通行证计划申请攻略&#xff1a;条件材料清单流程&#xff01; 香港高才通计划希望吸引世界各地具备丰富工作经验及高学历的人才到香港探索机遇&#xff0c;这些高端人才包括高收入人士和在世界顶尖大学毕业的学生。 此计划并不适用于阿富汗、古巴、老挝、朝鲜、尼…

视觉问答(VQA)12篇顶会精选论文合集,附常用数据集下载

今天来聊聊计算机视觉和自然语言处理交叉的一个热门研究方向&#xff1a;视觉问答&#xff08;VQA&#xff09;。 视觉问答的任务是&#xff1a;给出一张图片和一个关于这张图片的自然语言问题&#xff0c;计算机需要根据图片的内容自动回答这个问题。这样的任务考验了计算机在…

ucgui 画圆弧时圆弧有缺口

一、问题描述 使用抗锯齿的方式画圆弧&#xff0c;在画到90的位置时&#xff0c;那个位置刚好没画上&#xff0c;留了个缺口&#xff0c;其他位置一切绘制正常。 使用非抗锯齿的方式画圆弧&#xff0c;没出现缺口。 二、问题原因 当初在移植ucgui 时&#xff0c;底层函数 …

【2021研电赛】基于图像处理的物体识别与分类系统

本作品介绍参与极术社区的有奖征集|分享研电赛作品扩大影响力&#xff0c;更有重磅电子产品免费领取! 团队介绍 学校名称&#xff1a;北京理工大学 队伍名称&#xff1a;BIT铁头帮 指导教师&#xff1a;冯云鹏 队伍成员&#xff1a;余佳桐 孙雨婷 朱翊铭 获奖情况&#xff1a…

C++之栈容器

1.简介 stack &#xff0c;栈(堆栈)&#xff0c;是一种先进后出(First In Last Out,FILO)的数据结构&#xff0c;先插入的数据在栈底&#xff0c;后放入的数据在栈顶&#xff0c;所有的数据只能从栈顶取出。   在生活中先进后出的例子友很多&#xff0c;例如我们在桌子上摞书…

给依赖打补丁的两种方案

以修改antd-table-infinity 插件为例&#xff0c;如图所示&#xff0c;要修改插件里代码 第一种方案&#xff1a;文件替换&#xff08;不推荐&#xff09; 1&#xff09; 将这个文件的代码都拷贝出来&#xff0c;并进行修改后存在项目里&#xff0c;我这边是放在了polyfill文…

java毕业设计基于springboot+vue的村委会管理系统

项目介绍 采用JAVA语言&#xff0c;结合SpringBoot框架与Vue框架以及MYSQL数据库设计并实现的。本村委会管理系统主要包括个人中心、村民管理、村委会管理、村民信息管理、土地变更管理、农业补贴管理、党员信息管理等多个模块。它帮助村委会管理实现了信息化、网络化&#xf…

TCP/IP--七层通信

文章目录 TCP/IP--七层通信先来看一下会话层以上的处理再来看一下传输层以下的处理 TCP/IP–七层通信 下面举例说明7层网络模型的功能。假设使用主机A的用户A要给使用主机B的用户B发送一封电子邮件。 在七层OSI模型中&#xff0c;如何模块化通信传输&#xff1f; 先来看一下七…

Spring Boot 面试题——自动装配

目录 Spring Boot 中的自动装配是指什么&#xff1f;解决了什么问题&#xff1f;Spring Boot 自动装配的流程有哪些&#xff1f;Spring Boot 中实现自动装配的原理是什么&#xff1f;Spring 中的 ConfigurationClassPostProcessor 类有什么作用&#xff1f;Spring Boot 自动装配…

关于微软文本转语音(语音合成)的一些坑

1. 单个音频时长限制10分钟 文档地址 2. 多人配音SSML 每次请求 <voice> 标签只能最大50个&#xff0c;参考 #1 3. SDK 在 linux 环境下 报错&#xff1a;gcc 软件无法加载 4. 语音品质问题 使用 SDK 生成的音频声音很差&#xff0c;默认音频流格式为 WAV&#xf…

Java——接口类和抽象类的方法声明不需要加{}

在Java中&#xff0c;接口类和抽象类的方法声明是不需要加{}的。具体来说&#xff1a; 1. 接口类&#xff08;Interface&#xff09;&#xff1a;接口类定义了一组方法的规范&#xff0c;没有具体的方法实现。在接口中&#xff0c;方法声明只包含方法名、参数列表和返回类型&a…