Water(水孕育萬(wàn)物...)
Water 為項(xiàng)目開(kāi)發(fā)购对、服務(wù)治理啡浊,提供一站式解決方案(可以理解為微服務(wù)架構(gòu)支持套件)觅够。基于 Solon 框架開(kāi)發(fā)巷嚣,并支持完整的 Solon Cloud 規(guī)范喘先;已在生產(chǎn)環(huán)境奔跑了4年。
功能相當(dāng)于:consul + rabbitmq + elk + prometheus + openFaas + quartz + 等等廷粒,并有機(jī)結(jié)合在一起窘拯。 或者約等于:nacos + rocketmq + PlumeLog + prometheus + magic-api + xxl-job + 等。
對(duì) k8s 友好坝茎,支持 ip 漂移涤姊、支持 k8s service 映射。
本次更新
- [控制臺(tái)] 所有導(dǎo)入功能統(tǒng)一為插入或替換(之前有些插入嗤放,有些是替換)
- [控制臺(tái)] 調(diào)整部分列表刪除后思喊,跳轉(zhuǎn)到同狀態(tài)列表
- [控制臺(tái)] 修復(fù)定時(shí)任務(wù)監(jiān)控?zé)o數(shù)據(jù)的問(wèn)題
- [控制臺(tái)] UI優(yōu)化
- HttpUtils 工具類,支持超時(shí)設(shè)置
- runJob次酌,超時(shí)改為:60*5秒
- runStatus恨课,超時(shí)改為:10秒
- solon 升級(jí)為:1.7.5(項(xiàng)目地址:https://gitee.com/noear/solon)
- redisx 升級(jí)為:1.4.3(項(xiàng)目地址:https://gitee.com/noear/redisx)
- snack3 升級(jí)為:3.2.22(項(xiàng)目地址:https://gitee.com/noear/snack3)
快速入門
了解開(kāi)發(fā)框架與鏡像
組件 | 說(shuō)明 |
---|---|
開(kāi)發(fā)框架 | |
org.noear:water.client | 框架:Water 客戶端 |
org.noear:water-solon-plugin | 框架:Water 客戶端 for solon(也可用于 Spring Boot 項(xiàng)目) |
鏡像 | |
noearorg/waterapi:2.6.2 | 鏡像:Water 主接口服務(wù) |
noearorg/watersev:2.6.2 | 鏡像:Water 后臺(tái)服務(wù)(健康檢測(cè)舆乔;數(shù)據(jù)監(jiān)視;消息派發(fā)剂公;定時(shí)任務(wù)等...) |
noearorg/wateradmin:2.6.2 | 鏡像:Water 管理控制臺(tái)(支持LDAP登錄) |
noearorg/waterfaas:2.6.2 | 鏡像:Water 即時(shí)接口服務(wù)希俩,提供輕量級(jí)FaaS接口服務(wù) |
noearorg/xwater:2.6.2 | 構(gòu)建:Water 助理工具 |
控制臺(tái)演示站
地址: http://water.noear.org (賬號(hào):demo ;密碼:demo )
關(guān)鍵持久化說(shuō)明:
- 日志持久化纲辽,支持:MySql颜武、PostgreSQL、MongoDb文兑、ElasticSearch盒刚、ClickHouse
- 消息持久化,支持:MySql绿贞、PostgreSQL因块、MongoDb
項(xiàng)目地址
代碼演示
(1) 配置
- pom.xml / mevan 配置
<!-- 客戶端版本 -->
<dependency>
<groupId>org.noear</groupId>
<artifactId>water.client</artifactId>
<version>${water.ver}</version>
</dependency>
<!-- solon cloud 集成版本 (也可用于 Spring Boot 項(xiàng)目) -->
<dependency>
<groupId>org.noear</groupId>
<artifactId>water-solon-plugin</artifactId>
<version>${solon.ver}</version>
</dependency>
- application.yml / 配置說(shuō)明
solon.app:
name: "demo-api"
group: "demo"
solon.cloud.water:
server: "waterapi:9371" #WATER服務(wù)地址
config:
load: "demo.yml" #默認(rèn)加載的配置
(2) 代碼
public class DemoApp {
public void main(String[] args) {
SolonApp app = Solon.start(DemoApp.class, args);
//監(jiān)控服務(wù):之:添加接口性能記錄(一般這個(gè)過(guò)濾器寫成獨(dú)立類)
Logger log = LoggerFactory.getLogger(DemoApp.class);
app.filter((ctx, chain) -> {
//1.開(kāi)始計(jì)時(shí)(用于計(jì)算響應(yīng)時(shí)長(zhǎng))
long start = System.currentTimeMillis();
try {
chain.doFilter(ctx);
} catch (Throwable e) {
//2.順帶記錄個(gè)異常
log.error("{}",e);
} finally {
//3.獲得接口響應(yīng)時(shí)長(zhǎng)
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) {
//配置一個(gè)數(shù)據(jù)源
return ds;
}
@Bean
public I18nBundleFactory i18nBundleFactory(){
//將國(guó)際化服務(wù),切換為云端接口
return new CloudI18nBundleFactory();
}
}
@Slf4j
@Controller
public class DemoController{
@CloudConfig(name = "demoDb", autoRefreshed = true) //配置服務(wù)的功能(注解模式)
DbContext demoDb;
@NamiClient //RPC服務(wù)發(fā)現(xiàn)的功能(注解模式)
RockService rockService;
@Mapping("/")
public void test(){
//日志服務(wù):寫個(gè)日志
log.info("你好籍铁,日志服務(wù)"); //(content)
TagsMDC.tag0("demo");
log.error("{}\r\n{}","test","你好涡上,日志服務(wù)"); //(tag,summary,content)
//配置服務(wù):使用配置的數(shù)據(jù)庫(kù)上下文進(jìn)行查詢
Map map = demoDb.table("water_reg_service").limit(1).selectMap("*");
//消息服務(wù):發(fā)送消息
CloudClient.event().publish(new Event("demo.test", "{\"order_id\":1}")); //(非注解模式)
//Rpc發(fā)現(xiàn)服務(wù):調(diào)用Rpc接口
AppModel app = rockService.getAppById(12);
}
}
//消息訂閱:訂閱消息并處理(根據(jù):topic 進(jìn)行訂閱)
@Slf4j
@CloudEvent("demo.test")
public class Event_demo_test implements CloudEventHandler {
@Override
public boolean handle(Event event) throws Exception {
//處理消息...
log.info("我收到消息:" + event.content());
return true;
}
}
//配置訂閱:關(guān)注配置的實(shí)時(shí)更新
@CloudConfig("demoDb")
public class TestConfigHandler implements CloudConfigHandler {
@Override
public void handle(Config config) {
}
}
//分布式任務(wù)
@CloudJob(name = "demo_test", cron7x = "0 1 * * * ?")
public class Job_test implements CloudJobHandler {
@Override
public void handle(Context ctx) throws Throwable {
//處理任務(wù)...
log.info("我被調(diào)度了");
}
}