Java RPC 框架 Solon 1.3.1 釋出,推出Cloud介面與配置規範

劉之西東發表於2021-01-30

Solon 是一個微型的Java RPC開發框架。專案從2018年啟動以來,參考過大量前人作品;歷時兩年,3500多次的commit;核心保持0.1m的身材,超高的跑分,良好的使用體驗。支援:Rpc、Rest api、Mvc 多種開發模式。

Solon 強調:剋制 + 簡潔 + 開放的原則;力求:更小、更快、更自由的體驗。

專案地址:

https://gitee.com/noear/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訊息中心的適配

特性說明:

  1. 支援定時事件
  2. 只要訂閱了主題,各消費組都能收到
  3. 當前處理失敗後逐級延後重試,直到最終成功;但不影響別的消費組

消費組由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日誌的適配)

特性說明:

  1. 支援元資訊描述(可語義操作)
@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

相關文章