主頁 > 軟體設計 > 08-服務配置中心Nacos應用實踐

08-服務配置中心Nacos應用實踐

2021-07-31 08:57:37 軟體設計

配置中心簡介

背景分析

我們知道,除了代碼之外,軟體還有一些配置資訊,比如資料庫的用戶名和密碼,還有一些我們不想寫死在代碼里的東西,例如像執行緒池大小、佇列長度等運行引數,以及日志級別、演算法策略等, 還有一些是軟體運行環境的引數,如Java 的記憶體大小,應用啟動的引數,包括作業系統的一些 引數配置…… 所有這些東西,我們都叫做軟體配置,以前,我們把軟體配置寫在一個組態檔中,就像 Windows 下的 ini 檔案,或是 Linux 下的 conf 檔案,然而,在分布式系統下,這樣的方式就變得非常不好管理,并容易出錯,假如生產環境下,專案現在正在運行,此時修改了組態檔,我們需要讓這些配置生效,通常的做法是不是要重啟服務,但重啟是不是會帶來系統服務短時間的暫停,從而影響用戶體驗呢,還有可能會帶來經濟上的很大損失(例如雙11重啟下服務),基于這樣的背景,配置中心誕生了,

配置中心概述

配置中心最基礎的功能就是存盤一個鍵值對,用戶發布一個配置(configKey),然后客戶端獲取這個配置項(configValue);進階的功能就是當某個配置項發生變更時,不停機就可以動態重繪服務內部的配置項,例如,在生產環境上我們可能把我們的日志級別調整為 error 級別,但是,在系統出問題我們希望對它 debug 的時候,我們需要動態的調整系統的行為的能力,把日志級別調整為 debug 級別,還有,當你設計一個電商系統時,設計大促預案一定會考慮,同時涌進來超過一億人并發訪問的時候,假如系統是扛不住的,你會怎么辦,在這個程序中我們一般會采用限流,降級,系統的限流和降級本質上來講就是從日常的運行態切換到大促態的一個行為的動態調整,這個本身天然就是配置起到作用的一個相應的場景,

配置中心的選型

在面向分布式的微服務系統中,如何通過更高效的配置管理方式,實作微服務系統架構持續“無痛”的演進,并動態調整和控制系統的運行時態,配置中心的選型和設計起著舉足輕重的作用,市場上主流配置中心有Apollo(攜程開源),nacos(阿里開源),Spring Cloud Config(Spring Cloud 全家桶成員),我們在對這些配置中心進行選型時重點要從產品功能、使用體驗、實施程序和性能等方面進行綜合考量,本次課程我們選擇nacos,此組件不僅提供了注冊中心,還具備配置中心的功能,

小節面試分析

  • 什么是配置中心?(存盤專案配置資訊的一個服務)
  • 為什么要使用配置中心?(集中管理配置資訊,動態發布配置資訊)
  • 市場上有哪些主流的配置中心?(Apollo,nacos,……)

Nacos配置快速入門

添加依賴

在已有的sca-provider專案中添加如配置依賴,例如:

  <dependency>
        <groupId>com.alibaba.cloud</groupId>
        <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
  </dependency>

修改組態檔

將專案中的application.yml的名字修改為bootstrap.yml組態檔(啟動優先級最高),代碼如下:

spring:
  application:
    name: sca-provider
  cloud:
    nacos:
      discovery:
        server-addr: 127.0.0.1:8848
      config:
        server-addr: 127.0.0.1:8848
        group: DEFAULT_GROUP # Group, default is DEFAULT_GROUP
        file-extension: yml # Configure the data format of the content, default to properties

Nacos基本配置

打開nacos配置中心,新建配置,如圖所示:

在這里插入圖片描述

其中Data IDs的值要與bootstrap.yml中定義的spring.application.name的值相同(服務名-假如有多個服務一般會創建多個配置實體,不同服務對應不同的配置實體),

Controller處理器操作

在ProviderController中添加一個獲取日志級別(debug<info<warn<error)的方法,代碼如下:

@RefreshScope //動態重繪配置
@RestController
public class ProviderController{
    private static final Logger log= LoggerFactory.getLogger(ProviderApplication.class);
    @Value("${logging.level.com.cy:error}")
    private String logLevel;
    @GetMapping("/provider/doGetLogLevel")
    public String doGetLogLevel(){
       log.trace("==log.trace==");//跟蹤
       log.debug("==log.debug==");//除錯
       log.info("==log.info==");//常規資訊
       log.warn("==log.warn==");//警告
       log.error("==log.error==");//錯誤資訊
        return "log level is "+logLevel;
    }
    ……
}

