Solon 是一個微型的Java RPC開發框架。專案從2018年啟動以來,參考過大量前人作品;歷時兩年,3500多次的commit;核心保持0.1m的身材,超高的跑分,良好的使用體驗。支援:Rpc、Rest api、Mvc 多種開發模式。
Solon 強調:剋制 + 簡潔 + 開放的原則;力求:更小、更快、更自由的體驗。
專案地址:
所謂更小:
核心0.1m,最小開發單位0.2m(相比Dubbo、Springboot專案包,小到可以乎略不計)
所謂更快:
本機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);
本次版本重大變更:
1、釋出 Solon cloud 適配介面與配置規範
此規範的設計目的:為第三方微服務元件適配提供統一的介面與配置規範。從而為第三方的微服務元件適配和使用更具標準性和統一性;同時可以讓開發者無縫切換不同的第三方元件。
本次釋出的介面與配置規範主要包括:
- 配置服務相關的介面與配置
- 註冊與發現服務相關的介面與配置
- 事件匯流排相關的介面與配置
- 日誌匯流排相關的介面與配置
2、釋出配置服務適配元件
元件 | 說明 | 備註 |
---|---|---|
consul-solon-plugin | 對consul的適配 | 使用一級目錄做為對應的配置組 |
nacos-solon-plugin | 對nacos的適配 | |
water-solon-plugin | 對water的適配 |
特性說明:
- 1-支援配置啟動時載入
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;
}
}
- 2-支付配置訂閱
/**
* 配置訂閱(獲取配置的時實重新整理)
*/
@CloudConfig("demo_cache_header")
public class DemotConfigHandler implements CloudConfigHandler {
@Override
public void handler(Config config) {
System.out.println(config.value());
}
}
- 3-支援雲配置直接注入,及自動重新整理機制(非單例不需要開啟自動重新整理機制)
@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-consul
3、釋出註冊與發現服務適配元件
元件 | 說明 |
---|---|
consul-solon-plugin | 對consul的適配 |
nacos-solon-plugin | 對nacos的適配 |
water-solon-plugin | 對water的適配 |
應用示例:
- 1-Solon rpc 服務註冊
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";
}
}
- 2-Solon rpc 服務釋出
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
4、釋出事件匯流排服務適配元件
元件 | 說明 | 備註 |
---|---|---|
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
5、釋出日誌匯流排服務適配元件
- water-solon-plugin(對water日誌的適配)
特性說明:
- 支援元資訊描述(可語義操作)
@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("打卡"), "我是誰?");
}
}
6、NamiClient 升級,與Solon cloud 規範更好的配合
新屬性 | 說明 | 示例 |
---|---|---|
url | 完整的url地址 | http://api.water.org/cfg/get/ |
group | 服務組 | water |
name | 服務名或負載均衡元件名(配合發現服務使用) | waterapi |
path | 路徑 | /cfg/get/ |
注:舊的基於表示式的屬性 uri,不再使用
附1: 統一的服務適配介面
服務介面 | 說明 | 已支援適配元件 |
---|---|---|
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 |
附2:統一的服務配置規範
注:具體配置時,用框架名替代@@符
屬性說 | 說明 | 框架可使用情況 |
---|---|---|
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 |