Kubernetes Ingress 简介

news2025/1/18 2:04:35

前言

Ingress 是 Kubernetes 中的一种资源对象,用于管理从集群外部到内部服务的 HTTP 和 HTTPS 路由。它提供了灵活的路由功能、SSL/TLS 终止、负载均衡和虚拟主机支持。Ingress 需要一个 Ingress 控制器来实际处理路由,并且可以通过配置不同的控制器来满足不同的需求,目前公司内在使用微服务项目部署的时候也是使用该组件进行的路由配置,这里做下学习记录,了解基本使用和原理即可。
在这里插入图片描述

一、Ingress是什么?

Ingress 是 Kubernetes 中的一种资源对象,用于管理从集群外部访问集群内服务的 HTTP 和 HTTPS 路由。它提供了一种灵活的方式来定义如何将外部请求路由到集群内部的服务,通常用于暴露 HTTP 和 HTTPS 服务。

  • 为什么使用 Ingress?

    在 Kubernetes 中,虽然可以通过 Service 的类型为 NodePort 或 LoadBalancer 将服务暴露给外部,但 Ingress 提供了更高级和灵活的流量管理功能,包括:

    • 基于主机名和路径的路由:可以根据请求的 URL 路径和主机名将流量路由到不同的服务。
    • TLS/SSL 终止:可以在 Ingress 层处理 SSL/TLS,加密外部到 Ingress 的流量。
    • 负载均衡:可以在多个服务之间分配流量。
    • 虚拟主机:可以在同一个 IP 地址上处理多个域名(虚拟主机)。
  • Ingress 控制器
    Ingress 资源本身并不直接管理流量,它需要一个 Ingress 控制器来实际处理路由。Ingress 控制器是集群中的一个组件,负责根据 Ingress 资源的定义配置负载均衡器或代理服务器。常见的 Ingress 控制器有:

    • NGINX Ingress Controller
    • Traefik
    • HAProxy
    • Istio Ingress Gateway

    我们这里使用了 NGINX Ingress controller。

二、使用步骤

1. 使用 kubectl安装 ingress

➜  ~ kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/main/deploy/static/provider/cloud/deploy.yaml

namespace/ingress-nginx created
serviceaccount/ingress-nginx created
serviceaccount/ingress-nginx-admission created
role.rbac.authorization.k8s.io/ingress-nginx created
role.rbac.authorization.k8s.io/ingress-nginx-admission created
clusterrole.rbac.authorization.k8s.io/ingress-nginx created
clusterrole.rbac.authorization.k8s.io/ingress-nginx-admission created
rolebinding.rbac.authorization.k8s.io/ingress-nginx created
rolebinding.rbac.authorization.k8s.io/ingress-nginx-admission created
clusterrolebinding.rbac.authorization.k8s.io/ingress-nginx created
clusterrolebinding.rbac.authorization.k8s.io/ingress-nginx-admission created
configmap/ingress-nginx-controller created
service/ingress-nginx-controller created
service/ingress-nginx-controller-admission created
deployment.apps/ingress-nginx-controller created
job.batch/ingress-nginx-admission-create created
job.batch/ingress-nginx-admission-patch created
ingressclass.networking.k8s.io/nginx created
validatingwebhookconfiguration.admissionregistration.k8s.io/ingress-nginx-admission created

2. 创建部署资源

  • 创建资源
  1. example-deployment.yaml
    定义一个名为 example-deployment 的 Deployment 资源。这个资源会创建并管理一组 Nginx 容器。如下所示:
apiVersion: apps/v1  # API 版本,apps/v1 用于描述 Deployment 资源
kind: Deployment  # 资源类型,这里是 Deployment
metadata:
  name: example-deployment  # Deployment 的名称
spec:
  replicas: 2  # 副本数量,这里指定创建 2 个 Pod 实例
  selector:
    matchLabels:
      app: example  # 选择器,匹配具有 app=example 标签的 Pod
  template:
    metadata:
      labels:
        app: example  # Pod 模板的标签,确保 Pod 拥有 app=example 标签
    spec:
      containers:
      - name: nginx  # 容器的名称
        image: nginx:latest  # 使用的 Docker 镜像,这里是最新版本的 nginx
        ports:
        - containerPort: 80  # 容器暴露的端口,这里是 80 端口