其中,@RefreshScope的作用是在配置中心的相關配置發生變化以后,能夠及時看到更新(底層是通過重新創建Controller物件的方式,對屬性進行了重新初始化),Controller撰寫好以后,啟動配置中心服務,然后進行訪問測驗,,打開瀏覽器直接在地址欄輸入http://localhost:8081/provider/doGetLogLevel,檢測輸出結果是否為我們配置中配置的資訊,如圖所示,

在這里插入圖片描述

說明,假如對配置的資訊訪問不到,請檢測專案組態檔的名字是否為bootstrap.yml,檢查組態檔中spring.application.name屬性的值是否與配置中心的data-id名相同,還有你讀取的配置資訊縮進以及空格寫的格式是否正確.

Nacos配置動態更新實作

修改Nacos的日志級別配置并重新重新發布,如圖所示:
在這里插入圖片描述

重繪瀏覽器url,檢測其配置輸出,

在這里插入圖片描述

小節面試分析

  • 配置中心一般都會配置什么內容?(可能會經常變化的配置資訊,例如連接池,日志、執行緒池、限流熔斷規則)
  • 什么資訊一般不會寫到配置中心?(服務埠,服務名,服務的注冊地址,配置中心)
  • 專案中為什么要定義bootstrap.yml檔案?(此檔案被讀取的優先級比較高,可以在服務啟動時讀取配置中心的資料)
  • Nacos配置中心宕機了,我們的服務還可以讀取到配置資訊嗎?(可以從記憶體,客戶端獲取了配置中心的配置資訊以后,會將配置資訊在本地記憶體中存盤一份.)
  • 微服務應用中我們的客戶端如何獲取配置中心的資訊?(為了考慮性能我們的服務一般首先會從記憶體讀取配置資訊,同時我們的微服務還可以定時向nacos配置中心發請求拉取(pull)更新的配置資訊,但是在一定時間間隔內還可能會出現不一致的配置,所以nacos服務端而言,當配置變化時,會通知客戶端然后更新客戶端.)
  • 微服務應用中客戶端如何感知配置中心資料變化?(當資料發生變化時,nacos找到它維護的客戶端,然后通知客戶端去獲取更新的資料,客戶端獲取資料以后更新本地記憶體,并在下次訪問資源時,重繪@Value注解描述的屬性值,但是需要借助@RefreshScope注解對屬性所在的類進行描述)
  • 服務啟動后沒有從配置中心獲取我們的配置資料是什么原因?(依賴,組態檔名字bootstrap.yml,配置中心的dataId名字是否正確,分組是否正確,配置的名字是否正確,縮進關系是否正確,假如是動態發布,類上是否有@RefreshScope注解)
  • 你專案中使用的日志規范是什么?(SLF4J)
  • 你了解專案中的日志級別嗎?(debug,info,error,…,可以基于日志級別控制日志的輸出)

Nacos配置管理模型

概述

Nacos 配置管理模型由三部分構成,如圖所示:
在這里插入圖片描述
其中:

  • Namespace:命名空間,對不同的環境進?隔離,?如隔離開發環境和?產環境,
  • Group:分組,將若?個服務或者若?個配置集歸為?組,
  • Service/DataId:某?個服務或配置集,一般對應一個組態檔,

命名空間設計

Nacos中的命名空間一般用于配置隔離,這種命名空間的定義一般會按斬訓境(開發,生產等環境)進行設計和實作.我們默認創建的配置都存盤到了public命名空間,如圖所示:
在這里插入圖片描述

創建新的開發環境并定義其配置,然后從開發環境的配置中讀取配置資訊,該如何實作呢?

第一步:創建新命名空間,如圖所示:
在這里插入圖片描述

命名空間成功創建以后,會在如下串列進行呈現,
在這里插入圖片描述

在指定命名空間下添加配置,也可以直接取配置串列中克隆,例如:
在這里插入圖片描述
在這里插入圖片描述
克隆成功以后,我們會發現在指定的命名空間中有了我們克隆的配置,如圖所示:
在這里插入圖片描述

此時我們修改dev命名空間中Data Id的sca-provider配置,如圖所示:
在這里插入圖片描述
修改專案module中的組態檔bootstrap.yml,添加如下配置,關鍵代碼如下:

spring:
  cloud:
    nacos:
      config:
        namespace: 6058fd3f-0d4d-44f2-85d6-5fc7d2348046
        ……

