• 13-k8s-ingress网络


    一、ingress介绍

    1. Service对集群之外暴露服务的主要方式有两种:NotePort和LoadBalancer,但是这两种方式,都有一定的缺点

      1)NodePort方式的缺点是会占用很多集群机器的端口,那么当集群服务变多的时候,这个缺点就愈发明显
      2)LB方式的缺点是每个service需要一个LB,浪费、麻烦,并且需要kubernetes之外设备的支持
      基于这种现状,kubernetes提供了Ingress资源对象,Ingress只需要一个NodePort或者一个LB就可以满足暴露多个Service的需求

    2. ingress相关涉及概念

      1)ingress:kubernetes中的一个对象,作用是定义请求如何转发到service的规则

      2)ingress controllel:具体实现反向代理及负载均衡的程序,对ingress定义的规则进行解析,根据配置的规则来实现请求转发,实现方式有很多,比如Nginx, Contour, Haproxy等等

    3. ingress工作机制

      Ingress相当于一个七层的负载均衡器,是kubernetes对反向代理的一个抽象,它的工作原理类似于Nginx。原理是安装完ingress后,在Ingress Service中定义哪个域名对应kubernetes集群中的哪个Service,Ingress Controller通过监听这些映射规则并转化为Nginx(或Contour、Haproxy)的反向代理配置,并将反向代理配置写入这些Nginx(或Contour、Haproxy)服务,最后由Nginx(或Contour、Haproxy)对外提供服务
      在这里插入图片描述

    二、创建nginx和tomcat供测试

    1. 创建空间:kubectl create ns ingress-nginx

    2. 创建nginx pod和tomcat的pod

      1)编写yaml文件:vi /opt/nginx-tomcat-deployment.yaml

      apiVersion: apps/v1
      kind: Deployment
      metadata:
        name: nginx-deployment
        namespace: ingress-nginx
      spec:
        replicas: 1
        selector:
          matchLabels:
            app: nginx-pod
        template:
          metadata:
            labels:
              app: nginx-pod
          spec:
            containers:
              - name: nginx-container
                image: nginx:latest
                ports:
                  - name: nginx-port
                    containerPort: 80
                    protocol: TCP
      
      ---
      
      apiVersion: apps/v1
      kind: Deployment
      metadata:
        name: tomcat-deployment
        namespace: ingress-nginx
      spec:
        replicas: 1
        selector:
          matchLabels:
            app: tomcat-pod
        template:
          metadata:
            labels:
              app: tomcat-pod
          spec:
            containers:
              - name: tomcat-container
                image: tomcat:8.5-jre10-slim
                ports:
                  - name: tomcat-port
                    containerPort: 8080
                    protocol: TCP
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
      • 10
      • 11
      • 12
      • 13
      • 14
      • 15
      • 16
      • 17
      • 18
      • 19
      • 20
      • 21
      • 22
      • 23
      • 24
      • 25
      • 26
      • 27
      • 28
      • 29
      • 30
      • 31
      • 32
      • 33
      • 34
      • 35
      • 36
      • 37
      • 38
      • 39
      • 40
      • 41
      • 42
      • 43
      • 44
      • 45
      • 46
      • 47
      apiVersion: 定义所使用的Kubernetes API的版本,这里是"apps/v1"。
      kind: 定义资源的类型,这里是"Deployment"。
      metadata: 元数据,用于描述该Deployment的属性。
      	name: 定义Deployment的名称为"tomcat-deployment"。
      	namespace: 定义Deployment所属的命名空间为"dev"。
      spec: Deployment的规格,指定了Deployment的配置选项。
      	replicas: 定义要创建的Pod的副本数量,这里是3个。
      	selector: 用于选择要管理的Pod的标签。
      		matchLabels: 匹配标签的列表,这里选择带有"app: tomcat-pod"标签的Pod。
      	template: 定义要创建的Pod的模板。
      		metadata: Pod的元数据,用于描述Pod的属性。
      			labels:Pod添加的标签,这里是"app: tomcat-pod"。
      		spec: Pod的规格设置。
      			containers: 定义Pod中的容器列表。
      				name: 容器的名称为"tomcat-container"。
      				image: 定义容器所使用的镜像为"tomcat:8.5-jre10-slim"。
      				ports: 定义容器暴露的端口列表。
      					name: 定义端口的名称为"tomcat-port"。
      					containerPort: 定义容器内部监听的端口号为8080。
      					protocol: 定义端口的协议为TCP
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
      • 10
      • 11
      • 12
      • 13
      • 14
      • 15
      • 16
      • 17
      • 18
      • 19
      • 20

      2)创建pod:kubectl apply -f /opt/nginx-tomcat-deployment.yaml

      3)查看创建的pod:kubectl get pod
      在这里插入图片描述

    3. 准备Service

      1)新建nginx-tomcat.yaml文件:vi /opt/nginx-tomcat.yaml

      apiVersion: v1
      kind: Service
      metadata:
        name: nginx-service
        namespace: ingress-nginx
      spec:
        selector:
          app: nginx-pod
        type: ClusterIP
        clusterIP: None
        ports:
          - protocol: TCP
            port: 80
            targetPort: 80
      ---
      apiVersion: v1
      kind: Service
      metadata:
        name: tomcat-service
        namespace: ingress-nginx
      spec:
        selector:
          app: tomcat-pod
        type: ClusterIP
        clusterIP: None
        ports:
          - protocol: TCP
            port: 8080
            targetPort: 8080
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
      • 10
      • 11
      • 12
      • 13
      • 14
      • 15
      • 16
      • 17
      • 18
      • 19
      • 20
      • 21
      • 22
      • 23
      • 24
      • 25
      • 26
      • 27
      • 28
      • 29
      apiVersion: 定义所使用的Kubernetes API的版本,这里是"v1"。
      kind: 定义资源的类型,这里是"Service",表示创建一个Service资源。
      metadata: 元数据,用于描述该Service的属性。
      	name: 定义Service的名称为"nginx-service"。
      	namespace: 定义Service所属的命名空间为"dev"。
      spec: Service的规格,指定了Service的配置选项。
      	selector: 用于选择要匹配的Pod的标签。
      		app: 对应Pod的标签为"nginx-pod"。
      	type: 定义Service的类型,这里是"ClusterIP",表示创建一个仅在集群内部访问的Service。
      	clusterIP: 定义Service的虚拟IP地址,这里设置为"None",表示不会分配一个可路由的IP地址给Service。
      	ports: 定义Service暴露的端口列表。
      		protocol: 定义端口的协议为TCP。
      		port: 定义Service暴露的端口号为80。
      		targetPort: 定义将流量转发到Pod的目标端口为80
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
      • 10
      • 11
      • 12
      • 13
      • 14

      2)创建pod:kubectl apply -f /opt/nginx-tomcat.yaml

      3)查看:kubectl get svc -n ingress-nginx
      在这里插入图片描述

    三、创建ingress-http

    1. 创建ingress

      1)新建ingress-http.yaml文件:vi /opt/ingress-http.yaml

      apiVersion: networking.k8s.io/v1
      kind: Ingress
      metadata:
        name: ingress-http
        namespace: ingress-nginx
      spec:
        rules:
          - host: nginx.bulut.com
            http:
              paths:
                - path: /
                  pathType: Exact
                  backend:
                    service:
                      name: nginx-service
                      port:
                        number: 80  
          - host: tomcat.bulut.com
            http:
              paths:
                - path: /
                  pathType: Exact
                  backend:
                    service:
                      name: tomcat-service
                      port:
                        number: 8080
        ingressClassName: nginx
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
      • 10
      • 11
      • 12
      • 13
      • 14
      • 15
      • 16
      • 17
      • 18
      • 19
      • 20
      • 21
      • 22
      • 23
      • 24
      • 25
      • 26
      • 27
      • 28
      apiVersion: 定义所使用的Kubernetes API的版本,这里是"networking.k8s.io/v1",表示使用了网络扩展API。
      kind: 定义资源的类型,这里是"Ingress",表示创建一个Ingress资源。
      metadata: 元数据,用于描述该Ingress的属性。
      	name: 定义Ingress的名称为"ingress-http"。
      	namespace: 定义Ingress所属的命名空间为"dev"。
          annotations: 
            kubernetes.io/ingress.class: "nginx"
            nginx.ingress.kubernetes.io/rewrite-target: /  #表示匹配的路径,匹配部分需要重写逻辑
      spec: Ingress的规格,指定了Ingress的配置选项。
      	rules: 定义Ingress规则的列表。
      		- host: 指定Ingress规则要匹配的主机名。
      			nginx.bulut.com: 匹配主机为"nginx.bulut.com"。
      			tomcat.bulut.com: 匹配主机为"tomcat.bulut.com"。
      		http: 指定该规则使用HTTP协议。
      			paths: 定义路径与后端服务之间的映射关系。
      				- path: 指定要映射的路径为"/",表示将该规则应用于所有路径。
      				pathType: 指定路径类型为"Exact",表示精确匹配路径。Prefix表示前缀匹配,通常跟rewrite-target组合使用。
      				backend: 指定要将流量转发到的后端服务。
      					service: 指定后端服务的名称。
      						name: 后端服务的名称分别为"nginx-service""tomcat-service"。
      						port: 指定要将流量转发到的后端服务的端口。
      							number: 后端服务的端口号分别为808080
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
      • 10
      • 11
      • 12
      • 13
      • 14
      • 15
      • 16
      • 17
      • 18
      • 19
      • 20
      • 21
      • 22

      2)创建pod:kubectl apply -f /opt/ingress-http.yaml

      3)查看:kubectl get ingress ingress-http -n ingress-nginx
      在这里插入图片描述

      4)查看详情:kubectl describe ingress ingress-http -n ingress-nginx
      在这里插入图片描述

    2. 查看ingress运行所在服务器:kubectl get pods -n ingress-nginx -o wide
      在这里插入图片描述

    四、yaml方式安装ingress

    ps:master节点操作

    1. 切换路径:cd /opt

    2. 创建ingress-nginx

      1)下载ingress-nginx的yaml文件:wget https://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-v1.2.0/deploy/static/provider/cloud/deploy.yaml

      2)修改yaml文件内容

      image: k8s.gcr.io/ingress-nginx/controller:v1.2.0@sha256:d8196e3bc1e72547c5dec66d6556c0ff92a23f6d0919b206be170bc90d5f9185
      
      image: k8s.gcr.io/ingress-nginx/kube-webhook-certgen:v1.1.1@sha256:64d8c73dca984af206adf9d6d7e46aa550362b1d7a01f3a0a91b20cc67868660
      
      image: k8s.gcr.io/ingress-nginx/kube-webhook-certgen:v1.1.1@sha256:64d8c73dca984af206adf9d6d7e46aa550362b1d7a01f3a0a91b20cc67868660
      
      • 1
      • 2
      • 3
      • 4
      • 5

      改为

      image: docker.io/dyrnq/controller:v1.2.0@sha256:d8196e3bc1e72547c5dec66d6556c0ff92a23f6d0919b206be170bc90d5f9185
      
         
      image: registry.cn-hangzhou.aliyuncs.com/google_containers/kube-webhook-certgen:v1.1.1@sha256:64d8c73dca984af206adf9d6d7e46aa550362b1d7a01f3a0a91b20cc67868660
      
      image: registry.cn-hangzhou.aliyuncs.com/google_containers/kube-webhook-certgen:v1.1.1@sha256:64d8c73dca984af206adf9d6d7e46aa550362b1d7a01f3a0a91b20cc67868660
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      image: docker.io/dyrnq/controller:v1.2.0@sha256:d8196e3bc1e72547c5dec66d6556c0ff92a23f6d0919b206be170bc90d5f9185
      的备用地址:
      image: registry.cn-hangzhou.aliyuncs.com/google_containers/nginx-ingress-controller:v1.2.0@sha256:d8196e3bc1e72547c5dec66d6556c0ff92a23f6d0919b206be170bc90d5f9185
      可忽略
      
      • 1
      • 2
      • 3
      • 4

      3)创建pod:kubectl apply -f /opt/deploy.yaml

      4)查看ingress-nginx的pod:kubectl get pod -n ingress-nginx -o wide
      在这里插入图片描述

      5)查看ingress-nginx的Service:kubectl get svc -n ingress-nginx
      在这里插入图片描述

    3. 访问nginx和tomcat服务

      1)设置主机名映射:vi /etc/hosts

      ps:这里的ip取运行ingress-nginx-controller pod的节点,因为我都是在worker1运行的,所以取192.168.248.11

      192.168.248.11 tomcat.bulut.com
      192.168.248.11 nginx.bulut.com
      
      • 1
      • 2

      2)重置网络:service network restart

      3)查看ingress-nginx的Service开放的端口:kubectl get svc -n ingress-nginx
      在这里插入图片描述

      4)访问nginx:curl http://nginx.bulut.com:32397
      在这里插入图片描述

      5)访问tomcat:curl http://tomcat.bulut.com:32397
      在这里插入图片描述

    4. 原理说明:可以将ingress-nginx的Service开放的端口,理解成是nginx的端口。然后根据域名进行匹配,就跟nginx的前缀匹配一样,进行反向代理。

    5. 本地连接测试

      1)查看ingress pod所在:kubectl describe pod ingress-nginx-controller-77d4dc6978-bq2xt -n ingress-nginx
      在这里插入图片描述

      2)在本地的hosts文件配置映射

      192.168.248.11 tomcat.bulut.com
      192.168.248.11 nginx.bulut.com
      
      • 1
      • 2

      3)浏览器访问:http://nginx.bulut.com:32397/
      在这里插入图片描述

    6. ingress默认使用的http 80;https 443;采用nodeport方式默认的端口暴露范围在 30000-32767。通过更改apiserver nodeport端口范围,达到更改ingress端口的作用。

      1)修改apiserver端口范围:vi /etc/kubernetes/manifests/kube-apiserver.yaml
      添加 --service-node-port-range=1-32767

      2)重新启动apiserver:kubectl delete pod kube-apiserver-master -n kube-system

      3)修改配置,更改ingress端口:vi /opt/ingress-service.yaml

      apiVersion: v1
      kind: Service
      metadata:
        labels:
          app.kubernetes.io/component: controller
          app.kubernetes.io/instance: ingress-nginx
          app.kubernetes.io/name: ingress-nginx
          app.kubernetes.io/part-of: ingress-nginx
          app.kubernetes.io/version: 1.2.0
        name: ingress-nginx-controller
        namespace: ingress-nginx
      spec:
        externalTrafficPolicy: Local
        ports:
        - appProtocol: http
          name: http
          port: 80
          nodePort: 80
          protocol: TCP
          targetPort: http
        - appProtocol: https
          name: https
          port: 443
          protocol: TCP
          targetPort: https
        selector:
          app.kubernetes.io/component: controller
          app.kubernetes.io/instance: ingress-nginx
          app.kubernetes.io/name: ingress-nginx
        type: LoadBalancer
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
      • 10
      • 11
      • 12
      • 13
      • 14
      • 15
      • 16
      • 17
      • 18
      • 19
      • 20
      • 21
      • 22
      • 23
      • 24
      • 25
      • 26
      • 27
      • 28
      • 29
      • 30

      4)启动:kubectl apply -f /opt/ingress-service.yaml

      5)访问:http://tomcat.bulut.com/和http://nginx.bulut.com/

      ps:nginx.bulut.comtomcat.bulut.com主机名需要跟ingress-nginx所在的主机ip做映射。
      在这里插入图片描述

    五、helm方式安装ingress(推荐)

    1. 卸载原来的ingress:kubectl delete -f /opt/deploy.yaml

    2. 搜索 ingress-nginx :helm search repo ingress-nginx

    3. 给节点设置标签,后面set设置ingress只能部署在 ingress=true的节点上:kubectl label node worker1 ingress=true

    4. 直接安装ingress

      ps:因为是从github拉取,所以很慢甚至拉不到。如果拉不到,直接跳过此步骤。如果可以,直接进入第11步

      helm install ingress-nginx ingress-nginx/ingress-nginx  -n  ingress-nginx --set controller.hostNetwork=true  --set controller.dnsPolicy=ClusterFirstWithHostNet     --set controller.kind=DaemonSet    --set controller.image.registry=registry.cn-hangzhou.aliyuncs.com  --set controller.image.image=google_containers/nginx-ingress-controller   --set controller.admissionWebhooks.patch.image.registry=registry.cn-hangzhou.aliyuncs.com  --set controller.admissionWebhooks.patch.image.image=google_containers/kube-webhook-certgen --set controller.admissionWebhooks.patch.image.tag="v1.8.1"    --set controller.nodeSelector.ingress="true"   --set controller.service.type=ClusterIP    --set controller.admissionWebhooks.enabled=false
      
      • 1
    5. 在/opt/helm目录下拉取镜像

      cd /opt/helm
      helm pull ingress-nginx/ingress-nginx
      
      • 1
      • 2
    6. 解压:tar -zxvf ingress-nginx-4.7.1.tgz

    7. 进入解压目录:cd /opt/helm/ingress-nginx

    8. 修改配置文件:vi values.yaml

      ps:不同地方的修改点用------------隔开

      ------4------
      controller:
        name: controller
        image:
          ## Keep false as default for now!
          chroot: false
          registry: registry.cn-hangzhou.aliyuncs.com
          image: google_containers/nginx-ingress-controller
          ## for backwards compatibility consider setting the full image url via the repository value below
          ## use *either* current default registry/image or repository format or installing chart by providing the values.yaml will fail
          ## repository:
          tag: "v1.8.1"
          # digest: sha256:e5c4824e7375fcf2a393e1c03c293b69759af37a9ca6abdb91b13d78a93da8bd
          # digestChroot: sha256:e0d4121e3c5e39de9122e55e331a32d5ebf8d4d257227cb93ab54a1b912a7627
      ------2------
      dnsPolicy: ClusterFirstWithHostNet
      ------1------
      hostNetwork: true
      
      ------3------
      kind: DaemonSet
      
      
      -------5-----
          patch:
            enabled: true
            image:
              registry: registry.cn-hangzhou.aliyuncs.com
              image: google_containers/kube-webhook-certgen
              ## for backwards compatibility consider setting the full image url via the repository value below
              ## use *either* current default registry/image or repository format or installing chart by providing the values.yaml will fail
              ## repository:
              tag: "v1.8.1"
              ## digest: sha256:543c40fd093964bc9ab509d3e791f9989963021f1e9e4c9c7b6700b02bfb227b
              ## pullPolicy: IfNotPresent
      ------6------
      nodeSelector:
          kubernetes.io/os: linux
          ingress: "true"
        ## Liveness and readiness probe values
        ## Ref: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle/#container-probes         
      ------7------            
          type: ClusterIP
          ## type: NodePort     
      ------8------       
        admissionWebhooks:
          annotations: {}
          # ignore-check.kube-linter.io/no-read-only-rootfs: "This deployment needs write access to root filesystem".
      
          ## Additional annotations to the admission webhooks.
          ## These annotations will be added to the ValidatingWebhookConfiguration and
          ## the Jobs Spec of the admission webhooks.
          enabled: false
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
      • 10
      • 11
      • 12
      • 13
      • 14
      • 15
      • 16
      • 17
      • 18
      • 19
      • 20
      • 21
      • 22
      • 23
      • 24
      • 25
      • 26
      • 27
      • 28
      • 29
      • 30
      • 31
      • 32
      • 33
      • 34
      • 35
      • 36
      • 37
      • 38
      • 39
      • 40
      • 41
      • 42
      • 43
      • 44
      • 45
      • 46
      • 47
      • 48
      • 49
      • 50
      • 51
      • 52
      • 53
    9. 创建ingress-nginx资源:helm install ingress-nginx -n ingress-nginx .

      ps卸载:helm uninstall ingress-nginx -n ingress-nginx

    10. 查看:kubectl get pod -n ingress-nginx -o wide
      在这里插入图片描述

    11. 访问http://nginx.bulut.com/和http://tomcat.bulut.com/

      ps:如果没有经过第三步,需要补充一些第三步的步骤,比如创建ingress的映射关系等等
      在这里插入图片描述

    六、Ingress的HTTPS代理

    ps:master节点操作

    1. 生成证书

      openssl req -newkey rsa:2048 -nodes -keyout tls.key -x509 -days 3650 -out tls.crt -subj "/C=CN/ST=HN/L=CS/O=bulut/OU=bulut/CN=bulut.com/emailAddress=bulut@163.com"
      
      • 1

      参数说明

      req:表示证书请求的子命令
      -newkey rsa:2048:表示生成私钥
      -nodes:表示私钥不加密
      -keyout tls.key:表示生成的私钥输出文件
      -x509:表示输出证书
      -days 3650:表示证书有效期
      -out tls.crt:表示生成的证书输出文件
      -subj “/C=CN/ST=HN/L=CS/O=bulut/OU=bulut/CN=bulut.com/emailAddress=bulut@163.com”:表示自动输入证书拥有者信息,分别表示:国家/省份/城市/公司名/部门名/域名/邮件地址

      
      2. 创建密钥:kubectl create secret tls tls-secret --key tls.key --cert tls.crt
      
      3. 创建Ingress
      
      1)新建ingress-https.yaml文件:vi /opt/ingress-https.yaml 
      
      ```java
      apiVersion: networking.k8s.io/v1
      kind: Ingress
      metadata:
        name: ingress-https
      spec:
        tls:
          - secretName: tls-secret
            hosts:
              - nginx.bulut.com
              - tomcat.bulut.com
        rules:
          - host: nginx.bulut.com
            http:
              paths:
                - path: /
                  pathType: Exact
                  backend:
                    service:
                      name: nginx-service
                      port:
                        number: 80
          - host: tomcat.bulut.com
            http:
              paths:
                - path: /
                  pathType: Exact
                  backend:
                    service:
                      name: tomcat-service
                      port:
                        number: 8080
      
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
      • 10
      • 11
      • 12
      • 13
      • 14
      • 15
      • 16
      • 17
      • 18
      • 19
      • 20
      • 21
      • 22
      • 23
      • 24
      • 25
      • 26
      • 27
      • 28
      • 29
      • 30
      • 31
      • 32
      • 33
      • 34
      • 35
      • 36
      • 37
      • 38
      • 39
      • 40
      apiVersion: networking.k8s.io/v1: 这指定了使用的Kubernetes API版本。
      kind: Ingress: 这指定了资源类型为Ingress。
      metadata: 这是Ingress对象的元数据,包括名称(name)和命名空间(namespace)。
      spec: 这是Ingress规范,定义了Ingress的规则和TLS配置。
      	tls: 这指定了使用的TLS证书的名称(secretName)和绑定的主机名列表(hosts)。
      	rules: 这定义了Ingress的路由规则。
      		host: 这指定了请求的主机名。
      		http: 这定义了针对HTTP请求的规则。
      			paths: 这定义了路由到该主机的路径规则。
      				path: 这指定了请求的路径。
      				pathType: 这指定了路径的匹配类型,例如Exact表示精确匹配。
      				backend: 这指定了路由到的后端服务。
      					service: 这定义了后端服务的名称(name)和端口(port)。
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
      • 10
      • 11
      • 12
      • 13

      2)创建pod:kubectl apply -f /opt/ingress-https.yaml

      1. Ingress查看:kubectl get ingress ingress-https
        在这里插入图片描述

      2. Ingress详情的查看:kubectl describe ingress ingress-https
        在这里插入图片描述

      3. 访问tomcat和nginx

        curl --insecure https://nginx.bulut.com
        curl --insecure https://tomcat.bulut.com
        
        • 1
        • 2
    2. 相关阅读:
      segmentation
      数据结构入门——链表(SeqList)详解(初始化、增、删、查、改)
      MySQL高级篇_16_MVCC多版本并发控制_尚硅谷_宋红康
      设计符合REST原则的API可以遵循以下步骤
      An2021软件安装及基本操作(新建文件/导出)
      【CompletableFuture 总结】
      Android网络基础面试题之HTTPS的工作流程和原理
      video2blog 视频转图文AI小工具正式开源啦
      30 C++ 预处理器
      SpringBoot + MyBatis 结合 MVC框架设计 第1关:项目整合 - SpringBoot + MyBatis
    3. 原文地址:https://blog.csdn.net/weixin_40496191/article/details/133870761