关键点:
其中replicas: 2,这告诉 Kubernetes 部署控制器(Deployment Controller)创建 2 个运行 nginx 容器的 Pod,并确保它们始终处于运行状态。如果其中一个 Pod 出现故障,Deployment 控制器会自动重新创建它,以维持指定的副本数。

  1. example-service.yaml
    这个 Service 会找到所有带有 app=example 标签的 Pod(即 example-deployment 创建的 2 个 Pod),并将请求转发到这些 Pod 的 80 端口。Service 本身是一个负载均衡器,可以将流量均匀分布到所有匹配的 Pod 上。
apiVersion: v1  # API 版本,v1 用于描述 Service 资源
kind: Service  # 资源类型,这里是 Service
metadata:
  name: example-service  # Service 的名称
spec:
  selector:
    app: example  # 选择器,匹配具有 app=example 标签的 Pod
  ports:
    - protocol: TCP  # 使用的协议,这里是 TCP
      port: 80  # Service 暴露的端口
      targetPort: 80  # 目标容器的端口,Service 会将请求转发到这个端口


  1. example-ingress.yaml
    在 example-ingress.yaml 中,定义了一个 Ingress 对象,它管理外部访问到集群内服务的 HTTP 和 HTTPS 路由。

将访问 example.local 主机名和 / 路径的 HTTP 请求转发到名为 example-service 的 Service 的 80 端口。Ingress 控制器会根据这些规则配置负载均衡器,并处理外部流量的路由。

apiVersion: networking.k8s.io/v1  # API 版本,networking.k8s.io/v1 用于描述 Ingress 资源
kind: Ingress  # 资源类型,这里是 Ingress
metadata:
  name: example-ingress  # Ingress 的名称
  annotations:
    nginx.ingress.kubernetes.io/rewrite-target: /  # 这是一个 NGINX Ingress 特有的注解,用于将匹配的路径重写为根路径。
spec:
  rules:
  - host: example.local  # 规则中的主机名
    http:
      paths:
      - path: /  # 路径规则
        pathType: Prefix  # 路径类型,这里是前缀匹配
        backend:
          service:
            name: example-service  # 后端服务的名称
            port:
              number: 80  # 后端服务的端口


  • 执行命令
➜  k8s-ingress-demo kubectl apply -f example-deployment.yaml
deployment.apps/example-deployment created
➜  k8s-ingress-demo kubectl apply -f example-service.yaml
service/example-service created
➜  k8s-ingress-demo kubectl apply -f example-ingress.yaml
ingress.networking.k8s.io/example-ingress created
  • 更新本地 host 映射:
    ➜ k8s-ingress-demo sudo vim /etc/hosts
    127.0.0.1 example.local

  • 验证 Ingress 设置:
    打开浏览器,访问 http://example.local,可以看到 Nginx 的欢迎页面。
    至此,一个 demo就

查看服务的状态

现在我们来看它会启动几个 example-deployment,example-service,example-ingress

查看deployment

# 查看启动了几个deployment,如下,共启动了 2 个
➜  k8s-ingress-demo k get deployments
NAME                 READY   UP-TO-DATE   AVAILABLE   AGE
example-deployment   2/2     2            2           29m
nginx-deployment     3/3     3            3           7d7h

# 详细查看example-deployment
➜  k8s-ingress-demo kubectl describe deployment example-deployment

Name:                   example-deployment
Namespace:              default
CreationTimestamp:      Sat, 22 Jun 2024 16:33:52 +0800
Labels:                 <none>
Annotations:            deployment.kubernetes.io/revision: 1
Selector:               app=example
Replicas:               2 desired | 2 updated | 2 total | 2 available | 0 unavailable
StrategyType:           RollingUpdate
MinReadySeconds:        0
RollingUpdateStrategy:  25% max unavailable, 25% max surge
Pod Template:
  Labels:  app=example
  Containers:
   nginx:
    Image:        nginx:latest
    Port:         80/TCP
    Host Port:    0/TCP
    Environment:  <none>
    Mounts:       <none>
  Volumes:        <none>
Conditions:
  Type           Status  Reason
  ----           ------  ------
  Available      True    MinimumReplicasAvailable
  Progressing    True    NewReplicaSetAvailable
OldReplicaSets:  <none>
NewReplicaSet:   example-deployment-6678c6f87f (2/2 replicas created)
Events:
  Type    Reason             Age   From                   Message
  ----    ------             ----  ----                   -------
  Normal  ScalingReplicaSet  32m   deployment-controller  Scaled up replica set example-deployment-6678c6f87f to 2


