Solon 是一個微型的Java RPC開發框架。項目從2018年啓動以來,參考過大量前人做品;歷時兩年,3500屢次的commit;內核保持0.1m的身材,超高的跑分,良好的使用體驗。支持:Rpc、Rest api、Mvc 多種開發模式。java
Solon 強調:剋制 + 簡潔 + 開放的原則;力求:更小、更快、更自由的體驗。git
https://gitee.com/noear/solonapi
內核0.1m,最小開發單位0.2m(相比Dubbo、Springboot項目包,小到能夠乎略不計)app
本機helloworld測試,Qps可達12萬之多。可參考:《helloworld_wrk_test》負載均衡
// 除了注入模式以外,還能夠按需手動 // //手動獲取配置 Map<String,String> db = Solon.cfg().getMap("db"); //手動獲取容器裏的Bean UserService userService = Aop.get(UserService.class); //手動監聽http post請求 Solon.global().post("/user/update", x-> userService.updateById(x.paramMap())); //手動添加個RPC服務 Solon.global().add("/rpc/", HelloService.class, true);
此規範的設計目的:爲第三方微服務組件適配提供統一的接口與配置規範。從而爲第三方的微服務組件適配和使用更具標準性和統一性;同時可讓開發者無縫切換不一樣的第三方組件。框架
本次發佈的接口與配置規範主要包括:ide
組件 | 說明 | 備註 |
---|---|---|
consul-solon-plugin | 對consul的適配 | 使用一級目錄作爲對應的配置組 |
nacos-solon-plugin | 對nacos的適配 | |
water-solon-plugin | 對water的適配 |
特性說明:微服務
solon.app: group: demo #應用組 //也是配置服務使用的默認組 name: helloapp #應用名 //發現服務使用的應用名 solon.cloud.consul: #consul,能夠換成 nacos 或 water server: 127.0.0.1 #consul 服務地址 config: loadKey: "test.properties" #啓動時加載的配置,並保持時實更新***(會成爲Solon.cfg()的一部份)
// //使用加載的 test.properties 裏的配置 // @Configuration public class DemoConfig { @Bean public DataSource ds(@Inject("${db1}") HikariDataSource ds){ return ds; } }
/** * 配置訂閱(獲取配置的時實刷新) */ @CloudConfig("demo_cache_header") public class DemotConfigHandler implements CloudConfigHandler { @Override public void handler(Config config) { System.out.println(config.value()); } }
@Controller public class DemoController { @CloudConfig(value = "demo_header", autoRefreshed = true) String demo_header; }
附演示源碼:https://gitee.com/noear/solon_rpc_demo/tree/main/demo21.solon-cloud-consulpost
組件 | 說明 |
---|---|
consul-solon-plugin | 對consul的適配 |
nacos-solon-plugin | 對nacos的適配 |
water-solon-plugin | 對water的適配 |
應用示例:測試
solon.app: group: demo name: helloapi #發現服務使用的應用名(在Demo,將被NimaClient引用) solon.cloud.consul: server: 127.0.0.1 #consul服務地址
@Mapping("/rpc/") @Component(remoting = true) public class HelloServiceImp implements HelloService { @Override public String hello() { return "remote: hello"; } }
solon.app: group: demo name: helloapp solon.cloud.consul: server: 127.0.0.1
@Controller public class DemoController { // // "helloapi" 對應註冊的服務 // @NamiClient(name = "helloapi") HelloService helloService; @Mapping("/test") public String home(String msg) throws Exception { return helloService.hello(); } }
附演示源碼:https://gitee.com/noear/solon_rpc_demo/tree/main/demo21.solon-cloud-consul
組件 | 說明 | 備註 |
---|---|---|
rabbitmq-solon-plugin | 對rabbitmq消息隊列的適配 | |
rocketmq-solon-plugin | 對rocketmq消息隊列的適配 | 定時事件不能超過2小時 |
water-solon-plugin | 對water消息中心的適配 |
特性說明:
消費組由solon.app.group + solon.app.name 自動組合而成;或經過 solon.cloud.{組件}.event.queue 指定
應用示例:
solon.app: group: demo #配置服務使用的默認組 name: helloconsumer #發現服務使用的應用名 solon.cloud.rocketmq: server: localhost:5672 #rabbitmq 服務地址 username: root #rabbitmq 連接帳號 password: 123456 #rabbitmq 連接密碼
// //消費者:訂閱事件 // @CloudEvent("hello.demo") public class EVENT_hello_demo implements CloudEventHandler { @Override public boolean handler(Event event) throws Throwable { //業務處理 System.out.println(LocalDateTime.now() + ONode.stringify(event)); //若是成功返回true,不然爲false(以後會延時再派送) return true; } } // // 發產者:發佈事件 // @Controller public class DemoController { @Mapping("/test") public Object test(String msg) { if(Utils.isEmpty(msg)){ msg = "demo2"; } //發佈事件 Event event = new Event("hello.demo", msg); return CloudClient.event().publish(event); } }
附演示源碼:https://gitee.com/noear/solon_rpc_demo/tree/main/demo30.solon-cloud-rabbitmq
特性說明:
@Controller public class DemoController { CloudLogger logger = CloudLogger.get(TestController.class); @Mapping("/test") public void test(String msg) throws Exception { logger.info("我是好人:("); logger.info("我不是:{} \n\n {}", "壞人",12); logger.info(Tags.tag2("打卡"), "我是誰?"); } }
新屬性 | 說明 | 示例 |
---|---|---|
url | 完整的url地址 | http://api.water.org/cfg/get/ |
group | 服務組 | water |
name | 服務名或負載均衡組件名(配合發現服務使用) | waterapi |
path | 路徑 | /cfg/get/ |
注:舊的基於表達式的屬性 uri,再也不使用
服務接口 | 說明 | 已支持適配組件 |
---|---|---|
CloudConfigService | 配置服務接口 | consul-solon-plugin、nacos-solon-plugin、water-solon-plugin |
CloudDiscoveryService | 發現服務接口 | consul-solon-plugin、nacos-solon-plugin、water-solon-plugin |
CloudEventService | 事件總線接口 | water-solon-plugin、rabbitmq-solon-plugin、rocketmq-solon-plugin |
CloudLogService | 日誌總線接口 | water-solon-plugin |
注:具體配置時,用框架名替代@@符
屬性說 | 說明 | 框架可以使用狀況 |
---|---|---|
solon.cloud.@@.server | 服務地址(ip:port) | nacos、consul、water |
solon.cloud.@@.token | 連接令牌 | consul |
solon.cloud.@@.username | 連接用戶名 | nacos |
solon.cloud.@@.password | 連接密碼 | nacos |
solon.cloud.@@.alarm | 造警接收號 | water |
solon.cloud.@@.config.enable | 配置服務啓用(默認:true) | nacos、consul、water |
solon.cloud.@@.config.server | 服務地址(ip:port) | nacos、consul、water |
solon.cloud.@@.config.loadGroup | 須要啓動時加載的配置組 | nacos、water |
solon.cloud.@@.config.loadKey | 須要啓動時加載的Key | nacos、consul、wate |
solon.cloud.@@.config.refreshInterval | 配置刷新間隔 | consul |
solon.cloud.@@.discovery.enable | 註冊與發現服務啓用(默認:true) | nacos、consul、water |
solon.cloud.@@.discovery.server | 服務地址(ip:port) | nacos、consul、water |
solon.cloud.@@.discovery.tags | 服務標籤 | consul |
solon.cloud.@@.discovery.healthCheckPath | 服務健康檢查路徑 | consul、water |
solon.cloud.@@.discovery.healthCheckInterval | 服務健康檢查間隔時間 | consul |
solon.cloud.@@.discovery.healthDetector | 服務健康上報指標 | consul |
solon.cloud.@@.discovery.refreshInterval | 服務發現刷新間隔 | consul |
solon.cloud.@@.event.enable | 事件總線服務(默認:true) | water、rabbitmq、rocketmq |
solon.cloud.@@.event.server | 服務地址(ip:port) | water、rabbitmq、rocketmq |
solon.cloud.@@.event.exchange | 交換機或關係組 | rabbitmq、rocketmq |
solon.cloud.@@.event.queue | 指定隊列 | rabbitmq、rocketmq |
solon.cloud.@@.event.hostname | 指定接收域 | water |
solon.cloud.@@.event.seal | 事件簽名 | water |
solon.cloud.@@.log.enable | 日誌總線服務(默認:true) | water |
solon.cloud.@@.log.server | 服務地址(ip:port) | water |
solon.cloud.@@.log.default | 日誌默認記錄器 | water |