Myosotis(勿忘我)是基于java开发的一款轻量化、高性能的动态配置中心,适用于各种中小型系统
客户端本不依赖任何框架,支持jdk8及以上的java环境,同时对spring和springboot有较好的支持
客户端特性:
- 轻量设计低占用
- 配置实时更新
- 客户端本地快照
- 像本地常量一样的使用体验
- Console
- 用户名/密码:myosotis/123456
/**
* spring启动之后,当MyosotisApplication容器中client的实例只有一个时,可不指定“namespace”属性,默认为该client的namespace
*/
@Myosotis(namespace = "defalut")
public class Constant {
/**
* 默认以属性名称查询配置
*/
@MyosotisValue
public static String configKey1;
/**
* 自动类型转换
*/
@MyosotisValue
public User user;
/**
* 指定configKey
*/
@MyosotisValue(configKey = "config_key2")
public static Map<String, String> configKey2;
/**
* 指定namepsace下的configKey
*/
@MyosotisValue(namespace = "default2", configKey = "config_key3")
public static Long configKey3;
/**
* 当配置为空时,指定默认值
*/
@MyosotisValue(defaultValue = "[1,2,3]")
public List<Long> configKey5;
}
pom.xml添加client依赖
<dependency>
<groupId>com.yhzdys</groupId>
<artifactId>myosotis-client</artifactId>
<version>${myosotis.version}</version>
</dependency>
MyosotisApplication application = new MyosotisApplication("http://127.0.0.1:7777");
MyosotisClient client = application.getClient("namespace");
String configValue = client.getString("configKey");
Long configValue = client.getLong("configKey");
Boolean configValue = client.getBoolean("configKey");
// 支持自定义ValueParser
? configValue = client.get("configKey", (configValue) -> {...});
User user = client.get("user", (configValue) -> {return JSON.parseObject(configValue, User.class)});
pom.xml添加spring依赖
<dependency>
<groupId>com.yhzdys</groupId>
<artifactId>myosotis-spring</artifactId>
<version>${myosotis.version}</version>
</dependency>
@Bean
public MyosotisApplication myosotisApplication() {
return new MyosotisApplication("http://127.0.0.1:7777");
}
@Bean
public MyosotisClient myosotisClient(MyosotisApplication application) {
return application.getClient("namespace");
}
/**
* 开启注解配置支持
*/
@Bean
public MyosotisValueAutoConfiguration myosotisValueAutoConfiguration() {
return new MyosotisValueAutoConfiguration();
}
pom.xml添加starter
<dependency>
<groupId>com.yhzdys</groupId>
<artifactId>myosotis-spring-boot-starter</artifactId>
<version>${myosotis.version}</version>
</dependency>
application.properties(yml)添加配置
myosotis.client.namespace=default
myosotis.server.address=http://127.0.0.1:7777
myosotis.server.serializeType=PROTOSTUFF
myosotis.server.enableSnapshot=true
myosotis.server.enableCompress=true
myosotis.server.compressThreshold=2048
Config config = new Config("http://127.0.0.1:7777");
// 自定义序列化协议,目前可支持JSON、AVRO、PROTOSTUFF(默认JSON)
config.serializeType(SerializeType.JSON);
// 开启本地快照保存(默认开启)
config.enableSnapshot(true);
// 开启服务端通信数据压缩(默认开启)
config.enableCompress(true);
// 数据传输压缩阈值,当数据流长度大于设定值时对数据进行压缩处理(默认2048)
config.compressThreshold(2048L);
MyosotisApplication application = new MyosotisApplication(config);
对最后一次获取到的服务端配置进行快照文件备份
使用config.enableSnapshotFile(true)开启本地快照备份功能(默认开启)
本地快照备份开启后,当服务端不可用时,会降级读取快照文件中的配置值并缓存,配置值为最后一次从服务端获取的有效配置
快照文件路径为:{user.home}/.myosotis/snapshot/{namespace}/{configKey}.snapshot
客户端提供两种事件订阅接口,分别为:
com.yhzdys.myosotis.event.listener.ConfigListener
com.yhzdys.myosotis.event.listener.NamespaceListener
ConfigListener提供单个命名空间下单个配置变动事件的订阅能力
NamespaceListener提供单个命名空间下所有配置变动事件的订阅能力(开启命名空间监听,客户端会在启动时缓存该命名空间下所有的配置信息,会增加一定的内存占用)
⚠️注意事项
1.客户端事件发布采用线程池异步调度,线程池默认最大线程数为Integer.MAX_VALUE,实际最大线程数由注册的Listener个数决定,使用时需合理控制listener数量!
具体实现参阅:com.yhzdys.myosotis.event.multicast.EventMulticaster
2.考虑到实际场景可能出现Listener处理事件耗时较长的情况,并且业务上往往只关心最新的配置;所以客户端将listener使用ActuatorWrapper进行二次封装来统一调度;在同一个配置的上一个事件未处理完成时,Actuator会丢弃最新事件之前的所有事件,以减少系统开支
举个例子:一个ConfigListener实例陆续收到了A、B、C、D 4个配置更新事件;由于一些原因,listener在处理事件A时消耗了较长时间,在listener处理事件A结束之前客户端又陆续收到了事件B、C、D,这时Actuator会抛弃B、C事件,当listener处理完事件A之后,再次收到的事件消息只有事件D!
具体实现参阅:com.yhzdys.myosotis.event.multicast.EventMulticaster.ActuatorWrapper
com.yhzdys.myosotis.event.multicast.actuator.ConfigEventActuator
com.yhzdys.myosotis.event.multicast.actuator.NamespaceEventActuator
import com.yhzdys.myosotis.entity.MyosotisEvent;
import com.yhzdys.myosotis.event.listener.ConfigListener;
/**
* 自定义你的配置监听器
*/
public class YourConfigListener implements ConfigListener {
public String namespace() {
return "返回你需要订阅的命名空间";
}
public String configKey() {
return "返回你所订阅的命名空间下的配置项";
}
public void handle(MyosotisEvent event) {
// TODO 开始处理配置事件
}
}
// 添加监听器到application
application.addConfigListener(new YourConfigListener());
import com.yhzdys.myosotis.entity.MyosotisEvent;
import com.yhzdys.myosotis.event.listener.NamespaceListener;
/**
* 自定义你的命名空间监听器
*/
public class YourNamespaceListener implements NamespaceListener {
public String namespace() {
return "返回你需要订阅的命名空间";
}
public void handle(MyosotisEvent event) {
// TODO 开始处理配置事件
}
}
// 添加监听器到application
application.addNamespaceListener(new YourNamespaceListener());
git clone https://github.com/yhzdys/myosotis.git
cd myosotis
mvn clean package -Dmaven.test.skip
cd target
在target目录下,获得myosotis-{version}.zip和myosotis-{version}.tar.gz 解压后的目录结构:
|bin
|- startup.sh 服务启动脚本
|- shutdown.sh 服务下线脚本
|application
|- myosotis-console.jar 控制台应用
|- myosotis-server.jar 服务端应用
|config
|- console.conf 控制台配置(console)
|- cluster.conf 集群配置(console)
|- datasource.conf 数据源配置(console&server)
|- server.conf 服务端配置(server)
|database
|- myosotis.db 内置数据库(sqlite3)
|support
|- mysql.sql MySQL DDL
|- nginx_*.conf nginx负载均衡配置参考
|README.md readme
./bin/startup.sh -c # 仅启动控制台
./bin/startup.sh -s # 仅启动服务端
./bin/startup.sh -a # 同时启动服务端和控制台
# 控制台访问 http://ip:port/console/index.html
# JVM参数可在startup.sh中调整,变量名为:CONSOLE_JAVA_OPT、SERVER_JAVA_OPT
./bin/shutdown.sh -c # 只关闭控制台
./bin/shutdown.sh -s # 只关闭服务端
./bin/shutdown.sh -a # 同时关闭控制台和服务端
server集群配置,myosotis-console启动时读取并加载,用于集群监控
## 每行填写节点的ip+port
## eg:
192.168.1.1:7777
192.168.1.2:7777
192.168.1.3:8080
数据源配置,myosotis-console和myosotis-server启动时读取并加载,用于存取系统相关数据
参数 | 释义 | 默认值 | 参考值 |
---|---|---|---|
myosotis.sqlite3.path | sqlite3文件(绝对路径)推荐仅在本地部署时使用 | 内置数据库 | /opt/myosotis/myosotis.db |
myosotis.mysql.url | mysql数据库url | mysql.com:3306/myosotis | |
myosotis.mysql.username | mysql用户名 | root | |
myosotis.mysql.password | mysql密码 | root |
控制台配置,myosotis-console启动时读取并加载
参数 | 释义 | 默认值 | 参考值 |
---|---|---|---|
myosotis.log.dir | 日志目录(绝对路径) | ./log | /var/log/myosotis |
myosotis.console.port | 内置tomcat端口 | 7776 | 7776 |
服务端配置,myosotis-server启动时读取并加载
参数 | 释义 | 默认值 | 参考值 |
---|---|---|---|
myosotis.log.dir | 日志目录(绝对路径) | ./log | /var/log/myosotis |
myosotis.server.port | 内置tomcat端口 | 7777 | |
myosotis.server.minThreads | 内置tomcat最小线程数 | cpu核心数 | |
myosotis.server.maxThreads | 内置tomcat最大线程数 | 512 | |
myosotis.server.connectionTimeout | 建立连接超时时间 | 2000 | |
myosotis.server.maxConnections | 最大连接数 | 1024 | |
myosotis.server.keepAliveRequests | 最大keep-alive连接数(单机最大客户端连接数) | cpu核心数 * 16 | |
myosotis.server.acceptCount | 最大等待连接数 | 8 | |
myosotis.server.enableCompress | 启用数据压缩 | true | true |
myosotis.server.compressThreshold | 数据压缩阈值 | 2048 | 2048 |