最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Spring?Boot?Nacos?實現不停服發(fā)布過程詳解

 更新時間:2023年05月17日 08:55:01   作者:跡_Jason  
這篇文章主要為大家介紹了Spring?Boot?Nacos實現不停服發(fā)布過程詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪

引言

最近,由于業(yè)務屬性比較重要,對服務發(fā)布提出了更高的要求,希望能實現不停服發(fā)布。目前,團隊所有項目已經完成基于K8s容器化部署,服務注冊發(fā)現基于Nacos,故本文基于該兩前提下進行討論。

基于該架構下,需要解決如下幾個問題:

  • K8s Java 應用實現滾動發(fā)布,如果新服務不正常的情況下,不將新服務發(fā)布上去,且舊服務不下線
  • 服務從Nacos上主動下線,讓流量不再流入

K8s 滾動發(fā)布

K8s 已天然支持滾動發(fā)布的機制,只需要簡單的配置就可以實現我們的要求,如下是具體配置摘要,我將從上到下進行說明。

apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    app: example-service
  name: example-service
spec:
  #副本數量
  replicas: {{.pod_replicas}}
  selector:
    matchLabels:
      app: example-service
  minReadySeconds: 30 #設置升級延遲時間15秒,等待15秒后升級
  strategy:
    type: RollingUpdate
    rollingUpdate:
      maxSurge: 1   #升級過程中最多可以比原先設置多出的POD數量
      maxUnavailable: 0
  template:
    metadata:
      labels:
        app: example-service
        monitortype: backend
    spec:
      #以下內容為可選,容器調度策略,保證同一deployment的多個副本位于不同的機器上,防止單節(jié)點掛掉導致服務不可用,由于涉及到要與運維溝通資源情況,無法直接給予固定配置。
      affinity:
        podAntiAffinity:
          requiredDuringSchedulingIgnoredDuringExecution:
            - labelSelector:
                matchExpressions:
                  - key: app
                    operator: In
                    values:
                      - example-service
              topologyKey: kubernetes.io/hostname
      containers:
        - image: example-service:latest
          imagePullPolicy: IfNotPresent
          name: example-service
          lifecycle:
            preStop:
              exec:
                command:
                  - curl
                  - '-XPOST'
                  - '127.0.0.1:8080/actuator/shutdown'      
          readinessProbe:                # 就緒探針
            httpGet:
              path: /actuator/health/readiness
              port: 8080
            initialDelaySeconds: 30      # 延遲加載時間
            periodSeconds: 10            # 重試時間間隔
            timeoutSeconds: 1            # 超時時間設置
            successThreshold: 1          # 健康閾值
            failureThreshold: 3          # 不健康閾值
          livenessProbe:                 # 存活探針
            httpGet:
              path: /actuator/health/liveness
              port: 8080
            initialDelaySeconds: 30      # 延遲加載時間
            periodSeconds: 10            # 重試時間間隔
            timeoutSeconds: 1            # 超時時間設置
            successThreshold: 1          # 健康閾值
            failureThreshold: 3          # 不健康閾值
          ports:
            - containerPort: 8080
              name: backend
              protocol: TCP
          envFrom:
            - configMapRef:
                #存放公共環(huán)境變量,比如:數據庫,redis,nacos等連接信息,每個項目的各個微服務基本都是一樣的。
                name: pub-cm
            - configMapRef:
                #存放個性化配置,對于個別的服務,除了公共變量外,會涉及其他引用信息。
                name: example-service-cm
          env:
            - name: POD_NAME
              valueFrom:
                fieldRef:
                  apiVersion: v1
                  fieldPath: metadata.name
          resources:
            #設定以下是設定服務資源根據你的項目實際情況來
            limits: # limits是代表的資源上限,服務能消耗的資源上限
              cpu: {{.pod_cpu_limit}} #{limits_cpu}(必須),目前默認單位為m,如果申請一核則為1024m,以此類推,默認則為500m
              memory: {{.pod_memory_limit}} #{limits_mem}(必須),目前默認單位為Mi,如果申請1G內存則為1024Mi,以此類推,默認則為2048Mi
            requests: # requests是服務所需最小的啟動資源,設置后如果node達不到這個資源要求就會部署失敗
              cpu: {{.pod_cpu_request}} #{requests_cpu}(必須),目前默認單位為m,如果申請一核則為1024m,以此類推,默認則為250m
              memory: {{.pod_memory_request}} #{requests_mem}(必須),目前默認單位為Mi,如果申請1G內存則為1024Mi,以此類推,默認則為500Mi
          # 以下為必須選項,項目做日志采集
          volumeMounts:
            - name: host-time
              readOnly: true
              mountPath: /etc/localtime
            - name: example-service-log
              mountPath: /home/logs # 如果接入日志必須存在容器內/home/logs文件夾下存放日志文件
              subPathExpr: $(POD_NAME)
      volumes:
        - name: example-service-log
          hostPath:
            path: /home/logs
            type: DirectoryOrCreate
        - name: host-time
          hostPath:
            path: /etc/localtime
            type: ''
      imagePullSecrets: # 寫死,前提是要執(zhí)行這個憑證創(chuàng)建命令
        - name: harborha-secret001fe
