SpringCloud工程可以使用Nacos作為註冊中心和配置中心,配置和使用非常簡單,本文將簡單介紹使用方式,並分析其實現方式。 SpringCloud工程集成Nacos SpringCloud工程使用Nacos非常簡單,只需要引入依賴、編寫配置參數、在啟動類上添加註解即可。 引入依賴 <depe ...
SpringCloud工程可以使用Nacos作為註冊中心和配置中心,配置和使用非常簡單,本文將簡單介紹使用方式,並分析其實現方式。
SpringCloud工程集成Nacos
SpringCloud工程使用Nacos非常簡單,只需要引入依賴、編寫配置參數、在啟動類上添加註解即可。
引入依賴
<dependencyManagement>
<dependencies>
<!-- Spring Cloud -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>Hoxton.SR9</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<!-- Spring Cloud Alibaba -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-dependencies</artifactId>
<version>2.2.5.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<dependencies>
<!-- Nacos -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
</dependencies>
bootstrap.yml配置文件
spring:
application:
name: xx-service
profiles:
active: dev
cloud:
nacos:
discovery:
server-addr: localhost:8848
config:
prefix: ${spring.application.name}
file-extension: yml
group: DEFAULT_GROUP
server-addr: localhost:8848
extension-configs:
- data-id: base-config-${spring.profiles.active}.yml
group: DEFAULT_GROUP
refresh: true
- data-id: resource-config-${spring.profiles.active}.yml
group: DEFAULT_GROUP
refresh: true
配置中心源碼分析
配置中心集成的源碼在spring-cloud-starter-alibaba-nacos-config工程中。
spring.factories文件
# Configuration配置類
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
# 這裡是Nacos擴展的支持json和xml的PropertySourceLoader
org.springframework.boot.env.PropertySourceLoader=\
com.alibaba.cloud.nacos.parser.NacosJsonPropertySourceLoader,\
com.alibaba.cloud.nacos.parser.NacosXmlPropertySourceLoader
NacosConfigBootstrapConfiguration
裝配NacosConfigProperties、NacosConfigManager、NacosPropertySourceLocator等組件:
- NacosConfigProperties - 封裝spring.cloud.nacos.config配置參數
- NacosConfigManager - 用於獲取ConfigService對象
- NacosPropertySourceLocator - 用於載入配置封裝PropertySource
註冊中心源碼分析
註冊中心集成的源碼在spring-cloud-starter-alibaba-nacos-discovery工程中。
spring.factories文件
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
com.alibaba.cloud.nacos.discovery.NacosDiscoveryAutoConfiguration,\
com.alibaba.cloud.nacos.ribbon.RibbonNacosAutoConfiguration,\
com.alibaba.cloud.nacos.endpoint.NacosDiscoveryEndpointAutoConfiguration,\
com.alibaba.cloud.nacos.registry.NacosServiceRegistryAutoConfiguration,\
com.alibaba.cloud.nacos.discovery.NacosDiscoveryClientConfiguration,\
com.alibaba.cloud.nacos.discovery.reactive.NacosReactiveDiscoveryClientConfiguration,\
com.alibaba.cloud.nacos.discovery.configclient.NacosConfigServerAutoConfiguration,\
com.alibaba.cloud.nacos.NacosServiceAutoConfiguration
org.springframework.cloud.bootstrap.BootstrapConfiguration=\
com.alibaba.cloud.nacos.discovery.configclient.NacosDiscoveryClientConfigServiceBootstrapConfiguration
NacosDiscoveryClientConfigServiceBootstrapConfiguration
import了幾個其他的配置類:
- NacosDiscoveryAutoConfiguration.class
- NacosServiceAutoConfiguration.class
- NacosDiscoveryClientConfiguration.class
- NacosReactiveDiscoveryClientConfiguration.class
NacosDiscoveryAutoConfiguration
裝配NacosDiscoveryProperties、NacosServiceDiscovery組件。
NacosServiceDiscovery類:用於獲取註冊中心的服務和實例。
RibbonNacosAutoConfiguration
@Configuration(proxyBeanMethods = false)
@EnableConfigurationProperties
@ConditionalOnBean(SpringClientFactory.class)
@ConditionalOnRibbonNacos
@ConditionalOnNacosDiscoveryEnabled
@AutoConfigureAfter(RibbonAutoConfiguration.class)
// 使用NacosRibbonClientConfiguration裝配NacosServerList
// NacosServerList用於獲取註冊到Nacos上的指定service的服務實例列表
@RibbonClients(defaultConfiguration = NacosRibbonClientConfiguration.class)
public class RibbonNacosAutoConfiguration {
}
RibbonClients註解導入RibbonClientConfigurationRegistrar類,支持組合多個RibbonClient註解。
RibbonClientConfigurationRegistrar類會解析RibbonClients和RibbonClient註解,將相關配置類註入到registry中。
NacosDiscoveryEndpointAutoConfiguration
裝配NacosDiscoveryEndpoint和NacosDiscoveryHealthIndicator組件:
- NacosDiscoveryEndpoint - 用於獲取Nacos配置參數和訂閱的服務
- NacosDiscoveryHealthIndicator - 健康檢查
NacosServiceRegistryAutoConfiguration
裝配以下組件:
-
NacosServiceRegistry
實現了ServiceRegistry介面,用於服務註冊、服務下線
-
NacosRegistration
封裝服務實例信息:instanceId、serviceId、host、port和metadata等信息
-
NacosAutoServiceRegistration
- 將服務註冊到Nacos註冊中心,內部維護NacosServiceRegistry和NacosRegistration組件
- 繼承了AbstractAutoServiceRegistration抽象類,其register用於註冊服務
- AbstractAutoServiceRegistration實現了ApplicationListener介面,監聽WebServerInitializedEvent事件,在事件發生時做服務註冊
NacosDiscoveryClientConfiguration
裝配NacosDiscoveryClient和NacosWatch組件。