查看Pod状态

# 查看pod状态
➜  k8s-ingress-demo kubectl get pods -l app=example
NAME                                  READY   STATUS    RESTARTS   AGE
example-deployment-6678c6f87f-7vnfp   1/1     Running   0          34m
example-deployment-6678c6f87f-h5jsm   1/1     Running   0          34m

# 查看单个pod详情
➜  k8s-ingress-demo kubectl describe pod example-deployment-6678c6f87f-7vnfp
Name:             example-deployment-6678c6f87f-7vnfp
Namespace:        default
Priority:         0
Service Account:  default
Node:             docker-desktop/192.168.65.3
Start Time:       Sat, 22 Jun 2024 16:33:53 +0800
Labels:           app=example
                  pod-template-hash=6678c6f87f
Annotations:      <none>
Status:           Running
IP:               10.1.0.131
IPs:
  IP:           10.1.0.131
Controlled By:  ReplicaSet/example-deployment-6678c6f87f
Containers:
  nginx:
    Container ID:   docker://e61df1f25e486f85176c4e84269090f768873084e03b9bc36f4dac70203b2637
    Image:          nginx:latest
    Image ID:       docker-pullable://nginx@sha256:9c367186df9a6b18c6735357b8eb7f407347e84aea09beb184961cb83543d46e
    Port:           80/TCP
    Host Port:      0/TCP
    State:          Running
      Started:      Sat, 22 Jun 2024 16:34:34 +0800
    Ready:          True
    Restart Count:  0
    Environment:    <none>
    Mounts:
      /var/run/secrets/kubernetes.io/serviceaccount from kube-api-access-952jq (ro)
Conditions:
  Type                        Status
  PodReadyToStartContainers   True
  Initialized                 True
  Ready                       True
  ContainersReady             True
  PodScheduled                True
Volumes:
  kube-api-access-952jq:
    Type:                    Projected (a volume that contains injected data from multiple sources)
    TokenExpirationSeconds:  3607
    ConfigMapName:           kube-root-ca.crt
    ConfigMapOptional:       <nil>
    DownwardAPI:             true
QoS Class:                   BestEffort
Node-Selectors:              <none>
Tolerations:                 node.kubernetes.io/not-ready:NoExecute op=Exists for 300s
                             node.kubernetes.io/unreachable:NoExecute op=Exists for 300s
Events:
  Type    Reason     Age   From               Message
  ----    ------     ----  ----               -------
  Normal  Scheduled  35m   default-scheduler  Successfully assigned default/example-deployment-6678c6f87f-7vnfp to docker-desktop
  Normal  Pulling    35m   kubelet            Pulling image "nginx:latest"
  Normal  Pulled     34m   kubelet            Successfully pulled image "nginx:latest" in 8.892s (41.029s including waiting)
  Normal  Created    34m   kubelet            Created container nginx
  Normal  Started    34m   kubelet            Started container nginx

查看service状态

➜  k8s-ingress-demo kubectl get services

NAME              TYPE           CLUSTER-IP      EXTERNAL-IP   PORT(S)        AGE
example-service   ClusterIP      10.99.210.105   <none>        80/TCP         38m
kubernetes        ClusterIP      10.96.0.1       <none>        443/TCP        21d
nginx-service     LoadBalancer   10.110.142.82   localhost     80:30452/TCP   7d7h

# 查看更详细的信息
➜  k8s-ingress-demo kubectl describe service example-service

Name:              example-service
Namespace:         default
Labels:            <none>
Annotations:       <none>
Selector:          app=example
Type:              ClusterIP
IP Family Policy:  SingleStack
IP Families:       IPv4
IP:                10.99.210.105
IPs:               10.99.210.105
Port:              <unset>  80/TCP
TargetPort:        80/TCP
Endpoints:         10.1.0.130:80,10.1.0.131:80
Session Affinity:  None
Events:            <none>

查看Ingress状态

➜  k8s-ingress-demo kubectl get ingresses

NAME              CLASS    HOSTS           ADDRESS   PORTS   AGE
example-ingress   <none>   example.local             80      37m
➜  k8s-ingress-demo kubectl get ingress example-ingress

NAME              CLASS    HOSTS           ADDRESS   PORTS   AGE
example-ingress   <none>   example.local             80      38m