---
apiVersion: policy/v1beta1
kind: PodDisruptionBudget #設置pod最小可用數量
metadata:
  name: example-service-pdb
spec:
  minAvailable: 50%
  selector:
    matchLabels:
      app: example-service

RollingUpdate 用于配置服務滾動升級的策略,maxSurge設置升級過程中最多可以比原先設置多出的POD數量。

preStop 在容器下線前執(zhí)行的操作,我這邊是希望他先調用 Spring Boot Actuator提供的下線接口,讓服務正常業(yè)務處理完后,下線掉。

readinessProbe 與 livenessProbe 都是探針,不同的地方是 readinessProbe 在容器啟動時,會檢查服務是否啟動完全和正常,正常后Pod才會被顯示正常,這種在使用Service或者Ingress的時候非常有用,livenessProbe 則是周期性檢查服務的健康性,如果服務不健康將下線掉服務。

需要注意 readinessProbe 的 initialDelaySeconds 是在服務啟動時開始計時,基于服務本身啟動時間設置一個相對合理的時間,以提高成功率。

PodDisruptionBudget 該控制器主要是通過設置應用 Pod 處于正常狀態(tài)的最低個數或最低百分比,這樣可以保證在主動銷毀 Pod 的時候,不會銷毀太多的 Pod 導致業(yè)務異常中斷,從而提高業(yè)務的可用性。

PodDisruptionBudget與Deployment中 RollingUpdate 配置說明

在滾動更新的時候,會根據RollngUpdate 配置來,在Eviction(主動驅逐保護,e.g.存在不健康的節(jié)點,下線服務)會根據PDB策略來。

Nacos主動下線

我們想象一種場景,A服務通過Nacos服務注冊發(fā)現LoadBalance方式直接調用B服務,即使B服務容器已經被銷毀,但如果A服務中還存在舊B服務的地址,那么就會調用異常,所以我們希望B服務下線的時候,A服務是有感知的,故我們選擇在主動通知Nacos服務下線服務,同時,由Nacos去通知其他服務下線通知。

新建一個Endpoint,該方式是基于Spring Boot 2.7.X 版本的,其他版本可能有所區(qū)別。

@WebEndpoint(id = "deregister")
@Slf4j
@ConditionalOnClass(value = WebEndpoint.class)
public class NacosServiceDeregisterEndpoint {
    private final NacosDiscoveryProperties nacosDiscoveryProperties;
    private final NacosRegistration nacosRegistration;
    private final NacosServiceRegistry nacosServiceRegistry;
    public NacosServiceDeregisterEndpoint(NacosDiscoveryProperties nacosDiscoveryProperties, NacosRegistration nacosRegistration, NacosServiceRegistry nacosServiceRegistry) {
        this.nacosDiscoveryProperties = nacosDiscoveryProperties;
        this.nacosRegistration = nacosRegistration;
        this.nacosServiceRegistry = nacosServiceRegistry;
    }
    @ReadOperation
    public String deregisterEndPoint() {
        String serviceName = nacosDiscoveryProperties.getService();
        String groupName = nacosDiscoveryProperties.getGroup();
        String clusterName = nacosDiscoveryProperties.getClusterName();
        String ip = nacosDiscoveryProperties.getIp();
        int port = nacosDiscoveryProperties.getPort();
        log.info("Deregister from the Nacos, ServiceName:{}, GroupName:{}, ClusterName:{}, IP:{}, Port:{}", serviceName, groupName, clusterName, ip, port);
        // 設置服務下線
        nacosServiceRegistry.setStatus(nacosRegistration, "DOWN");
        return "success";
    }
}

增加和修改bootstrap.yaml 配置

management:
  endpoint:
    health:
      show-details: always
      probes:
        enabled: true
    metrics:
      enabled: true
    shutdown:
      enabled: true
  endpoints:
    web:
      exposure:
        include: "health,shutdown,metrics,deregister"
  server:
    port: 8080
  metrics:
    tags:
      application: ${spring.application.name}

后續(xù)