其中,namespace后面的字串為命名空間的id,可直接從命名空間串列中進行拷貝.
重啟服務,繼續重繪http://localhost:8081/config/doGetLogLevel地址,檢測輸出,看看輸出的內容是什么,是否為dev命名空間下配置的內容,如圖所示:

在這里插入圖片描述
我們還可以創建生產環境,依次類推進行設計和實作即可,

分組設計及實作

當我們在指定命名空間下,按環境或服務做好了配置以后,有時還需要基于服務做分組配置,例如,一個服務在不同時間節點(節假日,活動等)切換不同的配置,可以在新建配置時指定分組名稱,如圖所示:
在這里插入圖片描述

配置發布以后,修改boostrap.yml配置類,在其內部指定我們剛剛創建的分組,代碼如下:

server:
  port: 8070
spring:
  application:
    name: nacos-config
  cloud:
    nacos:
      config:
        server-addr: 127.0.0.1:8848
        group: DEV_GROUP_51 # Group, default is DEFAULT_GROUP
        file-extension: yml # Configure the data format of the content, default to properties
        namespace: 5c27fe4a-1141-4836-a14e-cbac77fb2130

在NacosConfigController類中添加屬性和方法用于獲取和輸出DEV_GROUP_51配置中設定的執行緒數,代碼如下:

@Value("${server.tomcat.threads.max:200}")
private Integer maxThread;

@RequestMapping("/provider/doGetMaxThread")
public String doGetMaxThread(){
    return "server.threads.max is  "+maxThread;
}

然后重啟服務,進行測驗,檢測內容輸出,如圖所示:
在這里插入圖片描述

共享配置設計及讀取

當同一個namespace的多個組態檔中都有相同配置時,可以對這些配置進行提取,然后存盤到nacos配置中心的一個或多個指定組態檔,哪個微服務需要,就在服務的配置中設定讀取即可,例如:

第一步:在nacos中創建一個共享組態檔,例如:

在這里插入圖片描述

第二步:在指定的微服務組態檔(bootstrap.yml)中設定對共享組態檔的讀取,例如:
見紅色區域內容,

spring:
  application:
    name: nacos-config
  cloud:
    nacos:
      config:
        server-addr: localhost:8848
        # 命名空間
        namespace: 83ed55a5-1dd9-4b84-a5fe-a734e4a6ec6d
        # 分組名
        # group: DEFAULT_GROUP
        # 配置中心檔案擴展名
        file-extension: yml
        # 共享配置
        shared-configs[0]:
                data-id: app-public-dev.yml
                group: DEFAULT_GROUP
                refresh: true #默認false

第三步:在指定的業務類中讀取和應用共享配置即可,例如:

@Value("${page.pageSize:10}")
private Integer pageSize;
@GetMapping("/provider/doGetPageSize")
public String doGetPageSize(){
    //return String.format()
    return "page size is "+pageSize;
}

第四步:啟動服務進行訪問測驗,
在這里插入圖片描述

小節面試分析

  • Nacos配置管理模型的背景?(環境不同配置不同)
  • Nacos配置中的管理模型是怎樣的?(namespace,group,service/data-id)
  • Nacos客戶端(微服務)是否可以讀取共享配置?(可以)

總結(Summary)

重難點分析

  • 配置中心的選型,(市場活躍度、穩定性、性能、易用)
  • Nacos配置中心基本應用,(新建,修改、洗掉配置以后,在Nacos客戶端應用配置)
  • 配置管理模型應用,(namespace,group,service/dataId)
  • Nacos配置變更的動態感知,(底層原理分析)

FAQ分析

  • 為什么需要配置中心?(動態管理發布配置,無需重啟服務,更好保證服務的可用)
  • 配置中一般要配置什么內容?(經常變化的配置資料-日志級別,執行緒池、連接池、…)
  • 市面上有哪些主流配置中心?(Nacos,….)
  • 配置中心選型時要重點考慮哪些因素?(市場活躍度、穩定性、性能、易用)
  • Nacos客戶端(微服務業務)如何動態感知配置中心資料變化的?(nacos2.0之前nacos客戶端采用長輪詢機制拉取nacos服務的配置資訊,pull(每隔30秒)+“push(是在服務端的配置資訊變更以后,通知服務端中處于等待狀態的客戶端佇列中的客戶端物件,并更新客戶端對應的回應資料,然后回傳回應)”)
  • Nacos配置管理模型是怎樣的?(命名空間-namespace,分組-group,服務實體-dataId)

Bug分析

? ,,,,

轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/291089.html

標籤:其他

上一篇:聊聊百度搜索背后的故事

