<a href="/article/family-solon-cloud-config">生态 / Solon Cloud Config [传送]</a>

### 1、情况简介

分布式配置服务，也可叫云端配置服务。

* 主要通过 CloudConfigService 接口进行适配
* 使用 CloudClient.config() 获取适配实例
* 一般通过通过配置和 @CloudConfig 注解进行使用

目前适配有：local, water, consul, nacos, zookeeper, polaris 等

### 2、简单演示

#### 2.1、配置

```yaml
solon.app:
  group: "demo" #同时也会做为配置分组
  name: "demoapp"  

solon.cloud.water:
  server: "waterapi:9371"
  config:
    load: "demoapp.yml,demo2:test-ds" #默认加载一个配置到应用属性。多个以','隔开，跨分组时用{group:key}格式
```

#### 2.2、注入配置

通过 config.load 加载的配置会直接转到 Solon.cfg()，做为应用配置的一个部分，<mark>且会实时同步配置变更（可能会晚几秒）</mark>。可用 `@Inject` 注入。

另外，也可使用 `@CloudConfig` 直接注解配置块。

```java
@Configuration
public class Config {
    //由 config.load 加载的配置，会到应用属性里
    @Inject("${demo.user}")
    UserModel userModel;

    //注入用户名
    @CloudConfig("demo-user-name") 
    String userName;
    
    //注入并转为数据源
    @Bean
    public DataSource ds(@CloudConfig("demo-ds") HikariDataSource ds){
        return ds;
    }
}
```

#### 2.3、使用接口手动获取，一般不用（太原生了）

```java
Config cfg = CloudClient.config().pull("demo-user-name"); //使用 {solon.app.group} 组
Config cfg = CloudClient.config().pull("demo2","demo-user-name");
```


#### 2.4、通过订阅配置变更

```java
//配置订阅：关注配置的实时更新
@CloudConfig("demoDb")
public class TestConfigHandler implements CloudConfigHandler {
    @Override
    public void handler(Config config) {

    }
}
```



### 3、@CloudConfig 与 @Inject 的区别（以 naocs  为例）

* 区别

| 注解 |  说明 | 
| -------- | -------- | 
| `@CloudConfig("dataId")`     | 对应的是 dataId     | 
| `@Inject("{prop-name}")`     | 对应的是 Solon.cfg() 里的配置     | 

* "config.load" 配置的作用

可以把 dataId 对应的配置，加载到 Solon.cfg()。从而可以使用 @Inject 注入配置。


### 4、会自动更新的配置

* "config.load" 配置的 key
* "@CloudConfig(autoRefreshed = true)  " 注入的 key
* "@CloudConfig CloudConfigHandler" 订阅的 key

**代码演示：**

[https://gitee.com/noear/solon-examples/tree/main/9.Solon-Cloud](https://gitee.com/noear/solon-examples/tree/main/9.Solon-Cloud)