大家好,我是哪吒。
在單體服務時代,關于配置信息,管理一套配置文件即可。
而拆分成微服務之后,每一個系統都會有自己的配置,并且都各不相同,有些配置還需要動態改變,以達到動態降級、切流量、擴縮容等目的。
在Spring Boot開發中,可以把配置項放到config文件中,把配置當代碼使用。比如:
public class AppConfig { public static final String static_SUCCESS_CODE = "0000"; public static final String static_ERROR_CODE = "0001";}
也可以通過@Value加載yaml配置文件中的配置。
@Componentpublic class HttpConfig { // 核心線程數 public static String config_CORE_POOL_SIZE; @Value("${async.corePoolSize}") public void setSaveUrl(String corePoolSize) { HttpConfig.config_CORE_POOL_SIZE = corePoolSize; }}
無論是將配置定義在代碼中,還是將配置寫在yaml配置文件中,都相當于把配置存在應用程序的本地。
如果想修改配置,就需要將在Linux服務器中部署的程序停止,然后手動修改其配置,再進行重啟。
如果修改的配置項較多,這也是一項容易出錯,而且繁瑣的事情,長期運維的小伙伴應該深有體會。
當時,我就在想,作為世界上使用人數最多的語言,更新一個配置,需要這么復雜嗎?
答案肯定不是的。
配置中心(Configuration Center)通常用于集中管理應用程序的配置信息。這些配置信息可以包括數據庫連接信息、外部服務地址、日志級別、超時設置等。配置中心可以提高應用部署的靈活性和可維護性。
程序啟動時,可以自動從配置中心拉取所需要的配置項,配置中心中配置有所改變時,同樣可以自動從配置中心拉取最新的配置信息,服務不需要重新發布。
項目的核心配置,需要熱更新的配置才有放到nacos管理的必要。基本不會變更的一些配置還是保存在微服務本地比較好。
Nacos采用的是Pull模式獲取服務端數據,客戶端采用長輪詢的方式定時的發起Pull請求,去檢查服務端配置信息是否發生了變化。
這種是最簡單的Nacos注冊中心,有若干個服務,都注冊到Nacos注冊中心,調用之前,先到Nacos獲取對應接口,然后進行實際的調用。
服務1和服務2和Nacos之間維護一個心跳關系,每5秒跳一次,頻率不能太快或者太慢,否者會嗝屁的。
也可以通過服務端主動注銷的方式,停止注冊。
服務1調用服務2時,服務1會通過定時任務到Nacos中獲取在線的服務,保證所調用的服務一直都是健康在線的狀態。
獲取到之后,用緩存將其保存起來,然后通過負載均衡器調用服務2,此時,將不再使用服務端的負載均衡Nginx了。
這些功能可以幫助降低分布式系統中管理配置信息的成本,降低因錯誤的配置信息變更帶來可用性下降甚至發生故障的風險。
配置中心的配置注冊通常包括以下步驟:
通過這種方式,配置中心實現了配置的統一管理和動態更新。服務提供者和消費者都可以通過配置中心來進行配置的注冊和獲取,大大提高了配置的靈活性和便利性。同時,也減少了因為手動配置錯誤而導致的問題,提高了系統的穩定性和可用性。
要通過Java代碼實現配置注冊到配置中心,你可以遵循以下步驟。這里繼續提供一個通用的示例代碼,以展示基本的流程和步驟。請注意,實際的代碼可能會因所使用的具體配置中心而有所不同。
import com.configcenter.sdk.ConfigCenterClient; import com.configcenter.sdk.exception.ConfigCenterException; import com.configcenter.sdk.model.Configuration; public class ConfigurationRegistration { public static void main(String[] args) { // 配置中心的服務器URL和認證令牌 String serverUrl = "configcenter_server_url"; String authToken = "your_auth_token"; // 創建配置對象 Configuration configuration = new Configuration(); configuration.setId("your_configuration_id"); configuration.setKey("your_configuration_key"); configuration.setValue("your_configuration_value"); // 可選:設置其他配置項屬性,如描述、標簽等 try { // 初始化配置中心的客戶端 ConfigCenterClient client = ConfigCenterClient.init(serverUrl, authToken); // 調用配置中心的注冊API boolean success = client.registerConfiguration(configuration); if (success) { System.out.println("配置注冊成功"); } else { System.out.println("配置注冊失敗"); } } catch (ConfigCenterException e) { System.out.println("配置注冊出現異常: " + e.getMessage()); e.printStackTrace(); } } }
在這個示例中:
配置中心的配置反注冊是指從配置中心中移除或注銷某個配置項的過程。當某個服務或應用不再需要使用某個配置項時,可以進行配置反注冊操作。這個操作通常通過配置中心提供的接口來完成,它會將指定的配置項從配置中心中刪除或標記為注銷狀態。
配置反注冊可以是手動觸發的,也可以是自動觸發的。
配置反注冊是配置中心的一個重要功能,它可以幫助管理員或開發者更好地管理配置項的生命周期,確保配置中心中的數據與實際應用需求保持一致。同時,通過反注冊不再需要的配置項,也可以減少配置中心的存儲空間和資源消耗。
要通過Java代碼實現配置反注冊,你需要使用配置中心提供的Java SDK或API。以下是一個示例代碼,展示了如何使用Java來實現配置反注冊。
import com.configcenter.sdk.ConfigCenterClient; import com.configcenter.sdk.exception.ConfigCenterException; public class ConfigurationDeregistration { public static void main(String[] args) { // 配置中心的服務器URL和認證令牌 String serverUrl = "configcenter_server_url"; String authToken = "your_auth_token"; // 初始化配置中心的客戶端 ConfigCenterClient client = ConfigCenterClient.init(serverUrl, authToken); // 配置項的ID String configurationId = "your_configuration_id"; try { // 調用配置中心的反注冊API boolean success = client.deregisterConfiguration(configurationId); if (success) { System.out.println("配置反注冊成功"); } else { System.out.println("配置反注冊失敗"); } } catch (ConfigCenterException e) { System.out.println("配置反注冊出現異常: " + e.getMessage()); e.printStackTrace(); } } }
在這個示例中:
通過配置中心的用戶界面和API接口,你可以方便地查看和管理配置項。
import com.configcenter.sdk.ConfigCenterClient; import com.configcenter.sdk.exception.ConfigCenterException; import com.configcenter.sdk.model.Configuration; public class ConfigurationViewer { public static void main(String[] args) { // 配置中心的服務器URL和認證令牌 String serverUrl = "configcenter_server_url"; String authToken = "your_auth_token"; // 配置項的ID或鍵(key) String configurationId = "your_configuration_id"; // 或者使用配置項的鍵(key)來獲取配置項,根據配置中心API的要求而定 // String configurationKey = "your_configuration_key"; try { // 初始化配置中心的客戶端 ConfigCenterClient client = ConfigCenterClient.init(serverUrl, authToken); // 調用配置中心的API接口獲取配置項 Configuration configuration = client.getConfiguration(configurationId); // 或者使用配置項的鍵(key)來獲?。? // Configuration configuration = client.getConfigurationByKey(configurationKey); // 輸出配置項的信息 if (configuration != null) { System.out.println("配置項ID: " + configuration.getId()); System.out.println("配置項鍵(key): " + configuration.getKey()); System.out.println("配置項值(value): " + configuration.getValue()); // 輸出其他配置項屬性,如描述、標簽等 } else { System.out.println("未找到配置項"); } } catch (ConfigCenterException e) { System.out.println("查看配置項出現異常: " + e.getMessage()); e.printStackTrace(); } } }
在上面的示例代碼中:
配置中心通常支持配置變更訂閱功能,允許應用程序或其他服務訂閱配置項的變更通知。當配置項發生變化時,配置中心會向訂閱者發送通知,以便訂閱者能夠及時獲取最新的配置項。
要通過Java代碼實現配置變更訂閱,你可以按照以下步驟進行操作:
下面是一個簡單的示例代碼,展示如何實現配置變更訂閱:
import com.configcenter.sdk.ConfigCenterClient; import com.configcenter.sdk.exception.ConfigCenterException; import com.configcenter.sdk.listener.ConfigurationChangeListener; import com.configcenter.sdk.model.Configuration; public class ConfigurationSubscriber { public static void main(String[] args) { // 初始化配置中心的客戶端(省略代碼) // 創建訂閱者類 ConfigurationChangeListener listener = new ConfigurationChangeListener() { @Override public void onConfigurationChanged(Configuration configuration) { // 處理配置項變更事件 System.out.println("配置項發生變化: " + configuration.getKey() + " = " + configuration.getValue()); // 在這里可以更新本地緩存、重新加載配置等 } }; try { // 創建訂閱請求對象(根據配置中心API的要求而定) // 指定你希望訂閱的配置項過濾條件,如配置項的鍵(key)或其他屬性 // 調用配置中心的訂閱方法 ConfigCenterClient client = ConfigCenterClient.init(serverUrl, authToken); client.subscribeToConfigurationChanges(filter, listener); } catch (ConfigCenterException e) { System.out.println("配置變更訂閱出現異常: " + e.getMessage()); e.printStackTrace(); } } }
最終,選擇微服務注冊中心是一個權衡的過程,需要根據自己的實際需求、技術棧、團隊熟悉度等因素進行綜合考慮。
在Eureka、Consul、Zookeeper和Nacos這幾個微服務注冊中心中,選擇最適合的一個取決于你的具體需求和環境。
最終的選擇應基于你的技術需求、團隊熟悉度和業務場景。
本文鏈接:http://www.www897cc.com/showinfo-26-27989-0.html實戰:Nacos配置中心的Pull原理,附源碼
聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。郵件:2376512515@qq.com
上一篇: .NET Core中生成二維碼和識別二維碼內容方法
下一篇: 帶你吃透Kafka的可靠性設計