<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12

      程序員你是如何使用Nacos作為配置中心的?

      file

      假如你使用的是spring-cloud-alibaba微服務(wù)技術(shù)棧

      單個(gè)服務(wù)獨(dú)有配置文件

      即去除應(yīng)用程序的狀態(tài),配置統(tǒng)一外部化管理,方便進(jìn)行水平的伸縮。

      集成步驟:

      假如我有一個(gè)應(yīng)用app-design;

      1,引入依賴:

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

      2, 配置文件;

      spring.cloud.nacos.config.enabled=true
      spring.cloud.nacos.config.refresh-enabled=true
      
      spring.cloud.nacos.config.server-addr=${spring.cloud.nacos.discovery.server-addr}
      spring.cloud.nacos.config.namespace=${spring.cloud.nacos.discovery.namespace}
      

      說(shuō)明如下:

      屬性 說(shuō)明
      spring.cloud.nacos.config.server-addr=$ nacos配置中心地址
      spring.cloud.nacos.config.namespace=$ nacos的命名空間,這里跟服務(wù)發(fā)現(xiàn)的配置一致;

      3,使用配置的方式,同本地配置文件一樣。

      @Value @PropertyConfiguration 這些注解都是支持的;

      4,確認(rèn)方式,比如把之前的application.properties的配置放到了配置中心;

      image.png

      本地啟動(dòng)的時(shí)候,讀取到了8081端口和數(shù)據(jù)庫(kù)連接池的配置;

      image.png

      配置中心的連接原理,后面單獨(dú)整理出來(lái),知其然并知其所以然。

      服務(wù)之間共享配置文件

      場(chǎng)景:多個(gè)后端微服務(wù),在同一個(gè)集群中共用中間件的配置信息。

      比如 緩存redis, 消息隊(duì)列kafka, 文件服務(wù)器, 郵件服務(wù)器;

      那么對(duì)應(yīng)的配置文件沒(méi)有必要在所有的后端微服務(wù)中單獨(dú)存在,這些配置文件應(yīng)該放在公共配置文件中,但是也可以被具體的后端微服務(wù)自己的獨(dú)有配置文件覆蓋,使用自己的私有配置;

      可結(jié)合下圖理解:

      問(wèn)題 回答
      where are we?現(xiàn)狀 中間件配置分散在很多服務(wù)中,配置繁瑣,不方便統(tǒng)一管理
      where are we go?目的 同一個(gè)集群的中間件只維護(hù)一份,各服務(wù)共享,也可按照需要覆蓋共享的配置;
      how can we go there?實(shí)現(xiàn)路徑 基于nacos已有功能實(shí)現(xiàn)

      下面是實(shí)際的coding過(guò)程和測(cè)試用例;

      服務(wù)app-file;

      在服務(wù)對(duì)應(yīng)的nacos的namespace中

      1 引入共享配置

      #共享中間件的配置
      spring.cloud.nacos.config.shared-configs[0].data-id=mid.properties
      spring.cloud.nacos.config.shared-configs[0].group=DEFAULT_GROUP
      spring.cloud.nacos.config.shared-configs[0].refresh=true
      

      位置: 模塊start下的src/main/resources/bootstrap.properties文件中

      自描述的配置信息,即引入的共享配置文件列表有哪些,可以按照需要,配置各種中間件的配置信息;

      key 說(shuō)明
      data-id _the data id of extended configuration 配置文件名稱,帶上后綴;翻譯:擴(kuò)展配置文件的數(shù)據(jù)id
      group _the group of extended configuration, the default value is DEFAULT_GROUP 集群名稱, 從名字來(lái)看,支持多集群的配置文件 翻譯:擴(kuò)展配置文件的集群,默認(rèn)值是 DEFAULT_GROUP
      refresh _whether to support dynamic refresh, the default does not support 是否刷新 翻譯:是否支持動(dòng)態(tài)刷新,默認(rèn)不支持

      花括號(hào)[0] ,里面的0是序號(hào),如果有多個(gè),按照數(shù)字自增順序進(jìn)行配置;

      2 在nacos中新增配置文件

      根據(jù)實(shí)際場(chǎng)景在nacos的test命名空間中新增配置文件mid.properties

      image.png

      3 獲取配置用例測(cè)試

      測(cè)試接口代碼:

       @ApiOperation("測(cè)試獲取公共配置文件")
          @GetMapping("/config/test")
          public Response config(){
              String redisConfigServers = environment.getProperty("redis.config.servers","null");
              return SingleResponse.of(redisConfigServers);
          }
      

      測(cè)試用例:

      場(chǎng)景 期望結(jié)果 實(shí)際結(jié)果 是否符合預(yù)期
      獲取共享配置文件中的配置 r-wz9sp7dhxjnz16bs1jzhutj.redis.rds.aliyuncs.com:6379 r-wz9sp7dhxjnz16bs1jzhutj.redis.rds.aliyuncs.com:6379
      在服務(wù)獨(dú)有app-file.properties配置中重寫配置redis.config.servers=r-wz9sp7dhxjnz16bs1jzhutj.redis.rds.aliyuncs.com:637905 r-wz9sp7dhxjnz16bs1jzhutj.redis.rds.aliyuncs.com:637905 r-wz9sp7dhxjnz16bs1jzhutj.redis.rds.aliyuncs.com:637905

      截圖如下:

      image.png

      image.png

      image.png

      源碼分析

      掌握用法之后,深入分析源碼,知其然而知其所以然;

      starter調(diào)用封裝

      使用的starter封裝;

      https://github.com/alibaba/spring-cloud-alibaba/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-nacos-config

      版本: 2.2.1.RELEASE

      啟動(dòng)的時(shí)候自動(dòng)裝配的配置如下:

      org.springframework.cloud.bootstrap.BootstrapConfiguration=\
      com.alibaba.cloud.nacos.NacosConfigBootstrapConfiguration
      
      org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
      com.alibaba.cloud.nacos.NacosConfigAutoConfiguration,\
      com.alibaba.cloud.nacos.endpoint.NacosConfigEndpointAutoConfiguration
      
      org.springframework.boot.diagnostics.FailureAnalyzer=\
      com.alibaba.cloud.nacos.diagnostics.analyzer.NacosConnectionFailureAnalyzer
      

      分解一下key,看一下用途:

      key 說(shuō)明
      org.springframework.cloud.bootstrap.BootstrapConfiguration A marker interface used as a key in META-INF/spring.factories. Entries in* the factories file are used to create the bootstrap application context.

      翻譯:一個(gè)標(biāo)記注解用來(lái)作為key 放在META-INF/spring.factories文件中,文件中的條目用來(lái)創(chuàng)建啟動(dòng)應(yīng)用的上下文;

      來(lái)源:spring-cloud-context-version.jar

      value:

      com.alibaba.cloud.nacos.NacosConfigBootstrapConfiguration |
      | org.springframework.boot.autoconfigure.EnableAutoConfiguration | 注釋太長(zhǎng)了,不放這里.放到附錄中。

      來(lái)源:spring-boot-autoconfigure-version.jar

      com.alibaba.cloud.nacos.NacosConfigAutoConfiguration,\

      com.alibaba.cloud.nacos.endpoint.NacosConfigEndpointAutoConfiguration |
      | org.springframework.boot.diagnostics.FailureAnalyzer | A {@code FailureAnalyzer} is used to analyze a failure and provide diagnostic* information that can be displayed to the user.

      _

      翻譯: FailureAnalyzer用來(lái)分析錯(cuò)誤并提供診斷信息展示給到用戶

      來(lái)源: spring-boot-version.jar

      com.alibaba.cloud.nacos.diagnostics.analyzer.NacosConnectionFailureAnalyzer |

      然后看看都自動(dòng)裝配了什么?以及自動(dòng)裝配的過(guò)程。

      springboot的方式調(diào)用;

      1 NacosConfigBootstrapConfiguration

      源碼:

      package com.alibaba.cloud.nacos;
      
      import com.alibaba.cloud.nacos.client.NacosPropertySourceLocator;
      
      import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
      import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
      import org.springframework.context.annotation.Bean;
      import org.springframework.context.annotation.Configuration;
      
      /**
       * @author xiaojing
       */
      @Configuration(proxyBeanMethods = false)
      @ConditionalOnProperty(name = "spring.cloud.nacos.config.enabled", matchIfMissing = true)
      public class NacosConfigBootstrapConfiguration {
      
      	@Bean
      	@ConditionalOnMissingBean
      	public NacosConfigProperties nacosConfigProperties() {
      		return new NacosConfigProperties();
      	}
      
      	@Bean
      	@ConditionalOnMissingBean
      	public NacosConfigManager nacosConfigManager(
      			NacosConfigProperties nacosConfigProperties) {
      		return new NacosConfigManager(nacosConfigProperties);
      	}
      
      	@Bean
      	public NacosPropertySourceLocator nacosPropertySourceLocator(
      			NacosConfigManager nacosConfigManager) {
      		return new NacosPropertySourceLocator(nacosConfigManager);
      	}
      
      }
      

      自動(dòng)裝配流程:

      配置文件組裝源碼:

      @Override
      	public PropertySource<?> locate(Environment env) {
      		nacosConfigProperties.setEnvironment(env);
      		ConfigService configService = nacosConfigManager.getConfigService();
      
      		if (null == configService) {
      			log.warn("no instance of config service found, can't load config from nacos");
      			return null;
      		}
      		long timeout = nacosConfigProperties.getTimeout();
      		nacosPropertySourceBuilder = new NacosPropertySourceBuilder(configService,
      				timeout);
      		String name = nacosConfigProperties.getName();
      
      		String dataIdPrefix = nacosConfigProperties.getPrefix();
      		if (StringUtils.isEmpty(dataIdPrefix)) {
      			dataIdPrefix = name;
      		}
      
      		if (StringUtils.isEmpty(dataIdPrefix)) {
      			dataIdPrefix = env.getProperty("spring.application.name");
      		}
      
      		CompositePropertySource composite = new CompositePropertySource(
      				NACOS_PROPERTY_SOURCE_NAME);
      
      		loadSharedConfiguration(composite);
      		loadExtConfiguration(composite);
      		loadApplicationConfiguration(composite, dataIdPrefix, nacosConfigProperties, env);
      
      		return composite;
      	}
      

      加載應(yīng)用配置文件的順序源碼:

      private void loadApplicationConfiguration(
      			CompositePropertySource compositePropertySource, String dataIdPrefix,
      			NacosConfigProperties properties, Environment environment) {
      		String fileExtension = properties.getFileExtension();
      		String nacosGroup = properties.getGroup();
      		// load directly once by default
      		loadNacosDataIfPresent(compositePropertySource, dataIdPrefix, nacosGroup,
      				fileExtension, true);
      		// load with suffix, which have a higher priority than the default
      		loadNacosDataIfPresent(compositePropertySource,
      				dataIdPrefix + DOT + fileExtension, nacosGroup, fileExtension, true);
      		// Loaded with profile, which have a higher priority than the suffix
      		for (String profile : environment.getActiveProfiles()) {
      			String dataId = dataIdPrefix + SEP1 + profile + DOT + fileExtension;
      			loadNacosDataIfPresent(compositePropertySource, dataId, nacosGroup,
      					fileExtension, true);
      		}
      
      	}
      

      順序如下:

      序號(hào) 說(shuō)明
      1 加載dataIdPrefix對(duì)應(yīng)的配置文件
      2 加載dataIdPrefix.fileExtension對(duì)應(yīng)的配置文件
      3 加載 dataIdPrefix-activeProfiles.fileExtension對(duì)應(yīng)的配置文件

      2.1 NacosConfigAutoConfiguration

      序號(hào) 說(shuō)明
      1 NacosConfigProperties  nacos配置
      2 NacosRefreshProperties  已經(jīng)不建議被使用
      3 NacosRefreshHistory  刷新歷史
      4 NacosConfigManager 配置
      5 NacosContextRefresher 注冊(cè)nacos的監(jiān)聽(tīng)器到應(yīng)用

      2.2 NacosConfigEndpointAutoConfiguration

      NacosConfigEndpoint

      本地配置同步邏輯

      	@ReadOperation
      	public Map<String, Object> invoke() {
      		Map<String, Object> result = new HashMap<>(16);
      		result.put("NacosConfigProperties", properties);
      
      		List<NacosPropertySource> all = NacosPropertySourceRepository.getAll();
      
      		List<Map<String, Object>> sources = new ArrayList<>();
      		for (NacosPropertySource ps : all) {
      			Map<String, Object> source = new HashMap<>(16);
      			source.put("dataId", ps.getDataId());
      			source.put("lastSynced", dateFormat.get().format(ps.getTimestamp()));
      			sources.add(source);
      		}
      		result.put("Sources", sources);
      		result.put("RefreshHistory", refreshHistory.getRecords());
      
      		return result;
      	}
      

      NacosConfigHealthIndicator

      健康檢查 UP,DOWN,UNKNOWN ;

      3 NacosConnectionFailureAnalyzer

      連接不上nacos服務(wù)端拋出異常

      @Override
      	protected FailureAnalysis analyze(Throwable rootFailure,
      			NacosConnectionFailureException cause) {
      		return new FailureAnalysis(
      				"Application failed to connect to Nacos server: \""
      						+ cause.getServerAddr() + "\"",
      				"Please check your Nacos server config", cause);
      	}
      

      小結(jié):服務(wù)通過(guò)集成該starter,通過(guò)http請(qǐng)求從nacos的服務(wù)端拉取配置數(shù)據(jù),并做了 配置刷新歷史,注冊(cè)監(jiān)聽(tīng)器到spring容器中, 本地緩存,和錯(cuò)誤報(bào)告;

      服務(wù)端封裝

      源碼位置:https://github.com/alibaba/nacos/tree/develop/config

      應(yīng)用啟動(dòng)讀取配置文件整體調(diào)用鏈:待后續(xù)完成;

      小結(jié)

      如果讀完本篇文章你只能記住一句話:nacos作為配置中心可為單獨(dú)的服務(wù)提供外部化配置文件,也支持多應(yīng)用共享配置文件。
      從nacos的客戶端源碼分析中可看到一些配置優(yōu)先級(jí)的順序。

      原創(chuàng)不易,關(guān)注誠(chéng)可貴,轉(zhuǎn)發(fā)價(jià)更高!轉(zhuǎn)載請(qǐng)注明出處,讓我們互通有無(wú),共同進(jìn)步,歡迎溝通交流。

      posted @ 2020-10-09 23:50  李福春  閱讀(1636)  評(píng)論(0)    收藏  舉報(bào)
      主站蜘蛛池模板: 国产在线98福利播放视频| 久久久久青草线综合超碰| 99久久伊人精品综合观看| 麻豆精品一区二区视频在线| 久久精品道一区二区三区| 亚洲色大成网站www久久九| 国产播放91色在线观看| 国产精品自产拍在线播放| av无码小缝喷白浆在线观看| 亚洲欧美日韩精品久久亚洲区| 亚洲av永久无码精品天堂久久| 亚洲人成色77777在线观看| 久久精品国产亚洲AⅤ无码| 久久精品人人做人人爽97| 最新精品国偷自产在线美女足| 日韩精品人妻中文字幕| 国99久9在线 | 免费| 亚洲一区二区三级av| 国产伦一区二区三区精品| 日本亚洲色大成网站www久久 | 武乡县| 亚洲av永久无码精品网站 | 亚洲精品无码久久一线| 天天综合色天天综合色h| 丁香婷婷激情俺也去俺来也| 国产午夜福利在线视频| 国产特级毛片AAAAAA视频| 国产l精品国产亚洲区 | 免费A级毛片樱桃视频| 在线精品另类自拍视频| 99在线精品视频观看免费| 国产精品线在线精品| 中文字幕有码日韩精品| 老湿机69福利区无码| 国产精品中出一区二区三区| 国产高清色高清在线观看| 久久精品免视看国产成人| 日韩精品久久不卡中文字幕| 四虎成人精品国产永久免费| 尤物yw193无码点击进入| 国产肥妇一区二区熟女精品|