CrazyAirhead

疯狂的傻瓜,傻瓜也疯狂——傻方能执著,疯狂才专注!

0%

Solon Cloud —— 服务配置

说明

Nacos /nɑ:kəʊs/ 是 Dynamic Naming and Configuration Service的首字母简称,一个更易于构建云原生应用的动态服务发现、配置管理和服务管理平台。

接下来的服务配置和服务注册,我们使用的是 Nacos2。 需要自己部署好 Nacos2 ,具体内容可以参看 Nacos 的官网 https://nacos.io/docs/latest/quickstart/quick-start。

依赖

添加 nacos2 的依赖 org.noear:nacos2-solon-cloud-plugin

1
2
3
4
5
6
7
8
9
10
11
12
dependencies {
implementation platform(project(":demo-parent"))

implementation("org.noear:solon-web")
implementation("org.noear:solon-logging-logback")
implementation("org.noear:solon-openapi2-knife4j")
implementation("org.noear:nacos2-solon-cloud-plugin")

annotationProcessor("org.mapstruct:mapstruct-processor:${mapstructVersion}")

testImplementation("org.noear:solon-test-junit5")
}

配置

Nacos2 插件已经做了些默认值,所以我不需要过多的配置即可连接到 nacos 配置中心。

1
2
3
4
5
6
7
8
9
solon.app:
name: "demo-cloud-config"
# group: "DEFAULT_GROUP" # 默认值为 DEFAULT_GROUP
# namespace: "public" # 默认值为 public

solon.cloud.nacos:
server: "localhost:8848"
config:
load: "demo-cloud-config.yml"

load 使用group:dataId的格式加载配置配置文件,当加载的配置文件与 solon.app.group 配置的 group 一致时可以不用配置 group 的部分,也就是只需要 dataId 的部分即可。如果需要加载多个配置文件,使用逗号(,)分隔,加载多个配置文件通用配置特别有用,避免了在多个地方管理配置文件。

通过 load 加载的配置文件会进入 Solon.cfg() 成为应用配置,这样就可以通过 @Injtect 的方式进行注入。

以下是一份更详细的配置,内容来自官网 https://solon.noear.org/article/400 ,可以根据实际的需要进行配置。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
solon.app:
name: "demoapp"
group: "demo"
meta: #添加应用元信息(可选)
version: "v1.0.2"
author: "noear"
tags: "aaa,bbb,ccc" #添加应用标签(可选)

solon.cloud.nacos:
server: "localhost:8848,localhost:8847" #nacos 服务地址
namespace: "3887EBC8-CD24-4BF7-BACF-58643397C138" #nacos 命名空间
contextPath: "nacosx" #nacos 服务的上下文路径(可选)
username: "aaa"
password: "bbb"
config:
load: "demoapp.yml,group:test.yml" #加载配置到应用属性(多个以","隔开)
discovery:
clusterName: "DEFAULT"

获取配置

使用 nacos 的配置是期望获取统一的,动态的配置,所以这里开启自动刷新 autoRefreshed = true

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
package com.example.demo.solon.config;

import java.io.Serializable;
import lombok.Data;
import org.noear.solon.annotation.Configuration;
import org.noear.solon.annotation.Inject;

/**
* @author airhead
*/
@Configuration
@Inject(value = "${app}", autoRefreshed = true)
@Data
public class AppConfig implements Serializable {
private String appId;
private String appKey;
}

接下来就是通过 @Injtect 的方式进行注入使用对应的配置。

1
2
3
4
5
6
7
@Api("配置管理")
@Controller
@Mapping("/config")
public class DemoController {
@Inject private AppConfig appConfig;

}

获取配置文件

获取配置文件根据 dataId 获取配置,通过 @CloudConfig 进行注入。CloudConfig 暂时不支持注解的类上,也就是不能使用如下的方法配合 @Inject 进行注入。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
package com.example.demo.solon.config;

import java.io.Serializable;
import lombok.Data;
import org.noear.solon.annotation.Configuration;
import org.noear.solon.cloud.annotation.CloudConfig;

/**
* 通过类获取dataId的配置,暂不支持的。
*
* @author airhead
*/
@Configuration
@CloudConfig(value = "demo-db", autoRefreshed = true)
@Data
public class DemoDbConfig implements Serializable {
private String url;
private String username;
private String password;
}

@Inject 暂时暂时不到值的。

1
2
3
4
5
6
7
@Api("配置管理")
@Controller
@Mapping("/config")
public class DemoController {
/** 获取dataId的配置,获取不到值 */
@Inject private DemoDbConfig demoDbConfig;
}

正确的方式是,把 CloudConfig 注解在属性上。

1
2
3
4
5
6
7
8
9
10
11
12
13
public class DemoController {
/** 获取dataId的配置,获取不到值 */
@Inject private DemoDbConfig demoDbConfig;

@Inject private AppConfig appConfig;

@CloudConfig(value = "demo-db", autoRefreshed = true)
private Properties properties;

@CloudConfig(value = "demo-db", autoRefreshed = true)
private DemoDbConfig demoDbConfig2;

}

验证

通过 Swagger 测试可以正常获取到配置,并且修改 Nacos 的配置后,再次调用接口配置会更新(这里没有截图)。

img

小结

在 Solon Cloud 中通过简单的配置就可以使用 Nacos 配置中心了。在实际的使用过程中注意区分@Inject 和@CloudConfig 的不同,一个是针对key来的,一个是针对dataId来的。为了减少自己在开发过程中的混乱(有时过多的选择不是一件好事情),可以约定使用 load 的方式加载多个配置文件,使用 @Inject 的方式进行注入后使用。

欢迎关注我的其它发布渠道