T O P

[资源分享]     Solon rpc 1.2.18 发布,突出Rpc特性

  • By - 楼主

  • 2021-01-08 14:20:49
  • 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:更多示例

    本帖子中包含资源

    您需要 登录 才可以下载,没有帐号?立即注册