# 查看更详细的 ingress 状态
➜  k8s-ingress-demo kubectl describe ingress example-ingress

Name:             example-ingress
Labels:           <none>
Namespace:        default
Address:
Ingress Class:    <none>
Default backend:  <default>
Rules:
  Host           Path  Backends
  ----           ----  --------
  example.local
                 /   example-service:80 (10.1.0.130:80,10.1.0.131:80)
Annotations:     nginx.ingress.kubernetes.io/rewrite-target: /
Events:          <none>

清理不需要的资源

➜  k8s-demo k get pods
NAME                                  READY   STATUS    RESTARTS        AGE
example-deployment-6678c6f87f-7vnfp   1/1     Running   0               52m
example-deployment-6678c6f87f-h5jsm   1/1     Running   0               52m
nginx-deployment-765d7cffb-5zv7k      1/1     Running   7 (4d17h ago)   7d7h
nginx-deployment-765d7cffb-dl6p4      1/1     Running   7 (4d17h ago)   7d7h
nginx-deployment-765d7cffb-nsckc      1/1     Running   7 (4d17h ago)   7d7h

我们看这里有我上次测试的nginx-deployment部署资源,而且还启动了 3 个 pod,有点费资源,我现在查看明细。

➜  k8s-demo kubectl get deployment nginx-deployment -o yaml

apiVersion: apps/v1
kind: Deployment
metadata:
  annotations:
    deployment.kubernetes.io/revision: "1"
    kubectl.kubernetes.io/last-applied-configuration: |
      {"apiVersion":"apps/v1","kind":"Deployment","metadata":{"annotations":{},"labels":{"app":"nginx"},"name":"nginx-deployment","namespace":"default"},"spec":{"replicas":3,"selector":{"matchLabels":{"app":"nginx"}},"template":{"metadata":{"labels":{"app":"nginx"}},"spec":{"containers":[{"image":"nginx:1.17.1","name":"nginx","ports":[{"containerPort":80}]}]}}}}
  creationTimestamp: "2024-06-15T01:36:46Z"
  generation: 1
  labels:
    app: nginx
  name: nginx-deployment
  namespace: default
  resourceVersion: "66130"
  uid: 988e5ed1-453b-4a62-97bf-25f879be893e
spec:
  progressDeadlineSeconds: 600
  replicas: 3
  revisionHistoryLimit: 10
  selector:
    matchLabels:
      app: nginx
    .......

这里有完整 YAML 定义,这是之前创建 pod,给个 3 个副本做演示使用的,没有什么用来,现在删除。

➜ k8s-demo kubectl delete deployment nginx-deployment
deployment.apps “nginx-deployment” deleted

➜ k8s-demo kubectl get pods
NAME READY STATUS RESTARTS AGE
example-deployment-6678c6f87f-7vnfp 1/1 Running 0 57m
example-deployment-6678c6f87f-h5jsm 1/1 Running 0 57m

已删除
我们刚才做了删除动作,也可以查看集群的历史,如下所示 pod/nginx-deployment 被 kill 了。

➜  k8s-demo kubectl get events --sort-by=.metadata.creationTimestamp
LAST SEEN   TYPE     REASON              OBJECT                                     MESSAGE
58m         Normal   Scheduled           pod/example-deployment-6678c6f87f-7vnfp    Successfully assigned default/example-deployment-6678c6f87f-7vnfp to docker-desktop
58m         Normal   Pulling             pod/example-deployment-6678c6f87f-7vnfp    Pulling image "nginx:latest"
58m         Normal   ScalingReplicaSet   deployment/example-deployment              Scaled up replica set example-deployment-6678c6f87f to 2
58m         Normal   SuccessfulCreate    replicaset/example-deployment-6678c6f87f   Created pod: example-deployment-6678c6f87f-7vnfp
58m         Normal   SuccessfulCreate    replicaset/example-deployment-6678c6f87f   Created pod: example-deployment-6678c6f87f-h5jsm
58m         Normal   Scheduled           pod/example-deployment-6678c6f87f-h5jsm    Successfully assigned default/example-deployment-6678c6f87f-h5jsm to docker-desktop
58m         Normal   Pulling             pod/example-deployment-6678c6f87f-h5jsm    Pulling image "nginx:latest"
57m         Normal   Pulled              pod/example-deployment-6678c6f87f-h5jsm    Successfully pulled image "nginx:latest" in 32.14s (32.141s including waiting)
57m         Normal   Created             pod/example-deployment-6678c6f87f-h5jsm    Created container nginx
57m         Normal   Started             pod/example-deployment-6678c6f87f-h5jsm    Started container nginx
57m         Normal   Started             pod/example-deployment-6678c6f87f-7vnfp    Started container nginx
57m         Normal   Created             pod/example-deployment-6678c6f87f-7vnfp    Created container nginx
57m         Normal   Pulled              pod/example-deployment-6678c6f87f-7vnfp    Successfully pulled image "nginx:latest" in 8.892s (41.029s including waiting)
56s         Normal   Killing             pod/nginx-deployment-765d7cffb-5zv7k       Stopping container nginx
56s         Normal   Killing             pod/nginx-deployment-765d7cffb-dl6p4       Stopping container nginx
56s         Normal   Killing             pod/nginx-deployment-765d7cffb-nsckc       Stopping container nginx

