为RPC而生的t-io企业集群版的msg服务器tio-msg-demo你应该感兴趣

爱写码
• 阅读 1232

概念解释

什么是RPC(Remote Procedure Call)远程过程调用,是一种通过网络从远程计算机程序上请求服务,实现某个业务,但是不需要具体了解底层网络技术的协议。t-io把程序中对外实现通信的各个协议模块进行了打包处理成一个盒子,上层应用对外通信就只要对接盒子的接口,而不必关心盒子里面的内容,RPC服务要对外实现远程调用,首先要跟t-io通信,再到远方的服务。 为什么要使用RPC呢?如果一个系统(例如,网站、大型应用等)中内部子系统较多、接口也非常多的情况下,采用RPC的好处就很明显了,RPC中采用的长链接,不必每次通信都要像有些协议一样每次都要进行3次握手来建立连接,例如,HTTP协议,这样就能减少了网络开销;其次,就是RPC中一般都有注册中心,而且有丰富的监控管理模块;应用方要进行发布、捆绑下线接口、动态扩展等,对调用方来说可以是无感知、归一化的操作。而且RPC的安全性也很好。 可见RPC下面如果有一个非常高效的网络编程框架配合,使用起来会很方便,由于t-io中内置了socket、NIO功能,所以跟RPC对接具有天然的优势,当然也可以使用netty,但是netty的使用起来比t-io会复杂很多。 基于t-io开发的最成功即时通讯软件—谭聊,已经完好的实现RPC的功能,具体请参考: https://www.tiocloud.com/1/blog/1385967412607852544?type=screen-category

msg服务器介绍

企业集群版的t-io,已经实现了msg服务器。自从有了集群服务器后,做rpc, 做msg都是很容易的事了!对于有RPC业务需求的老铁又是一大福音。我自己开发的IM聊天工具谭聊中已经验证的非常完美了。 废话不多说,请看具体实现代码。

示范代码

DemoMessage.java

import org.tio.msg.common.bs.msg.Message;
public class DemoMessage extends Message {
    private static final long    serialVersionUID    = -985195945448439158L;
    private String                name                = "hello tio message";
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
}

DemoMessageListener.java


import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.tio.msg.common.bs.msg.MessageListener;
import org.tio.utils.json.Json;

public class DemoMessageListener implements MessageListener<DemoMessage> {
    private static Logger                    log    = LoggerFactory.getLogger(DemoMessageListener.class);
    public static final DemoMessageListener    me    = new DemoMessageListener();

    @Override
    public void onMessage(String fromCid, DemoMessage message) {
        log.warn("收到Tio Message, fromCid[{}], Message:\r\n{}", fromCid, Json.toFormatedJson(message));
    }
}

启动类TioMsgDemoStarter.java


import java.sql.SQLException;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.tio.core.Node;
import org.tio.msg.client.MsgClientStarter;
import org.tio.msg.client.MsgApi;
import org.tio.msg.common.utils.JsonInit;
import org.tio.msg.common.utils.PropInit;
import org.tio.utils.jfinal.P;

/**
 * @author tanyaowu
 */
public class TioMsgDemoStarter {
    private static Logger log = LoggerFactory.getLogger(TioMsgDemoStarter.class);
    public static MsgClientStarter cluClientStarter = null;
    /**
     * 基本的初始化,一般用于单元小测试
     * @throws SQLException 
     */
    public static void initBase() throws SQLException {
        PropInit.init(new String[] { "app.properties" });
        JsonInit.init();
    }
    /**
     * @param args
     * @author tanyaowu
     */
    public static void main(String[] args) {
        try {
            initBase();
            //启动tio cluster client
            Node cluServerNode = new Node(P.get("tio.clu.server.ip"), P.getInt("tio.clu.server.port"));
            cluClientStarter = new MsgClientStarter(false, null, cluServerNode, null);
            cluClientStarter.start();
            Thread.sleep(100L);//sleep一下,让各连接的握手完成,实际项目中,一般不需要这样
            //添加listener
            MsgApi.addListener(cluClientStarter.getClientTioConfig(), DemoMessage.class, DemoMessageListener.me);
            for (int i =0; i < 1000; i++) {
                //发布一个demo 消息
                DemoMessage demoMessage = new DemoMessage();
                demoMessage.setName("hello tio message " + i);
                MsgApi.publish(cluClientStarter.getClientTioConfig(), demoMessage, true);
            }
        } catch (Throwable e) {
            log.error("", e);
            System.exit(1);
        }
    }
}

