您当前的位置:首页 > 电脑百科 > 程序开发 > 框架

k8s部署高可用配置中心apollo-手动验证成功

时间:2021-01-11 13:50:32  来源:  作者:

前言

在前一篇文章中简单地介绍了《5分钟通过Docker快速部署并使用apollo配置中心》,用户可以快速地了解到配置中心apollo的基本使用,如需要看上文的可以看如下链接:https://www.toutiao.com/i6914234898681299464/

但是在生产环境中我们往往需要高可用的部署配置中心,这样我们就得有k8s来进行部署。在apollo的官方文档中有关于k8s部署的文章(https://github.com/ctripcorp/apollo/tree/master/scripts/apollo-on-kubernetes),但是在执行的过程中是会遇到一定的坑的。包括实际部署中遇到的,镜像的制作、portal服务的多实例支持、ingress的创建都没有说到,本人在部署的过程中已经全部解决以上问题,希望可以帮到没有部署过的用户。

部署成功页面

下面是部署完成后,访问apollo的登录页面

k8s部署高可用配置中心apollo-手动验证成功

登录页面

输入用户名密码:apollo/admin,部署环境完成portal页面图

k8s部署高可用配置中心apollo-手动验证成功

部署完成apollo后页面

k8s的dashboard部署页面,本文部署了dev, fat, pro三个环境。

k8s部署高可用配置中心apollo-手动验证成功

部署环境完成k8s后dashboard图

部署过程

本文在部署的时候使用了当前最新的apollo版本为:1.7.1,所以下面的所有构建也是基于当前版本的。

一、构建镜像

首先从git上下载源码,可以从github下载:https://github.com/ctripcorp/apollo;也可以从gitee下载:https://gitee.com/nobodyiam/apollo,国内的会快一点。然后进入到目录

/scripts/apollo-on-kubernetes

去构建镜像。

 

1、 直接使用编译的的包进行安装,获取 apollo 压缩包

可以直接从官网下载,因为github实在是太慢了。建议直接从我的百度云下载。

A、下载比较慢,直接用我百度云

链接:https://pan.baidu.com/s/1eLL2ocYE1uzXcvzO2Y3dNg

提取码:nfvm

B、从 https://github.com/ctripcorp/apollo/releases 下载预先打好的 JAVA

(1)进入scripts/apollo-on-kubernetes/

执行 wget https://github.com/ctripcorp/apollo/releases/download/v1.7.1/apollo-portal-1.7.1-github.zip

(2)进入scripts/apollo-on-kubernetes/

执行 wget https://github.com/ctripcorp/apollo/releases/download/v1.7.1/apollo-adminservice-1.7.1-github.zip

(3)进入scripts/apollo-on-kubernetes/

执行 wget https://github.com/ctripcorp/apollo/releases/download/v1.7.1/apollo-configservice-1.7.1-github.zip

2、解压压缩包, 获取程序 jar 包

不要忘记重命名,把版本号去掉。

解压 apollo-portal-1.7.1-github.zip
获取 apollo-portal-1.7.1.jar, 重命名为 apollo-portal.jar, 放到 scripts/apollo-on-kubernetes/apollo-portal-server
解压 apollo-adminservice-1.7.1-github.zip
获取 apollo-adminservice-1.7.1.jar, 重命名为 apollo-adminservice.jar, 放到 scripts/apollo-on-kubernetes/apollo-admin-server
解压 apollo-configservice-1.7.1-github.zip
获取 apollo-configservice-1.7.1.jar, 重命名为 apollo-configservice.jar, 放到 scripts/apollo-on-kubernetes/apollo-config-server

3、构建镜像

注意:因为许多地方都要同时改,在构建的时候要确定命名空间,我使用zizai。

要构建如下的镜像:alpine-bash-3.8-image,apollo-config-server,apollo-admin-server和apollo-portal-server,对应的镜像文件,在对应的目录下:

k8s部署高可用配置中心apollo-手动验证成功

 

构建镜像要去到对应的Dockerfile同级目录下去执行。

例如,去到scripts/apollo-on-kubernetes/apollo-config-server下执行:

docker build -t apollo-config-server:v1.7.1 .

注意,总共要构建4个镜像。整体的思路是:先构建镜像,然后打tag,再推到仓库里去。

在对应目录下,总结整体脚本如下:

alpine-bash-3.8-image的镜像:
docker build -t alpine-bash:3.8 .
docker tag alpine-bash:3.8  hub.thinkinpower.net/zizai/alpine-bash:3.8
docker push hub.thinkinpower.net/zizai/alpine-bash:3.8

apollo对应的镜像:
docker build -t apollo-config-server:v1.7.1 .
docker tag apollo-config-server:v1.7.1  hub.xx.net/zizai/apollo-config-server:v1.7.1
docker push hub.xx.net/zizai/apollo-config-server:v1.7.1

docker build -t apollo-admin-server:v1.7.1 .
docker tag apollo-admin-server:v1.7.1  hub.xx.net/zizai/apollo-admin-server:v1.7.1
docker push hub.xx.net/zizai/apollo-admin-server:v1.7.1

docker build -t apollo-portal-server:v1.7.1 .
docker tag apollo-portal-server:v1.7.1  hub.thinkinpower.net/zizai/apollo-portal-server:v1.7.1
docker push hub.thinkinpower.net/zizai/apollo-portal-server:v1.7.1

 

二、部署apollo到kubernetes

1、创建数据库脚本

说明一下:

在实际的生产环境使用中,通过分布式存储来实现的磁盘在MySQL这种IO密集性应用中,性能问题会显得非常突出。所以在实际应用中,一般不会把mysql这种应用直接放入kubernetes中管理,而是使用专用的服务器来独立部署。而像web这种无状态应用依然会运行在kubernetes当中,这个时候web服务器要连接kubernetes管理之外的数据库,有两种方式:一是直接连接数据库所在物理服务器IP,另一种方式就是借助kubernetes的Endpoints直接将外部服务器映射为kubernetes内部的一个服务。

我们使用外面的mysql作为数据库,不会将mysql部署到k8s里。

执行目录scripts/apollo-on-kubernetes/db下的脚本。Apollo服务端共需要两个数据库:ApolloPortalDB和ApolloConfigDB。每一个配置的config一个数据库脚本,portal一个数据库脚本。数据库脚本见:https://github.com/ctripcorp/apollo/tree/master/scripts/apollo-on-kubernetes/db,在git里已经有。如果apollo 开启了 4 个环境, 即 dev、test-alpha、test-beta、prod, 在MySQL 中导入 scripts/apollo-on-kubernetes/db 下的文件。

k8s部署高可用配置中心apollo-手动验证成功

 

2、部署k8s的yaml文件

官网的yaml可以下载修改就可以了,因为我用自己的仓库的镜像,并且多次测试,我主要有如下的修改:

(1)配置文件要删除掉安全提示:

securityContext:

privileged: true

(2)添加仓库的密钥:

imagePullSecrets:

- name: registry-harbor

(3)下面修改为每次都拉镜像:Always

imagePullPolicy: Always

(4)添加mysql的配置信息

我只用3个环境,需要修改的文件如图:

k8s部署高可用配置中心apollo-手动验证成功

 

因为修改得比较多,我将在下面列出每一个文件。我只拿开发环境apollo-env-dev的作为一个示例,其它的只是对应修改就可以了。在执行的时候,建议大家从下面的(3)、(2)、(1)的顺序执行下面的文件。

(1)、service-apollo-admin-server-dev.yaml


---
# configmap for apollo-admin-server-dev
kind: ConfigMap
apiVersion: v1
metadata:
  namespace: zizai
  name: configmap-apollo-admin-server-dev
data:
  Application-github.properties: |
    spring.datasource.url = jdbc:mysql://service-mysql-for-apollo-dev-env.zizai:3306/DevApolloConfigDB?characterEncoding=utf8
    spring.datasource.username = admin
    spring.datasource.password = mysql-admin
    eureka.service.url = http://statefulset-apollo-config-server-dev-0.service-apollo-meta-server-dev:8080/eureka/,http://statefulset-apollo-config-server-dev-1.service-apollo-meta-server-dev:8080/eureka/,http://statefulset-apollo-config-server-dev-2.service-apollo-meta-server-dev:8080/eureka/

---
kind: Service
apiVersion: v1
metadata:
  namespace: zizai
  name: service-apollo-admin-server-dev
  labels:
    app: service-apollo-admin-server-dev
spec:
  ports:
    - protocol: TCP
      port: 8090
      targetPort: 8090
  selector:
    app: pod-apollo-admin-server-dev
  type: ClusterIP
  sessionAffinity: ClientIP

---
kind: Deployment
apiVersion: apps/v1
metadata:
  namespace: zizai
  name: deployment-apollo-admin-server-dev
  labels:
    app: deployment-apollo-admin-server-dev
spec:
  replicas: 3
  selector:
    matchLabels:
      app: pod-apollo-admin-server-dev
  strategy:
    rollingUpdate:
      maxSurge: 1
      maxUnavailable: 1
    type: RollingUpdate
  template:
    metadata:
      labels:
        app: pod-apollo-admin-server-dev
    spec:
      imagePullSecrets:           # dokcer仓库密码,不需要的可以去掉
        - name: registry-harbor
      affinity:
        podAntiAffinity:
          preferredDuringSchedulingIgnoredDuringExecution:
          - weight: 100
            podAffinityTerm:
              labelSelector:
                matchExpressions:
                - key: app
                  operator: In
                  values:
                  - pod-apollo-admin-server-dev
              topologyKey: kubernetes.io/hostname
      
      volumes:
        - name: volume-configmap-apollo-admin-server-dev
          configMap:
            name: configmap-apollo-admin-server-dev
            items:
              - key: application-github.properties
                path: application-github.properties
      
      initContainers:
        - image: hub.thinkinpower.net/zizai/alpine-bash:3.8
          imagePullPolicy: Always
          name: check-service-apollo-config-server-dev
          command: ['bash', '-c', "curl --connect-timeout 2 --max-time 5 --retry 60 --retry-delay 1 --retry-max-time 120 service-apollo-config-server-dev.zizai:8080"]
      
      containers:
        - image: hub.thinkinpower.net/zizai/apollo-admin-server:v1.7.1
          imagePullPolicy: Always
          name: container-apollo-admin-server-dev
          ports:
            - protocol: TCP
              containerPort: 8090
          volumeMounts:
            - name: volume-configmap-apollo-admin-server-dev
              mountPath: /apollo-admin-server/config/application-github.properties
              subPath: application-github.properties
          
          env:
            - name: APOLLO_ADMIN_SERVICE_NAME
              value: "service-apollo-admin-server-dev.zizai"
          
          readinessProbe:
            tcpSocket:
              port: 8090
            initialDelaySeconds: 10
            periodSeconds: 5
          
          livenessProbe:
            tcpSocket:
              port: 8090
            initialDelaySeconds: 120
            periodSeconds: 10
          
      DNSPolicy: ClusterFirst
      restartPolicy: Always

(2)、service-apollo-config-server-dev.yaml


---
# configmap for apollo-config-server-dev
kind: ConfigMap
apiVersion: v1
metadata:
  namespace: zizai
  name: configmap-apollo-config-server-dev
data:
  application-github.properties: |
    spring.datasource.url = jdbc:mysql://service-mysql-for-apollo-dev-env.zizai:3306/DevApolloConfigDB?characterEncoding=utf8
    spring.datasource.username = admin
    spring.datasource.password = mysql-admin
    eureka.service.url = http://statefulset-apollo-config-server-dev-0.service-apollo-meta-server-dev:8080/eureka/,http://statefulset-apollo-config-server-dev-1.service-apollo-meta-server-dev:8080/eureka/,http://statefulset-apollo-config-server-dev-2.service-apollo-meta-server-dev:8080/eureka/

---
kind: Service
apiVersion: v1
metadata:
  namespace: zizai
  name: service-apollo-meta-server-dev
  labels:
    app: service-apollo-meta-server-dev
spec:
  ports:
    - protocol: TCP
      port: 8080
      targetPort: 8080
  selector:
    app: pod-apollo-config-server-dev
  type: ClusterIP
  clusterIP: None
  sessionAffinity: ClientIP

---
kind: Service
apiVersion: v1
metadata:
  namespace: zizai
  name: service-apollo-config-server-dev
  labels:
    app: service-apollo-config-server-dev
spec:
  ports:
    - protocol: TCP
      port: 8080
      targetPort: 8080
      nodePort: 30002
  selector:
    app: pod-apollo-config-server-dev 
  type: NodePort
  sessionAffinity: ClientIP

---
kind: StatefulSet
apiVersion: apps/v1
metadata:
  namespace: zizai
  name: statefulset-apollo-config-server-dev
  labels:
    app: statefulset-apollo-config-server-dev
spec:
  serviceName: service-apollo-meta-server-dev
  replicas: 3
  selector:
    matchLabels:
      app: pod-apollo-config-server-dev
  updateStrategy:
    type: RollingUpdate
  template:
    metadata:
      labels:
        app: pod-apollo-config-server-dev
    spec:
      imagePullSecrets:           # dokcer仓库密码,不需要的可以去掉
        - name: registry-harbor
      affinity:
        podAntiAffinity:
          preferredDuringSchedulingIgnoredDuringExecution:
          - weight: 100
            podAffinityTerm:
              labelSelector:
                matchExpressions:
                - key: app
                  operator: In
                  values:
                  - pod-apollo-config-server-dev
              topologyKey: kubernetes.io/hostname

      volumes:
        - name: volume-configmap-apollo-config-server-dev
          configMap:
            name: configmap-apollo-config-server-dev
            items:
              - key: application-github.properties
                path: application-github.properties
      
      containers:
        - image: hub.thinkinpower.net/zizai/apollo-config-server:v1.7.1
          imagePullPolicy: Always
          name: container-apollo-config-server-dev
          ports:
            - protocol: TCP
              containerPort: 8080
          volumeMounts:
            - name: volume-configmap-apollo-config-server-dev
              mountPath: /apollo-config-server/config/application-github.properties
              subPath: application-github.properties
          
          env:
            - name: APOLLO_CONFIG_SERVICE_NAME
              value: "service-apollo-config-server-dev.zizai"
          
          readinessProbe:
            tcpSocket:
              port: 8080
            initialDelaySeconds: 10
            periodSeconds: 5
          
          livenessProbe:
            tcpSocket:
              port: 8080
            initialDelaySeconds:  120
            periodSeconds: 10
          
      dnsPolicy: ClusterFirst
      restartPolicy: Always

(3)、service-mysql-for-apollo-dev-env.yaml

---
# 为外部 mysql 服务设置 service
kind: Service
apiVersion: v1
metadata:
  namespace: zizai
  name: service-mysql-for-apollo-dev-env
  labels:
    app: service-mysql-for-apollo-dev-env
spec:
  ports:
    - protocol: TCP
      port: 3306
      targetPort: 3306
  type: ClusterIP
  sessionAffinity: None

---
kind: Endpoints
apiVersion: v1
metadata:
  namespace: zizai
  name: service-mysql-for-apollo-dev-env
subsets:
  - addresses:
      - ip: 10.29.254.48
    ports:
      - protocol: TCP
        port: 3306

3、添加Ingress

官网给的示例是用k8s的NodePort来访问,但是在实际中,我们用会用Ingress来访问Portal。

注意:因为我们在部署portal的时候是多实例的,所以Ingress要添加保持会话,要不页面会登录不了,进入不了portal页面。具体为:

metadata:
  annotations:
    Nginx.ingress.kubernetes.io/affinity: "cookie"  # 解决会话保持
    nginx.ingress.kubernetes.io/session-cookie-name: "route"
    nginx.ingress.kubernetes.io/session-cookie-expires: "172800"
    nginx.ingress.kubernetes.io/session-cookie-max-age: "172800"

ingress的代码示例为如下:

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: zizai-apollo-portal
  namespace: zizai
  annotations:
    nginx.ingress.kubernetes.io/affinity: "cookie"  # 解决会话保持
    nginx.ingress.kubernetes.io/session-cookie-name: "route"
    nginx.ingress.kubernetes.io/session-cookie-expires: "172800"
    nginx.ingress.kubernetes.io/session-cookie-max-age: "172800"

spec:
  rules:
    - host: zizai-apollo-portal.test.thinkinpower.net
      http:
        paths:
          - path: /
            backend:
              serviceName: service-apollo-portal-server
              servicePort: 8070

 

4、配置nginx

添加nginx访问到Ingress里:

nginx配置文件:zizai-apollo-portal.test.thinkinpower.net.conf

server {
  listen     80;
  server_name  zizai-apollo-portal.test.thinkinpower.net;
  access_log  /data/logs/nginx/zizai-apollo-portal.test.thinkinpower.net.access.log  main;
  error_log  /data/logs/nginx/zizai-apollo-portal.test.thinkinpower.net.error.log;
  root   /data/webapps/zizai-apollo-portal.test.thinkinpower.net/test/static;
  index  index.html index.htm;
  client_max_body_size 50m;


  location   / {
    proxy_set_header Host $http_host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_pass http://kubernetes;  # 指向集群的
  }

}

这样就可以根据域名:http://zizai-apollo-portal.test.thinkinpower.net 访问portal了。

(1)创建的部署:

k8s部署高可用配置中心apollo-手动验证成功

 

(2)创建的有部署副本:

k8s部署高可用配置中心apollo-手动验证成功

 

(3)创建的service:

k8s部署高可用配置中心apollo-手动验证成功

 

(4)创建的ingress:

k8s部署高可用配置中心apollo-手动验证成功

 

(5)创建的配置字典:

k8s部署高可用配置中心apollo-手动验证成功

 

三、简单使用

本文章将只有简单的使用,后面会有文章介绍详细的使用,需要的可以在本文留言。

1、创建项目

k8s部署高可用配置中心apollo-手动验证成功

 

2、选择一个环境添加变量timeout

k8s部署高可用配置中心apollo-手动验证成功

 

3、如果是在添加环境的过程中,刷新页面会有“添加补缺环境”的提示

k8s部署高可用配置中心apollo-手动验证成功

添加补缺环境

就这样实现了k8s部署高可能的apollo。有建议的可以在评论区留言。谢谢!



Tags:k8s   点击:()  评论:()
声明:本站部分内容及图片来自互联网,转载是出于传递更多信息之目的,内容观点仅代表作者本人,如有任何标注错误或版权侵犯请与我们联系(Email:2595517585@qq.com),我们将及时更正、删除,谢谢。
▌相关推荐
背景:目前prometheus 给pod的内存告警阀值设置的85%,由于JVM 设置最高申请内存为pod limit 的75%,通过arthas-boot查看到堆内存和元空间占用内存之和跟prometheus告警值不同。...【详细内容】
2021-09-16  Tags: k8s  点击:(104)  评论:(0)  加入收藏
近期由于工作原因,在项目支持的过程中,进行了一次K8S的基础环境部署,云平台一直是公司的重要底座,而我由于一系列原因,一直没有亲自尝试,通过本次的机会,让我重新做了一遍,也找到了...【详细内容】
2021-09-09  Tags: k8s  点击:(90)  评论:(0)  加入收藏
概述谷歌云使用先进的 Andromeda 网络来实现 VPC 内实例之间的相互访问,以及 Google Kubernetes Engine (GKE) 的 Pod 的跨节点互访,避免了配置静态路由或者 Overlay 网络带来...【详细内容】
2021-08-20  Tags: k8s  点击:(103)  评论:(0)  加入收藏
1.创建yaml模板 kubectl create deployment web --image=nginx --dry-run -o yaml > web.yaml 2.修改模板 vim web.yamlapiVersion: apps/v1kind: Deploymentmetadata:label...【详细内容】
2021-07-20  Tags: k8s  点击:(160)  评论:(0)  加入收藏
Jenkins 是目前最常用的持续集成工具,拥有近50%的市场份额,他还是很多技术团队的第一个使用的自动化工具。由此可见他的重要性!这份Jenkins宝典从入门介绍到结合Docker+SpringC...【详细内容】
2021-06-09  Tags: k8s  点击:(145)  评论:(0)  加入收藏
kubeadm 是官方社区推出的一个用于快速部署 kubernetes 集群的工具。这个工具能通过两条指令完成一个 kubernetes 集群的部署:# 创建一个 Master 节点$ kubeadm init # 将一...【详细内容】
2021-04-29  Tags: k8s  点击:(276)  评论:(0)  加入收藏
K8S 网络设计与实现是在学习 K8S 网络过程中总结的内容。本文按照 K8S 网络设计原则、Pod 内部网络、Pod 之间网络等几个步骤讲解 K8S 复杂的网络架构。 图片出自:《你女儿也...【详细内容】
2021-04-01  Tags: k8s  点击:(266)  评论:(0)  加入收藏
记录在 ubuntu-20.04.2-live-server系统上通过rancher安装k8s的过程。0. 更换阿里云软件源为了保障下载速度,将ubuntu软件源替换为阿里云软件源。如果网络通畅,可跳过。0.1....【详细内容】
2021-03-26  Tags: k8s  点击:(324)  评论:(0)  加入收藏
1.创建一个简单的应用程序在安装好Docker后,现在让我们来创建一个简单的应用程序。我们先创建一个简单的Node.js Web应用,然后将它打包到镜像中。该应用可以接受HTTP请求并返...【详细内容】
2021-03-10  Tags: k8s  点击:(219)  评论:(0)  加入收藏
一、日志收集的需求背景:• 业务发展越来越庞大,服务器越来越多​ • 各种访问日志、应用日志、错误日志量越来越多​ • 开发人员排查问题,需要到服务器上查日志,...【详细内容】
2021-03-05  Tags: k8s  点击:(189)  评论:(0)  加入收藏
▌简易百科推荐
近日只是为了想尽办法为 Flask 实现 Swagger UI 文档功能,基本上要让 Flask 配合 Flasgger, 所以写了篇 Flask 应用集成 Swagger UI 。然而不断的 Google 过程中偶然间发现了...【详细内容】
2021-12-23  Python阿杰    Tags:FastAPI   点击:(6)  评论:(0)  加入收藏
文章目录1、Quartz1.1 引入依赖<dependency> <groupId>org.quartz-scheduler</groupId> <artifactId>quartz</artifactId> <version>2.3.2</version></dependency>...【详细内容】
2021-12-22  java老人头    Tags:框架   点击:(11)  评论:(0)  加入收藏
今天来梳理下 Spring 的整体脉络啦,为后面的文章做个铺垫~后面几篇文章应该会讲讲这些内容啦 Spring AOP 插件 (了好久都忘了 ) 分享下 4ye 在项目中利用 AOP + MybatisPlus 对...【详细内容】
2021-12-07  Java4ye    Tags:Spring   点击:(14)  评论:(0)  加入收藏
&emsp;前面通过入门案例介绍,我们发现在SpringSecurity中如果我们没有使用自定义的登录界面,那么SpringSecurity会给我们提供一个系统登录界面。但真实项目中我们一般都会使用...【详细内容】
2021-12-06  波哥带你学Java    Tags:SpringSecurity   点击:(18)  评论:(0)  加入收藏
React 简介 React 基本使用<div id="test"></div><script type="text/javascript" src="../js/react.development.js"></script><script type="text/javascript" src="../js...【详细内容】
2021-11-30  清闲的帆船先生    Tags:框架   点击:(19)  评论:(0)  加入收藏
流水线(Pipeline)是把一个重复的过程分解为若干个子过程,使每个子过程与其他子过程并行进行的技术。本文主要介绍了诞生于云原生时代的流水线框架 Argo。 什么是流水线?在计算机...【详细内容】
2021-11-30  叼着猫的鱼    Tags:框架   点击:(21)  评论:(0)  加入收藏
TKinterThinter 是标准的python包,你可以在linx,macos,windows上使用它,你不需要安装它,因为它是python自带的扩展包。 它采用TCL的控制接口,你可以非常方便地写出图形界面,如...【详细内容】
2021-11-30    梦回故里归来  Tags:框架   点击:(26)  评论:(0)  加入收藏
前言项目中的配置文件会有密码的存在,例如数据库的密码、邮箱的密码、FTP的密码等。配置的密码以明文的方式暴露,并不是一种安全的方式,特别是大型项目的生产环境中,因为配置文...【详细内容】
2021-11-17  充满元气的java爱好者  博客园  Tags:SpringBoot   点击:(25)  评论:(0)  加入收藏
一、搭建环境1、创建数据库表和表结构create table account(id INT identity(1,1) primary key,name varchar(20),[money] DECIMAL2、创建maven的工程SSM,在pom.xml文件引入...【详细内容】
2021-11-11  AT小白在线中  搜狐号  Tags:开发框架   点击:(29)  评论:(0)  加入收藏
SpringBoot开发的物联网通信平台系统项目功能模块 功能 说明 MQTT 1.SSL支持 2.集群化部署时暂不支持retain&will类型消 UDP ...【详细内容】
2021-11-05  小程序建站    Tags:SpringBoot   点击:(55)  评论:(0)  加入收藏
最新更新
栏目热门
栏目头条