下一篇:我給鴻星爾克寫了一個720°看鞋展廳

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • 面試突擊第一季,第二季,第三季

    第一季必考 https://www.bilibili.com/video/BV1FE411y79Y?from=search&seid=15921726601957489746 第二季分布式 https://www.bilibili.com/video/BV13f4y127ee/?spm_id_fro ......

    uj5u.com 2020-09-10 05:35:24 more
  • 第三單元作業總結

    1.前言 這應該是本學期最后一次寫作業總結了吧。總體來說,對作業的節奏也差不多掌握了,作業做起來的效率也更高了。雖然和之前的作業一樣,作業中都要用到新的知識,但是相比之前,更加懂得了如何利用工具以及資料。雖然之間卡過殼,但總體而言,這幾次作業還算完成的比較好。 2.作業程序總結 相比前兩個單元,此單 ......

    uj5u.com 2020-09-10 05:35:41 more
  • 北航OO(2020)第四單元博客作業暨課程總結博客

    北航OO(2020)第四單元博客作業暨課程總結博客 本單元作業的架構設計 在本單元中,由于UML圖具有比較清晰的樹形結構,因此我對其中需要進行查詢操作的元素進行了包裝,在樹的父節點中存盤所有孩子的參考。考慮到性能問題,我采用了快取機制,一次查詢后盡可能快取已經遍歷過的資訊,以減少遍歷次數。 本單元我 ......

    uj5u.com 2020-09-10 05:35:48 more
  • BUAA_OO_第四單元

    一、UML決議器設計 ? 先看下題目:第四單元實作一個基于JDK 8帶有效性檢查的UML(Unified Modeling Language)類圖,順序圖,狀態圖分析器 MyUmlInteraction,實際上我們要建立一個有向圖模型,UML中的物件(元素)可能與同級元素連接,也可與低級元素相連形成 ......

    uj5u.com 2020-09-10 05:35:54 more
  • 6.1邏輯運算子

    邏輯運算子 1. && 短路與 運算式1 && 運算式2 01.運算式1為true并且運算式2也為true 整體回傳為true 02.運算式1為false,將不會執行運算式2 整體回傳為false 03.只要有一個運算式為false 整體回傳為false 2. || 短路或 運算式1 || 運算式2 ......

    uj5u.com 2020-09-10 05:35:56 more
  • BUAAOO 第四單元 & 課程總結

    1. 第四單元:StarUml檔案決議 本單元采用了圖模型決議UML。 UML檔案可以抽象為圖、子圖、邊的邏輯結構。 在實作中,圖的節點包括類、介面、屬性,子圖包括狀態圖、順序圖等。 采用了三次遍歷UML元素的方法建圖,第一遍遍歷建點,第二、三次遍歷設定屬性、連邊,實作圖物件的初始化。這里借鑒了一些 ......

    uj5u.com 2020-09-10 05:36:06 more
  • 談談我對C# 多型的理解

    面向物件三要素:封裝、繼承、多型。 封裝和繼承,這兩個比較好理解,但要理解多型的話,可就稍微有點難度了。今天,我們就來講講多型的理解。 我們應該經常會看到面試題目:請談談對多型的理解。 其實呢,多型非常簡單,就一句話:呼叫同一種方法產生了不同的結果。 具體實作方式有三種。 一、多載 多載很簡單。 p ......

    uj5u.com 2020-09-10 05:36:09 more
  • Python 資料驅動工具:DDT

    背景 python 的unittest 沒有自帶資料驅動功能。 所以如果使用unittest,同時又想使用資料驅動,那么就可以使用DDT來完成。 DDT是 “Data-Driven Tests”的縮寫。 資料:http://ddt.readthedocs.io/en/latest/ 使用方法 dd. ......

    uj5u.com 2020-09-10 05:36:13 more
  • Python里面的xlrd模塊詳解

    那我就一下面積個問題對xlrd模塊進行學習一下: 1.什么是xlrd模塊? 2.為什么使用xlrd模塊? 3.怎樣使用xlrd模塊? 1.什么是xlrd模塊? ?python操作excel主要用到xlrd和xlwt這兩個庫,即xlrd是讀excel,xlwt是寫excel的庫。 今天就先來說一下xl ......

    uj5u.com 2020-09-10 05:36:28 more
  • 當我們創建HashMap時,底層到底做了什么?

    jdk1.7中的底層實作程序(底層基于陣列+鏈表) 在我們new HashMap()時,底層創建了默認長度為16的一維陣列Entry[ ] table。當我們呼叫map.put(key1,value1)方法向HashMap里添加資料的時候: 首先,呼叫key1所在類的hashCode()計算key1 ......

    uj5u.com 2020-09-10 05:36:38 more