运行

server:127.0.0.1:1982, client:0:0:0:0:0:0:0:0:13378 收到消息:MessageNtf

04-24 22:27:01 WARN  o.t.m.demo.DemoMessageListener[20]
收到Tio Message, fromCid[1385963494888697856], Message:
{
    "name":"hello tio message"
}
点赞
收藏
评论区
推荐文章
blmius blmius
2年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
待兔 待兔
2星期前
手写Java HashMap源码
HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22
Wesley13 Wesley13
2年前
RPC 定义 和 原理
一、RPC  1.RPC是什么  RPC(RemoteProcedureCallProtocol)——远程过程调用协议,它是一种通过网络从远程计算机程序上请求服务,而不需要了解底层网络技术的协议。RPC协议假定某些传输协议的存在,如TCP或UDP,为通信程序之间携带信息数据。在OSI网络通信模型中,RPC跨越了
Wesley13 Wesley13
2年前
RPC的简单实现
RPC(RemoteProcedureCall)—远程过程调用协议,它是一种通过网络从远程计算机程序上请求服务,而不需要了解底层网络技术的协议。RPC协议假定某些传输协议的存在,如TCP或UDP,为通信程序之间携带信息数据。在OSI网络通信模型中,RPC跨越了传输层和应用层。RPC使得开发包括网络分布式多程序在内的应用程序更加容易。RPC采用客户机/
Stella981 Stella981
2年前
Rpc基础 原理 框架
一.RPC的原理1.RPC是什么RPC(RemoteProcedureCallProtocol)——远程过程调用协议,它是一种通过网络从远程计算机程序上请求服务,而不需要了解底层网络技术的协议。RPC协议假定某些传输协议的存在,如TCP或UDP,为通信程序之间携带信息数据。在OSI网络通信模型中,RPC
Stella981 Stella981
2年前
RPC简介与hdfs读过程与写过程简介
1.RPC简介RemoteProcedureCall远程过程调用协议  RPC——远程过程调用协议,它是一种通过网络从远程计算机程序上请求服务,而不需要了解底层网络技术的协议。RPC协议假定某些传输协议的存在,如TCP或UDP,为通信程序之间携带信息数据。在OSI网络通信模型中,RPC跨越了传输层和应用层。RPC使得开发包括网络
Wesley13 Wesley13
2年前
00:Java简单了解
浅谈Java之概述Java是SUN(StanfordUniversityNetwork),斯坦福大学网络公司)1995年推出的一门高级编程语言。Java是一种面向Internet的编程语言。随着Java技术在web方面的不断成熟,已经成为Web应用程序的首选开发语言。Java是简单易学,完全面向对象,安全可靠,与平台无关的编程语言。
API 小达人 API 小达人
7个月前
Eolink Apikit「 零代码」快速发起 RPC 接口自动化测试
RPC(RemoteProcedureCall)远程过程调用,是一种通过网络从远程计算机程序上请求服务,而不需要了解底层网络技术的协议。RPC的核心思想是将远程服务抽象成一个接口,客户端通过调用这个接口,就可以实现对远程服务的访问。EolinkApikit支持多协议,RPC、DUBBO、HTTP、REST、Websocket、gRPC、TCP、UDP、SOAP、HSF等。零代码快速发起RPC接口自动化测试,可以根据RPC接口文档自动生成测试用例,开发者只需简单修改即可使用。
Python进阶者 Python进阶者
6个月前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这
如何手搓一个自定义的RPC(远程过程调用框架)
1、RPC(远程过程调用概述)远程过程调用(RPC,RemoteProcedureCall)是一种通过网络从远程计算机程序上请求服务,而无需了解网络细节的通信技术。在分布式系统中,RPC是一种常用的技术,能够简化客户端与服务器之间的交互。本文将介绍如何基于