在看正文以前,我想請你回顧一下本身待過的公司都是怎麼管理配置的,我想應該會有如下幾種方式:html
一、硬編碼
沒有什麼配置不配置的,直接寫在代碼裏面,好比使用常量類
優點:對開發友好,開發清楚地知道代碼須要用到什麼配置
劣勢:涉及祕鑰等敏感配置直接暴露給開發人員,不安全;若是想修改配置必須從新發版,比較麻煩java
二、外部化配置文件
Spring項目常常會在resoures目錄下放不少配置文件,各個環境對應不一樣的配置文件,經過SVN管理
優點:配置文件外部化,支持多環境配置管理,修改配置只需重啓服務,無需發版
劣勢:系統龐大時,配置文件不少,多人開發,配置格式不統一,維護麻煩;敏感配置不須要暴露給開發人員,下降風險,但開發常常要和運維溝通怎麼修改配置,溝通不恰當容易引起生產事故;並且,若是應用部署在多臺機器,對運維來講,修改配置也是很是頭疼的事情(固然也能夠引入NFS系統來解決一部分問題)git
三、數據庫
配置信息存儲在數據庫中,靈活修改
優點:能夠靈活管理配置,無需重啓服務
劣勢:界面不友好,配置沒有版本管理,一旦出現問題,回滾或定位問題都比較麻煩;此外,數據庫必需要保證高可用,避免所以而形成生產故障github
四、配置中心
微服務基礎架構體系中的一個不可或缺的基礎組件
優點:集中化管理,敏感配置可控;多版本存儲,方便追溯;界面友好,修改配置一鍵發佈;即便面對多集羣也能從容應對,十分淡定
劣勢:引入組件,增長系統風險;若是是中途切換成配置中心,也會增長研發接入成本;配置中心也須要保證高可用,不然容易形成大面積影響web
以上幾種管理配置文件的方式,我想都會有公司在用,不要由於配置中心有諸多優勢,就盲目引進項目中,我以爲應該遵照如下兩個原則:spring
釋義:沒深刻研究過的技術,就不要隨便拿到公司項目中來試水啦,恐怕到時候坑夠你填的,要否則就是你有信心玩得轉它。
釋義:小團隊小項目選擇簡單的配置管理方式就行了,要什麼配置中心,純屬沒事找事。
總而言之,咱們必須從實際出發,實事求是,選擇適合本身的技術棧。數據庫
關於爲何須要有配置中心,我推薦一篇文章給你看,講得比較透徹:《微服務架構爲何須要配置中心?》segmentfault
另外,我以爲對開發自己來講,是寧願本身管理本身代碼的配置的,交給運維老是會有各類各樣的問題,至於敏感配置,說實話,開發人員要真想作點「壞事」,那攔得住嗎?可是,從公司的角度來說,把服務器的配置管理交給運維同事是符合常理的,系統須要穩定且安全地運行,這是對客戶的負責,從這一方面去思考,這麼作是合情合理的。api
Okay,我就囉嗦到這裏吧,下面正式介紹Nacos
做爲配置中心是怎麼使用的。安全
添加 maven 依賴:
<dependency> <groupId>com.alibaba.nacos</groupId> <artifactId>nacos-spring-context</artifactId> <version>${nacos-spring-context.version}</version> </dependency>
使用 @EnableNacosConfig
開啓 Nacos Spring 的配置管理功能
@Configuration @EnableNacosConfig(globalProperties = @NacosProperties(serverAddr = "127.0.0.1:8848")) @NacosPropertySource(dataId = "nacos.spring.config", autoRefreshed = true) public class NacosConfig { }
其中:
@Configuration:Spring的註解,配置應用上下文 @EnableNacosConfig:Nacos的註解,啓用 Nacos Spring 的配置管理服務 @NacosProperties:全局和自定義Nacos屬性的統一註解 @NacosPropertySource:加載數據源 globalProperties:全局 Nacos 屬性 serverAddr:Nacos Server服務器地址 dataId:配置的數據集ID autoRefreshed:是否開啓配置動態更新
再寫一個Controller類,來驗證Nacos
的配置管理功能,代碼以下:
package com.learn.nacos; import com.alibaba.nacos.api.annotation.NacosInjected; import com.alibaba.nacos.api.config.ConfigService; import com.alibaba.nacos.api.config.annotation.NacosValue; import com.alibaba.nacos.api.exception.NacosException; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.ResponseBody; @Controller @RequestMapping(value = "config") public class NacosConfigController { @NacosInjected private ConfigService configService; @NacosValue(value = "${useLocalCache:false}", autoRefreshed = true) private boolean useLocalCache; @RequestMapping(value = "/get", method = RequestMethod.GET) @ResponseBody public boolean get() { return useLocalCache; } @RequestMapping(method = RequestMethod.GET) @ResponseBody public ResponseEntity<String> publish(@RequestParam String dataId, @RequestParam(defaultValue = "DEFAULT_GROUP") String group, @RequestParam String content) throws NacosException { boolean result = configService.publishConfig(dataId, group, content); if (result) { return new ResponseEntity<String>("Success", HttpStatus.OK); } return new ResponseEntity<String>("Fail", HttpStatus.INTERNAL_SERVER_ERROR); } }
該Controller類提供了兩個HTTP接口
讀取配置:http://127.0.0.1:8080/config/get
發佈配置:http://127.0.0.1:8080/config?dataId=XXX&content=XXX
發佈配置還能夠經過 Nacos Open API:curl -X POST "http://127.0.0.1:8848/nacos/v1/cs/configs?dataId=XXX&group=XXX&content=XXX
發佈配置,你也能夠用Postman
工具模擬POST
請求進行配置發佈,我這裏主要是爲了方便驗證問題,採用了這種方式。
在驗證以前,請先確保 Nacos Server 已經啓動,Nacos Server 的安裝及啓動方式詳見:《Nacos系列:歡迎來到Nacos的世界!》
啓動Tomcat,觀察Console控制檯
20:50:13.646 [RMI TCP Connection(5)-127.0.0.1] WARN com.alibaba.nacos.spring.core.env.AnnotationNacosPropertySourceBuilder - There is no content for NacosPropertySource from dataId[nacos.spring.config] , groupId[DEFAULT_GROUP] , properties[{encode=${nacos.encode:UTF-8}, namespace=${nacos.namespace:}, contextPath=${nacos.context-path:}, endpoint=${nacos.endpoint:}, serverAddr=${nacos.server-addr:}, secretKey=${nacos.secret-key:}, accessKey=${nacos.access-key:}, clusterName=${nacos.cluster-name:}}]. 20:50:17.825 [RMI TCP Connection(5)-127.0.0.1] INFO com.alibaba.nacos.spring.context.event.LoggingNacosConfigMetadataEventListener - Nacos Config Metadata : dataId='nacos.spring.config', groupId='DEFAULT_GROUP', beanName='nacosConfig', bean='null', beanType='class com.learn.nacos.NacosConfig', annotatedElement='null', xmlResource='null', nacosProperties='{serverAddr=127.0.0.1:8848, encode=UTF-8}', nacosPropertiesAttributes='{encode=${nacos.encode:UTF-8}, namespace=${nacos.namespace:}, contextPath=${nacos.context-path:}, endpoint=${nacos.endpoint:}, serverAddr=${nacos.server-addr:}, secretKey=${nacos.secret-key:}, accessKey=${nacos.access-key:}, clusterName=${nacos.cluster-name:}}', source='org.springframework.core.type.classreading.AnnotationMetadataReadingVisitor@66e4d430', timestamp='1550753413647'
咱們先經過http://127.0.0.1:8080/config?dataId=nacos.spring.config&content=useLocalCache=true
發佈一個dataId爲nacos.spring.config
且配置內容爲useLocalCache=true
的配置集,觀察Nacos控制檯的變化
再經過http://127.0.0.1:8080/config/get
讀取配置
而後在Nacos控制檯將useLocalCache
的值改成false
,併發布配置
再次訪問http://127.0.0.1:8080/config/get
添加 Starter 依賴:
<dependency> <groupId>com.alibaba.boot</groupId> <artifactId>nacos-config-spring-boot-starter</artifactId> <version>0.2.1</version> </dependency>
注意:版本 0.2.x.RELEASE 對應的是 Spring Boot 2.x 版本,版本 0.1.x.RELEASE 對應的是 Spring Boot 1.x 版本。
在application.properties
中添加以下配置信息:
nacos.config.server-addr=127.0.0.1:8848
添加NacosConfigApplication啓動類
@SpringBootApplication @NacosPropertySource(dataId = "nacos.springboot.config", autoRefreshed = true) public class NacosConfigApplication { public static void main(String[] args) { SpringApplication.run(NacosConfigApplication.class, args); } }
若是你看過個人上一篇文章:《Nacos系列:基於Nacos的註冊中心》,那麼你應該知道 Spring Boot 實現方式和 Spring 的沒太大差異,因此我就再也不細說了,請參考個人示例源碼或者官網資料學習。
這裏說下我在學習過程當中遇到的一個問題,在application.properties
添加配置文件的時候,不當心將nacos.config.server-addr
寫成了nacos.discovery.server-addr
,結果啓動項目時,一直報錯:
ERROR 9028 --- [ main] o.s.b.d.LoggingFailureAnalysisReporter : ------ APPLICATION FAILED TO START ------ Description: client error: invalid param. null Action: please check your client configuration
剛開始一直找不到緣由,後面對着官網代碼示例複覈,才發現是配置問題致使的,呵呵噠,本身給本身挖坑。
我挺喜歡Nacos
的,既能作服務發現和管理,又能作配置管理,這二者本質沒多大區別,Nacos
把這二者統一塊兒來,一箭雙鵰,我以爲沒什麼很差,要否則你引入了Zookeeper
做爲註冊中心,還要引入Apollo
做爲配置中心,無故增長學習成本。就像以前聽音樂,我通常用網易雲音樂就好,後面由於搞了版權的事,不得不下載了蝦米和QQ音樂,我就聽個歌而已,手機裏裝了三個APP,你說,這叫什麼事兒?
learn-nacos-spring-config
learn-nacos-springboot-config
代碼已上傳至碼雲
和Github
上,歡迎下載學習