其實上方我們還遺漏一個問題——“服務更新時,服務已經成功注冊到 Nacos,但容器還沒有被檢測為健康,此時流量打到新節(jié)點上。”這種情況應該怎么解決。其實不用苦惱,

以上就是Spring Boot Nacos 實現不停服發(fā)布的詳細內容,更多關于Spring Boot Nacos不停服發(fā)布的資料請關注腳本之家其它相關文章!

相關文章

  • SpringBoot實現海量數據高效實時搜索功能

    SpringBoot實現海量數據高效實時搜索功能

    我們都知道隨著業(yè)務系統(tǒng)的發(fā)展和使用,數據庫存儲的業(yè)務數據量會越來越大,逐漸成為了業(yè)務系統(tǒng)的瓶頸,本文給大家介紹了Spring Boot業(yè)務系統(tǒng)如何實現海量數據高效實時搜索,文中有詳細的代碼示例,需要的朋友可以參考下
    2023-10-10
  • ElasticSearch啟動成功卻無法在瀏覽器訪問問題解決辦法

    ElasticSearch啟動成功卻無法在瀏覽器訪問問題解決辦法

    因工作的需要,要使用elasticsearch,安裝完了,啟動也成功了之后發(fā)現了問題,這篇文章主要給大家介紹了關于ElasticSearch啟動成功卻無法在瀏覽器訪問問題的解決辦法,需要的朋友可以參考下
    2024-10-10
  • Java 8 Stream流強大的原理

    Java 8 Stream流強大的原理

    這篇文章主要介紹了Java 8 Stream流強大的原理,Java 8 API添加了一個新的抽象稱為流Stream,可以讓你以一種聲明的方式處理數據。本文會對Stream的實現原理進行剖析,具有一定的參考價值,需要的朋友可以參考一下
    2021-12-12
  • 解決IDEA創(chuàng)建第一個spring boot項目提示cannot resolve xxx等錯誤

    解決IDEA創(chuàng)建第一個spring boot項目提示cannot resolve xxx等

    這篇文章主要介紹了解決IDEA創(chuàng)建第一個spring boot項目提示cannot resolve xxx等錯誤問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-01-01
  • SpringBoot?熱搜與不雅文字過濾的實現

    SpringBoot?熱搜與不雅文字過濾的實現

    本文主要介紹了SpringBoot?熱搜與不雅文字過濾的實現,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2022-07-07
  • Java8中如何通過方法引用獲取屬性名詳解

    Java8中如何通過方法引用獲取屬性名詳解

    這篇文章主要給大家介紹了關于Java8中如何通過方法引用獲取屬性名的相關資料,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-09-09
  • Java解析xml文件遇到特殊符號異常的情況(處理方案)

    Java解析xml文件遇到特殊符號異常的情況(處理方案)

    這篇文章主要介紹了Java解析xml文件遇到特殊符號&會出現異常的解決方案,實現思路很簡單通過在讀取xml文件使用SAX解析前讀取reader,具體實現方法及示例代碼跟隨小編一起看看吧
    2021-05-05
  • 如何解決Spring in action @valid驗證不生效的問題

    如何解決Spring in action @valid驗證不生效的問題

    這篇文章主要介紹了如何解決Spring in action @valid驗證不生效的問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-06-06
  • java?線程池狀態(tài)及狀態(tài)轉換

    java?線程池狀態(tài)及狀態(tài)轉換

    這篇文章主要介紹了java?線程池狀態(tài)及狀態(tài)轉換,Java里線程池的狀態(tài)和線程的狀態(tài)是完全不同的,具體有幾種狀態(tài)和哪些不同點,下面文章詳細介紹,需要的小伙伴可以參考一下
    2022-05-05
  • JAVA maven項目使用釘釘SDK獲取token、用戶

    JAVA maven項目使用釘釘SDK獲取token、用戶

    這篇文章主要介紹了JAVA maven項目使用釘釘SDK獲取token、用戶,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-06-06

最新評論

建平县| 郓城县| 安庆市| 黎城县| 布尔津县| 陈巴尔虎旗| 金堂县| 镇远县| 巫溪县| 积石山| 星子县| 贵德县| 湘乡市| 吉木乃县| 龙南县| 大荔县| 翁源县| 三明市| 平原县| 宁强县| 竹溪县| 尖扎县| 理塘县| 阿拉善右旗| 兴宁市| 宕昌县| 金平| 辽宁省| 永州市| 抚松县| 潮安县| 高州市| 益阳市| 库尔勒市| 松原市| 乌兰县| 沅江市| 乌兰浩特市| 长葛市| 团风县| 崇明县|