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
。
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 配置中心。
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 ,可以根据实际的需要进行配置。
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
。
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
的方式进行注入使用对应的配置。
@Api("配置管理")
@Controller
@Mapping("/config")
public class DemoController {
@Inject private AppConfig appConfig;
}
获取配置文件根据 dataId 获取配置,通过 @CloudConfig
进行注入。CloudConfig 暂时不支持注解的类上,也就是不能使用如下的方法配合 @Inject 进行注入。
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 暂时暂时不到值的。
@Api("配置管理")
@Controller
@Mapping("/config")
public class DemoController {
/** 获取dataId的配置,获取不到值 */
@Inject private DemoDbConfig demoDbConfig;
}
正确的方式是,把 CloudConfig 注解在属性上。
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 的配置后,再次调用接口配置会更新(这里没有截图)。
在 Solon Cloud 中通过简单的配置就可以使用 Nacos 配置中心了。在实际的使用过程中注意区分@Inject 和@CloudConfig 的不同,一个是针对key来的,一个是针对dataId来的。为了减少自己在开发过程中的混乱(有时过多的选择不是一件好事情),可以约定使用 load 的方式加载多个配置文件,使用 @Inject 的方式进行注入后使用。