三、 Ingress 的工作原理

Ingress 是 Kubernetes 中的一种资源,用于管理从集群外部访问集群内部服务的 HTTP 和 HTTPS 路由。它的工作原理涉及多个组件和步骤,包括 Ingress 控制器、负载均衡、路由规则等。以下是 Ingress 的工作原理详细解释:

1. 定义 Ingress 资源

创建一个 Ingress 资源来定义外部访问的规则。这些规则包括主机名、路径、目标服务等。

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: example-ingress
  annotations:
    nginx.ingress.kubernetes.io/rewrite-target: /
spec:
  rules:
  - host: example.local
    http:
      paths:
      - path: /
        pathType: Prefix
        backend:
          service:
            name: example-service
            port:
              number: 80

在这个示例中,Ingress 定义了将 example.local 主机名下的 / 路径的请求路由到名为 example-service 的 Service 的 80 端口。

2. 部署 Ingress 控制器

Ingress 控制器是一个运行在 Kubernetes 集群中的组件,它负责解释和实现 Ingress 资源中的规则。常见的 Ingress 控制器包括 NGINX、Traefik、HAProxy、Istio 等。

安装 NGINX Ingress 控制器的示例命令:

kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/main/deploy/static/provider/cloud/deploy.yaml

3. Ingress 控制器的工作

3.1 监听 Ingress 资源变化

Ingress 控制器会监控 Kubernetes 集群中的 Ingress 资源的变化。一旦检测到新的 Ingress 资源或已有资源的更新,它会自动重新配置自己以匹配这些变化。

3.2 配置负载均衡器

根据 Ingress 资源定义的规则,Ingress 控制器会配置其内部的负载均衡器或代理服务器(例如 NGINX)。这包括设置主机名、路径匹配规则、后端服务等。

3.3 处理流量

Ingress 控制器接收到外部流量时,会根据配置的规则将流量路由到相应的后端服务。具体的流程如下:

  • 解析主机名:根据请求的主机名,确定应该使用的 Ingress 规则。
  • 路径匹配:根据请求的路径,找到最匹配的路径规则。
  • 转发请求:将请求转发到对应的后端服务和端口。

4. TLS/SSL 终止

Ingress 可以配置 TLS/SSL 终止,确保外部流量以加密方式传输到 Ingress 控制器,然后在 Ingress 控制器处解密,再转发到后端服务。示例如下:

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: example-ingress
spec:
  tls:
  - hosts:
    - example.local
    secretName: example-tls
  rules:
  - host: example.local
    http:
      paths:
      - path: /
        pathType: Prefix
        backend:
          service:
            name: example-service
            port:
              number: 80

在这个示例中,example-tls 是一个包含 TLS 证书和私钥的 Kubernetes Secret。

5. 高可用和扩展

Ingress 控制器本身通常作为 Deployment 运行,具有高可用性和可扩展性。你可以调整副本数来扩展 Ingress 控制器的容量,确保其能够处理大量的外部请求。

6. 集群内部的通信

当 Ingress 控制器决定将流量转发到后端服务时,它会使用 Kubernetes Service 进行服务发现和负载均衡。Service 会根据标签选择器找到相应的 Pod,并将请求分发给这些 Pod。

总结

本文主要讲解了 ingress 的基本介绍和使用 demo,最后将工作原理总如如下六大部分。

