说明 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" 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" namespace: "3887EBC8-CD24-4BF7-BACF-58643397C138" contextPath: "nacosx" 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;@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;@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 { @Inject private DemoDbConfig demoDbConfig; }
正确的方式是,把 CloudConfig 注解在属性上。
1 2 3 4 5 6 7 8 9 10 11 12 13 public class DemoController { @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 的配置后,再次调用接口配置会更新(这里没有截图)。
小结 在 Solon Cloud 中通过简单的配置就可以使用 Nacos 配置中心了。在实际的使用过程中注意区分@Inject 和@CloudConfig 的不同,一个是针对key来的,一个是针对dataId来的。为了减少自己在开发过程中的混乱(有时过多的选择不是一件好事情),可以约定使用 load 的方式加载多个配置文件,使用 @Inject 的方式进行注入后使用。