為RPC而生的t-io企業叢集版的msg伺服器tio-msg-demo你應該感興趣

manong發表於2021-12-16

概念解釋

什麼是 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

package org.tio.msg.demo;
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

package org.tio.msg.demo;
 
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

package org.tio.msg.demo;
 
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);
		}
	}
}

執行

04-24 22:27:01 INFO  o.t.c.client.PacketDispatcher[102]
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"
}


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/70006579/viewspace-2848150/,如需轉載,請註明出處,否則將追究法律責任。

相關文章