1. 程式人生 > 實用技巧 >Solon rpc 1.2.18 釋出,突出Rpc特性

Solon rpc 1.2.18 釋出,突出Rpc特性

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 的特性

Solonn rpc 框架分為兩部分:Nami 承載客戶端的工作;Solon.boot 承載服務端的工作;Solon 做為容器貫穿前後

架構示意圖

二、將Nami 分解為:核心、通道、編解碼三塊

使用時須引入有通道和編碼包;也可根據需求定製自己的通道與編碼方案

  • 核心:org.noear:nami
  • 通道:org.noear:nami.channel.* (支援http、 socket、websocket)
  • 編碼:org.noear:nami.coder.*

(一)已適配通道包

  • org.noear:nami.channel.http.hutool
  • org.noear:nami.channel.http.okhttp
  • org.noear:nami.channel.socketd.jdksocket
  • org.noear:nami.channel.socketd.netty
  • org.noear:nami.channel.socketd.rsocket
  • org.noear:nami.channel.socketd.smartsocket
  • org.noear:nami.channel.socketd.websocket

(二)已適配解碼包

  • org.noear:nami.coder.fastjson
  • org.noear:nami.coder.hessian
  • org.noear:nami.coder.snack3

(三)支援Springboot整合

  • org.noear:nami-springboot-starter (客戶端整合)
  • org.noear:springboot-solon-plugin(服務端整合)

Springboot 客戶端整合示例 demo10.client_springboot

三、將整合包的打包方式由pom改為jar

  • org.noear:solon-rpc 改為 jar
  • org.noear:solon-web 改為 jar

附1:包引用使用示例

(一)http + json

  • 客戶端
<parent>
    <groupId>org.noear</groupId>
    <artifactId>solon-parent</artifactId>
    <version>1.2.18</version>
</parent>

<dependencies>    
    <dependency>
        <groupId>org.noear</groupId>
        <artifactId>nami.coder.snack3</artifactId>
    </dependency>
    <dependency>
        <groupId>org.noear</groupId>
        <artifactId>nami.channel.http.okhttp</artifactId>
    </dependency>
</dependencies>
public class ClientApp {
    public static void main(String[] args) {
        Solon.start(ClientApp.class, args);

        //
        // 預設使用json解碼
        //
        HelloService helloService = Nami.builder()
                .upstream(() -> "http://localhost:8080").create(HelloService.class);

        String result = helloService.hello("noear");
        System.out.println("Rpc result: " + result);
    }
}
  • 服務端
<parent>
    <groupId>org.noear</groupId>
    <artifactId>solon-parent</artifactId>
    <version>1.2.18</version>
</parent>
<dependencies>    
    <dependency>
        <groupId>org.noear</groupId>
        <artifactId>solon.serialization.snack3</artifactId>
    </dependency>

    <dependency>
        <groupId>org.noear</groupId>
        <artifactId>solon.boot.jlhttp</artifactId>
    </dependency>
</dependencies>
public class ServerApp {
    public static void main(String[] args) {
        Solon.start(ServerApp.class, args);
    }
}

@Mapping("/")
@Component(remoting = true)
public class HelloServiceImpl implements HelloService {
    @Override
    public String hello(String name) {
        return "hello: " + name;
    }
}

(二)sockted + json

  • 客戶端
<parent>
    <groupId>org.noear</groupId>
    <artifactId>solon-parent</artifactId>
    <version>1.2.18</version>
</parent>

<dependencies>    
    <dependency>
        <groupId>org.noear</groupId>
        <artifactId>nami.coder.hessian</artifactId>
    </dependency>
    <dependency>
        <groupId>org.noear</groupId>
        <artifactId>nami.channel.socketd.smartsocket</artifactId>
    </dependency>
</dependencies>
public class ClientApp {
    public static void main(String[] args) {
        Solon.start(ClientApp.class, args);

        //
        // 預設使用json解碼
        //
        HelloService helloService = Nami.builder()
                .upstream(() -> "http://localhost:8080").decoder(HessianDecoder.instance).create(HelloService.class);

        String result = helloService.hello("noear");
        System.out.println("Rpc result: " + result);
    }
}
  • 服務端
<parent>
    <groupId>org.noear</groupId>
    <artifactId>solon-parent</artifactId>
    <version>1.2.18</version>
</parent>
<dependencies>    
    <dependency>
        <groupId>org.noear</groupId>
        <artifactId>solon.serialization.hession</artifactId>
    </dependency>

    <dependency>
        <groupId>org.noear</groupId>
        <artifactId>solon.boot.socketd.smartsocket</artifactId>
    </dependency>
</dependencies>
public class ServerApp {
    public static void main(String[] args) {
        Solon.start(ServerApp.class, args);
    }
}

@Mapping(value = "/",method = MethodType.SOCKET)
@Component(remoting = true)
public class HelloServiceImpl implements HelloService {
    @Override
    public String hello(String name) {
        return "hello: " + name;
    }
}

附2:更多示例