最新发布
  • 【中介者設計模式詳解】C/Java/JS/Go/Python/TS不同語言實作

    * 中介者模式是一種行為型設計模式,它可以用來減少類之間的直接依賴關系,
    * 將物件之間的通信封裝到一個中介者物件中,從而使得各個物件之間的關系更加松散。
    * 在中介者模式中,物件之間不再直接相互互動,而是通過中介者來中轉訊息。 ......

    uj5u.com 2023-04-20 08:20:47 more
  • 露天煤礦現場調研和交流案例分享

    他們集團的資訊化公司及研究院在一個礦區正在做智能礦山的統一平臺的 試點,專案投資大概1億,包括了礦山的各方面的內容,顯示得我們這次交流有點多余。他們2年前開始做智能礦山的規劃,有很多煤礦行業專家的加持,他們的描述是非常完美,但是去年底應該上線的平臺,現在還沒有看到影子。他們確實有很多場景需求,但是被... ......

    uj5u.com 2023-04-20 08:20:25 more
  • 《社區人員管理》實戰案例設計&個人案例分享

    設計是一個讓人夢想成真程序,開始編碼、測驗、除錯之前進行需求分析和架構設計,才能保證關鍵方面都做正確 ......

    uj5u.com 2023-04-20 08:20:17 more
  • 軟體架構生態化-多角色交付的探索實踐

    作為一個技術架構師,不僅僅要緊跟行業技術趨勢,還要結合研發團隊現狀及痛點,探索新的交付方案。在日常中,你是否遇到如下問題 “ 業務需求排期長研發是瓶頸;非研發角色感受不到研發技改提效的變化;引入ISV 團隊又擔心質量和安全,培訓周期長“等等,基于此我們探索了一種新的技術體系及交付方案來解決如上問題。 ......

    uj5u.com 2023-04-20 08:20:10 more
  • 【中介者設計模式詳解】C/Java/JS/Go/Python/TS不同語言實作

    * 中介者模式是一種行為型設計模式,它可以用來減少類之間的直接依賴關系,
    * 將物件之間的通信封裝到一個中介者物件中,從而使得各個物件之間的關系更加松散。
    * 在中介者模式中,物件之間不再直接相互互動,而是通過中介者來中轉訊息。 ......

    uj5u.com 2023-04-20 08:19:44 more
  • 露天煤礦現場調研和交流案例分享

    他們集團的資訊化公司及研究院在一個礦區正在做智能礦山的統一平臺的 試點,專案投資大概1億,包括了礦山的各方面的內容,顯示得我們這次交流有點多余。他們2年前開始做智能礦山的規劃,有很多煤礦行業專家的加持,他們的描述是非常完美,但是去年底應該上線的平臺,現在還沒有看到影子。他們確實有很多場景需求,但是被... ......

    uj5u.com 2023-04-20 08:19:07 more
  • 《社區人員管理》實戰案例設計&個人案例分享

    設計是一個讓人夢想成真程序,開始編碼、測驗、除錯之前進行需求分析和架構設計,才能保證關鍵方面都做正確 ......

    uj5u.com 2023-04-20 08:18:57 more
  • 軟體架構生態化-多角色交付的探索實踐

    作為一個技術架構師,不僅僅要緊跟行業技術趨勢,還要結合研發團隊現狀及痛點,探索新的交付方案。在日常中,你是否遇到如下問題 “ 業務需求排期長研發是瓶頸;非研發角色感受不到研發技改提效的變化;引入ISV 團隊又擔心質量和安全,培訓周期長“等等,基于此我們探索了一種新的技術體系及交付方案來解決如上問題。 ......

    uj5u.com 2023-04-20 08:18:49 more
  • 05單件模式

    #經典的單件模式 public class Singleton { private static Singleton uniqueInstance; //一個靜態變數持有Singleton類的唯一實體。 // 其他有用的實體變數寫在這里 //構造器宣告為私有,只有Singleton可以實體化這個類! ......

    uj5u.com 2023-04-19 08:42:51 more
  • 【架構與設計】常見微服務分層架構的區別和落地實踐

    軟體工程的方方面面都遵循一個最基本的道理:沒有銀彈,架構分層模型更是如此,每一種都有各自優缺點,所以請根據不同的業務場景,并遵循簡單、可演進這兩個重要的架構原則選擇合適的架構分層模型即可。 ......

    uj5u.com 2023-04-19 08:42:41 more