Ingress 的工作原理涉及以下关键步骤和组件:

  1. 定义 Ingress 资源:定义外部访问规则。
  2. 部署 Ingress 控制器:安装和配置 Ingress 控制器。
  3. Ingress 控制器的工作
    • 监听 Ingress 资源变化。
    • 配置内部负载均衡器或代理服务器。
    • 处理外部流量并路由到后端服务。
  4. TLS/SSL 终止:处理加密流量。
  5. 高可用和扩展:通过 Deployment 提供高可用性和扩展能力。
  6. 集群内部的通信:使用 Kubernetes Service 进行服务发现和负载均衡。

通过以上机制,Ingress 提供了一种灵活、高效的方式来管理 Kubernetes 集群中服务的外部访问。

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

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

相关文章

这4个手机应用,让你的生活工作更加方便

MillimeterPro MillimeterPro是一款适用于iPhone或iPad的测量工具应用&#xff0c;用户可以通过触摸屏快速进行长度测量、分割物体、测量物体比例&#xff08;W/H&#xff09;和面积等操作。 这款应用程序是一个多功能的测量工具&#xff0c;它可以帮助您在手机或平板电脑的屏…

(经验)高考填报志愿,有哪些坑你需要避开?

高考年年考&#xff0c;填报志愿的却年年都是新手.....哪些关于高考填报志愿的坑&#xff0c;依旧还继续坑....是时候做些改变了。过来人写的几点避坑&#xff0c;希望给这届新人做参考。 1、不要什么热门就报什么&#xff0c;因为有些东西别人学得很快&#xff0c;而我慢的像蜗…

示例:WPF中使用IsAsync的方式绑定数据来优化用户体验

一、目的&#xff1a;开发过程中&#xff0c;有时需要绑定大量数据&#xff0c;比如弹出一个窗口&#xff0c;窗口中包含一个ListBox绑定了大量数据&#xff0c;这时会出现点击按钮后出现假死卡顿影响用户体验&#xff0c;这理通过用IsAsync的方式将窗口优先弹出来再加载数据 二…

mysql高级语句2存储过程

CREATE VIEW 视图&#xff0c;可以被当作是虚拟表或存储查询。 视图跟表格的不同是&#xff0c;表格中有实际储存数据记录&#xff0c;而视图是建立在表格之上的一个架构&#xff0c;它本身并不实际储存数据记录。 临时表在用户退出或同数据库的连接断开后就自动消失了&…

计算机网络 静态路由及动态路由RIP

一、理论知识 1.静态路由 静态路由是由网络管理员手动配置在路由器上的固定路由路径。其优点是简单和对网络拓扑变化不敏感&#xff0c;缺点是维护复杂、易出错&#xff0c;且无法自动适应网络变化。 2.动态路由协议RIP RIP是一种基于距离向量的动态路由协议。它使用跳数作…

Unity Meta Quest 开发:关闭 MR 应用的安全边界

社区链接&#xff1a; SpatialXR社区&#xff1a;完整课程、项目下载、项目孵化宣发、答疑、投融资、专属圈子 &#x1f4d5;教程说明 这期教程我将介绍如何在应用中关闭 Quest 系统的安全边界。 视频讲解&#xff1a; https://www.bilibili.com/video/BV1Gm42157Zi 在 Unity…

示例:推荐一个应用Adorner做的表单对话框

一、目的&#xff1a;开发过程中经常会修改和查看一个Model的数据&#xff0c;一般情况下会自定义一个控件或Window去显示Model数据&#xff0c;但这种数据如果比较多会增加很多开发工作&#xff0c;本文介绍一种通用的方式&#xff0c;应用表达Form控件去简化处理&#xff0c;…

如何在Qt Designer中管理QSplitter

问题描述 当按下按钮时&#xff0c;我希望弹出一个对话框&#xff0c;用户可以在其中选择内容并最终按下 ‘Ok’ 按钮。我想在这个对话框中放置一个 QSplitter&#xff0c;左侧面板将显示树状结构&#xff0c;右侧将显示其他内容。如何正确实现这一点&#xff1f; 从 Qt 的示…

AI智能时代:ChatGPT如何在金融市场发挥策略分析与预测能力?

文章目录 一、ChatGPT在金融策略制定中的深度应用客户需求分析与定制化策略市场动态跟踪与策略调整策略分析与优化 二、ChatGPT在算法交易中的深度应用自动交易策略制定交易执行与监控风险管理 三、未来展望《智能量化&#xff1a;ChatGPT在金融策略与算法交易中的实践》亮点内…

