water-solon-cloud-plugin
<dependency>
<groupId>org.noear</groupId>
<artifactId>water-solon-cloud-plugin</artifactId>
</dependency>
1、描述
分布式扩展插件。基于 water 适配的 solon cloud 插件。其功能相当于:consul + rabbitmq + elk + prometheus + openFaas + quartz + 等等,并有机结合在一起。
2、能力支持
云端能力接口 | 说明 | 备注 |
---|---|---|
CloudConfigService | 云端配置服务 | 不支持 namespace;支持 group |
CloudDiscoveryService | 云端注册与发现服务 | 不支持 namespace;不支持 group |
CloudEventService | 云端事件服务 | 不支持 namespace;支持 group |
CloudI18nService | 云端国际化服务 | |
CloudJobService | 云端定时任务服务 | |
CloudListService | 云端名单列表服务 | |
CloudLockService | 云端锁服务 | |
CloudLogService | 云端日志服务 | |
CloudMetricService | 云端度量服务 | |
CloudTraceService | 云端链路跟踪服务 |
3、配置示例
solon.app:
name: "demoapp"
group: "demo"
solon.cloud.water:
server: "waterapi:9371" #WATER服务地址
config:
load: "demoapp.yml" #加载配置到应用属性(多个以","隔开)
log:
default: "demoapp_log" #默认日志记录器(不配置,则为: ${solon.app.name}_log)
更丰富的配置:
solon.app:
name: "demoapp"
group: "demo"
meta: #添加应用元信息(可选)
version: "v1.0.2"
author: "noear"
tags: "aaa,bbb,ccc" #添加应用标签(可选)
solon.cloud.water:
server: "waterapi:9371" #WATER服务地址
config:
load: "demoapp.yml" #加载配置到应用属性(多个以","隔开)
log:
default: "demoapp_log" #默认日志记录器(不配置,则为: ${solon.app.name}_log)
提醒:通过 "...config.load" 加载的配置,会进入 Solon.cfg() 可使用 @Inject 注入
4、代码应用
public class DemoApp {
public void main(String[] args) {
SolonApp app = Solon.start(DemoApp.class, args);
//监控服务:之:添加接口性能记录(一般这个过滤器写成独立类)
Logger log = LoggerFactory.getLogger(DemoApp.class);
app.filter((ctx, chain) -> {
//1.开始计时(用于计算响应时长)
long start = System.currentTimeMillis();
try {
chain.doFilter(ctx);
} catch (Throwable e) {
//2.顺带记录个异常
log.error("{}",e);
} finally {
//3.获得接口响应时长
long milliseconds = System.currentTimeMillis() - start;
CloudClient.metric().addMeter(Solon.cfg().appName(), "path", ctx.pathNew(), milliseconds);
}
});
}
}
@Configuration
public class DemoConfig {
@Bean
public DataSource db1(@CloudConfig("demoDb") HikariDataSource ds) {
//配置一个数据源
return ds;
}
@Bean
public I18nBundleFactory i18nBundleFactory(){
//将国际化服务,切换为云端接口
return new CloudI18nBundleFactory();
}
}
@Slf4j
@Controller
public class DemoController{
//配置服务的功能(注解模式) //只有接收实体为单例,才能用 autoRefreshed
@CloudConfig(name = "demoTitle", autoRefreshed = true)
String demoTitle;
//配置服务的功能(注解模式)
@CloudConfig("demoDb")
DbContext demoDb;
@NamiClient //RPC服务发现的功能(注解模式)
RockService rockService;
@Mapping("/")
public void test(){
//日志服务:写个日志
log.info("你好,日志服务"); //(content)
TagsMDC.tag0("demo");
log.error("{}\r\n{}","test","你好,日志服务"); //(tag,summary,content)
//配置服务:使用配置的数据库上下文进行查询
Map map = demoDb.table("water_reg_service").limit(1).selectMap("*");
//事件服务:发送事件
Event event = new Event("demo.test", "{\"order_id\":1}");
CloudClient.event().publish(event); //(非注解模式)
//事件服务:发送事件(定时事件)
Date eventTime = DateTime.Now().addDay(10);
CloudClient.event().publish(event.scheduled(eventTime));
//Rpc发现服务:调用Rpc接口
AppModel app = rockService.getAppById(12);
}
}
//消息订阅:订阅消息并处理(根据:topic 进行订阅)
@Slf4j
@CloudEvent("demo.test")
public class Event_demo_test implements CloudEventHandler {
@Override
public boolean handler(Event event) throws Exception {
//处理消息...
log.info("我收到消息:" + event.content());
return true;
}
}
//配置订阅:关注配置的实时更新
@CloudConfig("demoDb")
public class TestConfigHandler implements CloudConfigHandler {
@Override
public void handler(Config config) {
}
}
//分布式任务
@CloudJob(name = "demo_test", cron7x = "0 1 * * * ?")
public class Job_test implements CloudJobHandler {
@Override
public void handle(Context ctx) throws Throwable {
//处理任务...
log.info("我被调度了");
}
}