资讯专栏INFORMATION COLUMN

分享自己做的一个JAVA RPC 框架 longio

bergwhite / 1429人阅读

摘要:是一个支持同步和异步调用,并且支持客户端负载均衡,服务发现的框架,底层基于传输层支持和原始序列化层支持,支持服务端推送消息和客户端对推送消息的路由功能。将集成到可以基于注解对框架进行配置更方便,更。

longio

longio 是一个支持同步和异步调用,并且支持客户端负载均衡,服务发现的RPC框架,底层基于netty,传输层支持websocket,http和原始socket,序列化层支持JSON,MessagePack,protobuf,支持服务端推送消息和客户端对推送消息的路由功能。

longio-spring

longio-spring 将longio集成到spring-boot可以基于注解对rpc框架进行配置更方便,更easy。

RPC配置
    @Bean(name="cmdLookup")
    CmdLookup getCmdLookup() {
        return new DefaultCmdLookup(); 
    }

    @Bean(name="appLookup")
    AppLookup getAppLookup(@Qualifier("environment") Environment env) {
        return new DefaultAppLookup(new EnvProperties(env)); 
    }

    @Bean
    BeanFactoryPostProcessor getLioBeanBeanFactoryPostProcessor(
            @Qualifier("appLookup") AppLookup appLookup, 
            @Qualifier("cmdLookup")CmdLookup cmdLookup) {
        return new LongioBeanFactoryPostProcessor(appLookup, cmdLookup);
    }

    @Boot(port = 5000, pt = ProtocolType.JSONARRAY, tt = TransportType.HTTP)
    @Boot(port = 5002, pt = ProtocolType.JSON, tt = TransportType.HTTP)
    @Boot(port = 5001, pt = ProtocolType.MESSAGE_PACK, tt = TransportType.SOCKET)
    @Bean(name = "longio.bootstrap")
    public LioBootstrap getLioBootstrap() {
        return new LioBootstrap();
    }
Server端
@Lservice(path = "com.lehuihome")
public class TestService {
    @Lio(cmd = "getUser")
    @Unpack("com.zhucode.longio.example.message.UserMsg")
    public Map>getUser(@Key("user_id")long userId) {
        System.out.println("++++++++++++++++++++++++++++++++++++++");
        JSONObject ret = new JSONObject();
        ret.put("status", "success");
        Map rm = new HashMap<>();
        UserMsg um = new UserMsg();
        um.user_id = 9999;
        rm.put("1234", um);

        Map> m = new HashMap<>();
        m.put("1234", rm);
        return m;
        //return new String[]{"status", "true", "ffffdd"};
    }

    @Lio(cmd = "getUser1")
    @Unpack("com.zhucode.longio.example.message.User$Data")
    public Res.Data getUser1(@Key("user_id")long userId) {
        System.out.println("++++++++++++++++++++++++++++++++++++++");
        return Res.Data.newBuilder().setStatus("success").build();
    }

    @Lio(cmd = "getVoid")
    public void testVoid() {
        System.out.println("++++++++++++test void+++++++++++++++");
    }

    @Lio(cmd = "getInt")
    public int testInt() {
        System.out.println("++++++++++++test int+++++++++++++++");
        return 98800;
    }

    @Lio(cmd = "getString")
    public String testString() {
        System.out.println("++++++++++++test string+++++++++++++++");
        return "ffffdffffdffffdfvvvv";
    }

    @Lio(cmd = "compute_add")
    public int add(int a, int b) {
        System.out.println("++++++++++++test add+++++++++++++++");
        return a+b;
    }

}
客户端
@LsAutowired(app = "com.lehuihome", path = "com.lehuihome", tt=TransportType.SOCKET, ip="127.0.0.1", port=9001, pt=ProtocolType.MESSAGE_PACK)
public interface ClientService {

    @Lio(cmd = "getUser")
    @Pack("com.zhucode.longio.example.message.UserMsg")
    public Map> getUser(@Key("user_id")int userId);

    @Lio(cmd = "getVoid")
    public void testVoid();

    @Lio(cmd = "getInt")
    public int testInt();

    @Lio(cmd = "getString")
    public String testString();
    
    @Lio(cmd = "add")
    public int add(int a, int b);
    
    @Lio(cmd = "add")
    public void asynAdd(int a, int b, MessageCallback callback);


}
负载均衡

暂时支持权重轮询和权重随机

@LsAutowired(app = "com.lehuihome", lb=LoadBalance.Roll, ...)
源码地址

https://github.com/zhujinxian/longio

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/65524.html

相关文章

  • 明星分分合合的洪荒点击量,微博Mesh服务化改造如何支撑?(附PPT下载)

    摘要:为了解决这一系列问题,微博从年开发了语言的框架,并基于此完成了服务化改造。这些经历之下微博也积累了一套服务治理型的服务化体系。的版,所要解决的是微博平台内部服务之间的调用,因此协议时,其实并没有考虑到跨语言的问题,用的是对比较友好的。 showImg(https://segmentfault.com/img/remote/1460000012601596?w=1080&h=606); ...

    ShowerSun 评论0 收藏0
  • Dubbo开源现状与未来规划

    摘要:今天的话题是与的开源现状和未来规划,我们知道,过去一段时间疏于维护,去年阿里高调宣布重启开源之后,社区里问的最多的问题是,这次开源与上次有什么一样,还有就是和是什么关系希望通过这次的分享能够解答这些问题。 摘要: Dubbo 在过去一段时间疏于维护,去年阿里高调宣布重启 Dubbo 开源之后,社区里问的最多的问题是,这次开源与上次有什么一样,还有就是 Dubbo 和 Spring Bo...

    zhoutao 评论0 收藏0
  • 后端必备——数据通信知识(RPC、消息队列)一站式总结

    摘要:具体可以参考消息队列之具体可以参考实战之快速入门十分钟入门阿里中间件团队博客是一个分布式的可分区的可复制的基于发布订阅的消息系统主要用于大数据领域当然在分布式系统中也有应用。目前市面上流行的消息队列就是阿里借鉴的原理用开发而得。 我自己总结的Java学习的系统知识点以及面试问题,目前已经开源,会一直完善下去,欢迎建议和指导欢迎Star: https://github.com/Snail...

    Kahn 评论0 收藏0
  • RPC框架原理及从零实现系列博客(一):思路篇

    摘要:等之所以支持跨语言,是因为他们自己定义了一套结构化数据存储格式,如的,用于编解码对象,作为各个语言通信的中间协议。 前段时间觉得自己一直用别人的框架,站在巨人的肩膀上,也该自己造造轮子了 一时兴起 就着手写起了RPC框架 这里写了系列博客拿给大家分享下 这篇是开篇的思路篇 项目最终的代码放在了我的github上https://github.com/wephone/Me... 欢迎sta...

    tracy 评论0 收藏0
  • 分布式服务框架之远程通讯技术及原理分析

    摘要:微软的虽然引入了事件机制,可以在队列收到消息时触发事件,通知订阅者。由微软作为主要贡献者的,则对以及做了进一层包装,并能够很好地实现这一模式。 在分布式服务框架中,一个最基础的问题就是远程服务是怎么通讯的,在Java领域中有很多可实现远程通讯的技术,例如:RMI、MINA、ESB、Burlap、Hessian、SOAP、EJB和JMS等,这些名词之间到底是些什么关系呢,它们背后到底是基...

    sorra 评论0 收藏0

发表评论

0条评论

bergwhite

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<