说说 SSL 的错误认识和不足之处

最近明月在学习折腾 LNMP 期间无意中建了一个 Typecho 的博客小站&#xff0c;近一周的折腾下来&#xff0c;收获真的不少&#xff0c;致使兴趣也越来越浓了&#xff0c;在升级 LNMP 的时候捎带手的给这个 Typecho 博客也启用了 SSL。并且开启了 memcached 和 OPcache 优化加速…

Android面试题之动画+事件处理篇

1、Android 中的动画有哪几类 帧动画、补间动画、属性动画 2、动画能组合在一起使用么&#xff1f; 可以将动画组合在一起使用AnimatorSet&#xff0c; AnimatorSet.play() 播放当前动画的同时可以 .with() &#xff1a;将现有动画和传入的动画同时执行 .after() &#xff1a…

神经网络与深度学习 - 神经网络基础

1.2 神经网络基础 学习目标 知道逻辑回归的算法计算输出、损失函数知道导数的计算图知道逻辑回归的梯度下降算法知道多样本的向量计算 应用 应用完成向量化运算应用完成一个单神经元神经网络的结构 1.2.1 Logistic回归 逻辑回归是一个主要用于二分分类的算法。给定一个特…

Altera不同系列的型号命名规则

Altera芯片型号&#xff1a;10AX07H4F34I3SG 20nm工艺 资源&#xff1a; 大数据 云计算 人工智能 图像处理 MSEL

OS复习笔记ch12-1

文件系统 概述 文件是大多数应用程序的核心要素&#xff0c;文件系统是操作系统对用户来说最重要的部分之一。 本章的主要内容见下图&#xff1a; 文件&#xff0c;大家耳熟能详的就是的docx、pdf、jpg、MP4等各种后缀文件&#xff0c;根据任务需要文件又分成了文本、图片、…

c++ 中如何往 string 字符串类型里插入浮点数

谢谢&#xff0c;在看王老师课程时&#xff0c;有如此用法&#xff0c;单独拿出来记录一下 (2) 这是为什么呢&#xff1f; 其实 cout << 3.33 ; 这样的代码是可以直接编译通过。 cout 就是 ostream 类型的对象。此类对象可以保存任何类型的数据。 STL 库为我们写好了大量…

Linux 五种IO模型

注&#xff1a;还有一种信号驱动IO&#xff0c;使用较少暂不讨论&#xff1b; 一&#xff0c;区分阻塞、非阻塞和同步、异步 看了很多文章对这两组概念解释和对比&#xff0c;说的太复杂了&#xff0c;其实没必要&#xff0c;两句话就能说清楚。 首先&#xff0c;对于读数据rec…

黑马苍穹外卖6 清理redis缓存+Spring Cache+购物车的增删改查

缓存菜品 后端服务都去查询数据库&#xff0c;对数据库访问压力增大。 解决方式&#xff1a;使用redis来缓存菜品&#xff0c;用内存比磁盘性能更高。 key :dish_分类id String key “dish_” categoryId; RestController("userDishController") RequestMapping…

如何配置taro

文章目录 step1. 全局安装wepacksetp2. 使用npm安装tarostep3. 项目初始化 使用taro时需要在本地配置好nodejs环境&#xff0c;关于如何配置nodejs可参考我的这篇博文 如何配置nodejs环境 step1. 全局安装wepack 使用指令npm install webpack -g即可 安装完成后可看到有wepa…

使用Vue+Antv-X6实现一个输送线可视化编辑器(支持拖拽、自定义连线、自定义节点等)

最近公司有这样的业务&#xff0c;要实现一个类似流程图的编辑器&#xff0c;可以拖拉拽之类的&#xff0c;网上寻找了一番&#xff0c;最终决定使用Antv-X6这个图形引擎&#xff0c;非常强大&#xff0c;文档多看几遍也就能上手使用了。感觉还不错就写个使用心得期望能帮助到同…

2000年 - 2022年 Fama-French三因子模型数据+代码

Fama-French三因子模型是由著名经济学家尤金法玛&#xff08;Eugene Fama&#xff09;和肯尼斯法兰奇&#xff08;Kenneth French&#xff09;提出的&#xff0c;旨在改进资本资产定价模型&#xff08;CAPM&#xff09;&#xff0c;更全面地解释资产收益率的变化。该模型认为&a…