摘要:殺只雞而已,你拿牛刀來做甚釋義小團隊小項目選擇簡單的配置管理方式就好了,要什么配置中心,純屬沒事找事。,我就啰嗦到這里吧,下面正式介紹作為配置中心是怎么使用的。
前言
在看正文之前,我想請你回顧一下自己待過的公司都是怎么管理配置的,我想應該會有以下幾種方式:
1、硬編碼
沒有什么配置不配置的,直接寫在代碼里面,比如使用常量類
優勢:對開發友好,開發清楚地知道代碼需要用到什么配置
劣勢:涉及秘鑰等敏感配置直接暴露給開發人員,不安全;如果想修改配置必須重新發版,比較麻煩
2、外部化配置文件
Spring項目經常會在resoures目錄下放很多配置文件,各個環境對應不同的配置文件,通過SVN管理
優勢:配置文件外部化,支持多環境配置管理,修改配置只需重啟服務,無需發版
劣勢:系統龐大時,配置文件很多,多人開發,配置格式不統一,維護麻煩;敏感配置不需要暴露給開發人員,降低風險,但開發經常要和運維溝通怎么修改配置,溝通不恰當容易引發生產事故;而且,如果應用部署在多臺機器,對運維來說,修改配置也是非常頭疼的事情(當然也可以引入NFS系統來解決一部分問題)
3、數據庫
配置信息存儲在數據庫中,靈活修改
優勢:可以靈活管理配置,無需重啟服務
劣勢:界面不友好,配置沒有版本管理,一旦出現問題,回滾或定位問題都比較麻煩;此外,數據庫必須要保證高可用,避免因此而造成生產故障
4、配置中心
微服務基礎架構體系中的一個不可或缺的基礎組件
優勢:集中化管理,敏感配置可控;多版本存儲,方便追溯;界面友好,修改配置一鍵發布;即使面對多集群也能從容應對,十分淡定
劣勢:引入組件,增加系統風險;如果是中途切換成配置中心,也會增加研發接入成本;配置中心也需要保證高可用,否則容易造成大面積影響
以上幾種管理配置文件的方式,我想都會有公司在用,不要因為配置中心有諸多優點,就盲目引進項目中,我覺得應該遵守以下兩個原則:
做人做事,要知道自己幾斤幾兩
</>復制代碼
釋義:沒深入研究過的技術,就不要隨便拿到公司項目中來試水啦,恐怕到時候坑夠你填的,要不然就是你有信心玩得轉它。
殺只雞而已,你拿牛刀來做甚?
</>復制代碼
釋義:小團隊小項目選擇簡單的配置管理方式就好了,要什么配置中心,純屬沒事找事。
總而言之,我們必須從實際出發,實事求是,選擇適合自己的技術棧。
關于為什么需要有配置中心,我推薦一篇文章給你看,講得比較透徹:《微服務架構為什么需要配置中心?》
另外,我覺得對開發本身來說,是寧愿自己管理自己代碼的配置的,交給運維總是會有各種各樣的問題,至于敏感配置,說實話,開發人員要真想做點“壞事”,那攔得住嗎?但是,從公司的角度來講,把服務器的配置管理交給運維同事是符合常理的,系統需要穩定且安全地運行,這是對客戶的負責,從這一方面去思考,這么做是合情合理的。
Okay,我就啰嗦到這里吧,下面正式介紹Nacos作為配置中心是怎么使用的。
Nacos 結合 Spring添加 maven 依賴:
</>復制代碼
com.alibaba.nacos
nacos-spring-context
${nacos-spring-context.version}
使用 @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 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("Success", HttpStatus.OK);
}
return new ResponseEntity("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
Nacos 結合 Spring Boot添加 Starter 依賴:
</>復制代碼
com.alibaba.boot
nacos-config-spring-boot-starter
0.2.1
</>復制代碼
注意:版本 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,你說,這叫什么事兒?
示例源碼Nacos + Spring :learn-nacos-spring-config
Nacos + Spring Boot : learn-nacos-springboot-config
代碼已上傳至碼云和Github上,歡迎下載學習
Gitee
Github
參考資料微服務架構為什么需要配置中心?
Nacos Spring 快速開始
Nacos Spring Boot 快速開始
SpringBoot使用Nacos配置中心
Spring Cloud Alibaba基礎教程:使用Nacos作為配置中心
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/73358.html
摘要:在上面這個例子中,沃爾瑪就是服務提供者,小明和小新是服務消費者,微信公眾號類似于注冊中心,沃爾瑪將服務發布到注冊中心,小明和小新作為消費者,訂閱注冊中心上沃爾瑪提供的服務,通過微信公眾號,沃爾瑪服務方和小明小新消費方就解耦了。 前言 所謂注冊中心,其實是分布式架構演進過程中的產物,在系統中充當一個協調者的角色。但是,為什么需要這樣一個協調者的角色呢?我們先來看一個例子,以便理解為什么分...
摘要:數據源內嵌的數據庫,通過命令直接啟動即可,無需額外安裝。參考資料部署手冊集群部署說明推薦閱讀系列歡迎來到的世界系列基于的注冊中心系列基于的配置中心系列的使用 三種部署模式 Nacos支持三種部署模式 1、單機模式:可用于測試和單機使用,生產環境切忌使用單機模式(滿足不了高可用) 2、集群模式:可用于生產環境,確保高可用 3、多集群模式:可用于多數據中心場景 單機模式 啟動 Nacos ...
摘要:發布配置支持程序自動發布配置,創建和修改配置使用同一個方法,配置不存在則創建配置已存在則更新。示例源碼項目代碼已上傳至碼云和上,歡迎下載學習參考資料用戶指南的推薦閱讀系列歡迎來到的世界系列基于的注冊中心系列基于的配置中心 Maven依賴 Nacos提供完整的Java SDK,便于配置管理和服務發現及管理,以 Nacos-0.8.0 版本為例 添加Maven依賴: com.al...
摘要:元數據數據如配置和服務描述信息,如服務版本權重容災策略負載均衡策略鑒權配置各種自定義標簽,從作用范圍來看,分為服務級別的元信息集群的元信息及實例的元信息。 什么是Nacos? Nacos 是構建以服務為中心的現代應用架構 (例如微服務范式、云原生范式) 的服務基礎設施。 Nacos可以做什么? 1、動態配置服務:支持以中心化、外部化和動態化的方式管理所有環境的配置。動態配置消除了配置變...
閱讀 2927·2021-11-23 09:51
閱讀 3171·2021-11-12 10:36
閱讀 3209·2021-09-27 13:37
閱讀 3160·2021-08-17 10:15
閱讀 2590·2019-08-30 15:55
閱讀 2754·2019-08-30 13:07
閱讀 796·2019-08-29 16:32
閱讀 2650·2019-08-26 12:00
极致性价比!云服务器续费无忧!
Tesla A100/A800、Tesla V100S等多种GPU云主机特惠2折起,不限台数,续费同价。
NVIDIA RTX 40系,高性价比推理显卡,满足AI应用场景需要。
乌兰察布+上海青浦,满足东推西训AI场景需要