【5】JMicro免费在线消息服务
JMicro是一个用Java语言实现的开源微服务全家桶,
源码地址:https://github.com/mynewworldyyl/jmicro,
Demo地址:http://jmicro.cn/。
JMicro消息服务特性说明
今天向大家介绍基于JMicro实现的异步在线消息服务,其特点是免费,异步,多客户端支持,高性能,高可用。
现在网上很多宣称免费消息服务,其实到一定量后都是要收费的,但JMicro“不限量”免费,但是由于系统算力限制,不可能无限量大,所以JMicro系统默认为每秒最高50条消息,每条消息最大为8K二进制Byte。如果有需要更大的流量场景,可以在问题反馈里提单说明需求场景,我们评估通过后可适当增大流量(免费)。
客户端支持方面,目前支持Java客户端及JS WEB客户端,后面将陆续增加其他语言平台客户端。每种客户端都支持发布消息和订阅消息。比如可以用Java客户端发送消息,然后在Web客户端接收消息;或者在两个Web客户端之间相互发送或订阅消息,并且站在使用者的角度看就好像无后端服务器支持的消息通信,非常方便。
下面做个Demo,首先打开http://jmicro.cn页面并注册个账号,分别在两个页面登陆并打开消息测试页面,如下图:

在Chrome浏览器打开两个页面,登陆同一个账号或不同账号都可以,用账号登陆成功就行,如上两个页面都使用test01账号登陆。
左边框“发送主题”等于右边框“接收主题”,表示左边框发送消息给右边框,左边框的“订阅主题”等于右边框的“发送主题”,表示左边框接收右边框发送过来的消息。
在左右两个框分别点击“订阅”按钮后,按钮标题将变为“取消订阅”;
分别输入发送内容,并点击发送,将看到消息显示在对方的“接收消息”输出框中。
异步和高性能其实是一个整体,只有异步,才能做到快速的网络通信,而高性能的终极解决方案,基本上只有异步才能实现,了解一个单线程的Redis就会知道。值得一提的是JMicro是多线程的异步,是不是想想都激动!
JMIcro原生支持多主备份实例,所以支持高可用,这方面可以查看前面分享关于JMicro的文章。
JS API客户端Demo
纯JS样例:
http://jmicro.cn/testpubsub.html
源码地址:
https://github.com/mynewworldyyl/jmicro/blob/master/mng.web/public/testpubsub.html
Vue样例
按如下网址打开页面即可

Vue样例源码地址:
https://github.com/mynewworldyyl/jmicro/blob/master/mng.web/src/components/pubsub/JTestingPubsub.vue
JS API客户端使用
1. 首先注册JMicro账号
打开页面 http://jmicro.cn/ 右上角注册即可。注册时邮箱必须有效可用,后面要通过邮箱激活账号。手机号目前虽然没做实际验证,但后面不排除需要实名,所以建议填写真实有效手机号。
2. 引用JS文件
HTML文件头部引入JS,建议将此文件下载到本地引用,速度会快点
<script type="text/javascript" src="http://jmicro.cn/js/rpc.js"></script>
3. 初始化配置
$(function(){
jm.rpc.init("jmicro.cn",80);
})
4.账号登陆
//actName账号,pwd密码
jm.rpc.login(actName,pwd,(rst,err)=>{
if(err) {
alert(err);
}else {
//登陆成功
}
});
5. 订阅消息
let topic = "/jmicro/test/topic01";
jm.ps.subscribe(topic,{},msgCallback)
.then((rst)=>{
if(rst >= 0) {
self.subState=true;
$("#subscribe").text("Unsubscribe");
}else {
console.log(rst);
}
});
msgCallback是接收消息函数,定义如下:
function msgCallback(msg) {
if(!msg || msg.length == 0) {
$("#msg").text("Pubsub topic is disconnected by server");
//出错,取消订阅
this.doSubscribe();
}else {
let txt = $("#Result").text();
$("#Result").text(txt + "\n" + msg.data);
}
}
如果想取消订阅消息,则
let topic = "/jmicro/test/topic01"
jm.ps.unsubscribe(topic,msgCallback)
.then((succ)=>{
if(succ==true) {
self.subState=false;
$("#subscribe").text("Subscribe");
} else {
console.log(succ);
}
});
6. 发送消息
let topic = "/jmicro/test/topic01"
let content = "Hello jmicro pubsub servcie";
jm.ps.publishString(topic,content,false,false,null,null)
.then(rst=>{
console.log(rst);
}).catch(err=>{
console.log(err)
});
以上发送一个字符串消息。
7. 对JS消息API简单说明
打开rpc.js文件,大概从1200行开始,有如下代码
//byteArray: 发送byte数组
//persist: 指示消息服务器是否持久化消息,如果为true,则持久化到数据库存储24小时,在24小时内可以通过消息历史记录页面查询到已经发送的消息。
//queue: 目前未使用
//callback: 接收消息发送结果主题,需要单独订阅此主题接收结果通知
//itemContext:每个消息都有一个上下文,有于存储消息相关的附加信息
publishBytes: function(topic, byteArray,persist,queue,callback,itemContext){
return this._publishItem(topic, byteArray,persist,queue,callback,itemContext);
},
//发送字符串消息
publishString: function(topic,content,persist,queue,callback,itemContext){
return this._publishItem(topic, content,persist,queue,callback,itemContext);
}, //通过消息服务器调用别外一个RPC方法,args为RPC方法的参数
callService: function (topic,args,persist,queue,callback,itemContext){
return this._publishItem(topic,args,persist,queue,callback,itemContext);
}, //同时发送多个消息,psItems为消息数组
publishMultiItems: function (psItems){
return jm.rpc.callRpcWithParams(this.sn,this.ns,this.v,'publishMutilItems',[psItems]);
}, //发送单个消息
publishOneItem: function (psItem){
return jm.rpc.callRpcWithParams(this.sn,this.ns,this.v,'publishOneItem',[psItem]);
},
Java API使用用说明
样例源码地址:
https://github.com/mynewworldyyl/jmicro/tree/master/example/gatewayclientapp
1. POM中引用客户端Jar包
<dependency>
<groupId>cn.jmicro</groupId>
<artifactId>gateway.client</artifactId>
<version>0.0.2-SNAPSHOT</version>
</dependency>
2 初始化客户端连接
//主题
private String TOPIC = "/jmicro/test/topic01"; //private ApiGatewayClient socketClient = new ApiGatewayClient(new ApiGatewayConfig(Constants.TYPE_HTTP,"jmicro.cn",80));
private ApiGatewayClient socketClient = new ApiGatewayClient(new ApiGatewayConfig(Constants.TYPE_SOCKET,"jmicro.cn",9092)); //账号名
private static final String ACT = "test01";
//密码
private static final String PWD = "1";
Java客户端支持SOCKET及HTTP连接类型,SOCKET支持长连接,可以支持消息订阅,而HTTP只支持发送,不支持订阅。
3.发送字符串消息
@Test
public void testPublishString() {
socketClient.loginJMAsync(ACT, PWD)
.success((resp,cxt)->{
System.out.println("Success login: "+resp.getData().getActName()); .success((id,cxt0)->{
System.out.println("Publish result: "+id);
})
.fail((code,msg,cxt1)->{
System.out.println("Fail pubilish content: code: "+ code + ", msg: " + msg);
});
})
.fail((code,msg,cxt)->{
System.out.println("Fail login: code"+ code + ", msg: " + msg);
}); Utils.getIns().waitForShutdown();
}
因为JMicro是基于异步的RPC,而消息服务是其中的一个应用,所以以上异步代码看起来不是很直观。
最外层的socketClient.loginJMAsync(ACT, PWD)表示登陆消息服务系统,其返回一个IPromise实例,通过其success接收登陆成功通知,fail接收登陆失败通知。
在success方法里面再调用
socketClient.getPubsubClient()
.publishStringJMAsync(TOPIC, "Message from java client!",PSData.FLAG_DEFALUT,null)
发送一个字符串消息,同样,publishStringJMAsync返回IPromise实例,同样有success和fail接收发送消息成功或失败通知。
最后一行Utils.getIns().waitForShutdown();表示让JVM等待,否则JVM直接退出,自然看不到消息发送结果。
4. 订阅消息
定义消息接收器
订阅消息必须有一个消息接收器,用于接收异步下发的消息,代码如下
PSDataListener lis = new PSDataListener() {
int id = 0;
@Override
public void onMsg(PSData item) {
System.out.println("Got message: " + item.getData().toString());
}
@Override
public int getSubId() {
return id;
}
@Override
public void setSubId(int id) {
this.id = id;
}
};
主要在onMsg方法里接收消息,别的暂时不用理会。
开始订阅
socketClient.loginJMAsync(ACT, PWD)
.success((resp,cxt)->{ System.out.println("Success login: "+resp.getData().getActName()); socketClient.getPubsubClient()
.subscribeJMAsync(TOPIC, null, lis)
.success((id,cxt0)->{
System.out.println("Subscribe success: "+id);
})
.fail((code,msg,cxt1)->{
System.out.println("Fail to subscribe code: "+ code + ", msg: " + msg);
}); })
.fail((code,msg,cxt)->{
System.out.println("Fail login: code"+ code + ", msg: " + msg);
}); Utils.getIns().waitForShutdown();
和消息发送一样,最外层表示登陆,并在success方法调用订阅,返回的ID大于0表示订阅成功,小于或等于0表示订阅失败。
最后一行Utils.getIns().waitForShutdown()作用和发送消息相同。
你可以通过以上方式在Java与Web页面间反复测试两者之间消息发送与接收功能。
总结果:
JS及Java消息发送与接收是异步的,并且可以订阅消息发送结果通知,确保消息发送成功,以达到同步消息同样的效果;
JS及Java API编程风格基本上相同,都返回Promise接口实例,并在相应的Success及Fail方法接收结果;
实际上,你可以将Java客户端Jar放到支持Java的移动终端里面使用,实现两个无服务器支持的App之间发送接收消息;
基于JMicro消息服务,可以在任何系统之间做消息通信,即使一个没有任何服务器支持的两个HTML页面,也可以做网络通信,并且你不需要为此花费一分钱。
如果你在使用过程中有任何问题,可以在jmicro.cn问题反馈页面提单,我们技术人员有空就会及时回复,还希望你能在里面分享你的使用经验。
最后,如果JMicro项目确实帮助到你,希望你在到Gitgub上给个星
https://github.com/mynewworldyyl/jmicro
非常感谢!
【5】JMicro免费在线消息服务的更多相关文章
- 【9】JMicro微服务-发布订阅消息服务
如非授权,禁止用于商业用途,转载请注明出处作者:mynewworldyyl 1. JMicro消息服务目前实现特性 a. JMicro只支持发布订阅消息服务,不支持队列式消息服务: b. 不支持消息持 ...
- JSONPlaceholder - 免费的在线REST服务(提供测试用的HTTP请求假数据)
http://www.hangge.com/blog/cache/detail_2020.html 一.GET 方式请求数据1,获取文章(贴子)数据 二.POST 方式请求数据1,功能说明我们可以将数 ...
- 手把手教你使用“谷歌云消息服务(GCM)"
原文: http://android.eoe.cn/topic/summary GCM结构概述-GCM Architectural Overview 快速预览* 一个状态通知允许应用程序通知用户一个事 ...
- JMS(Java消息服务)入门教程
什么是Java消息服务 Java消息服务指的是两个应用程序之间进行异步通信的API,它为标准消息协议和消息服务提供了一组通用接口,包括创建.发送.读取消息等,用于支持JAVA应用程序开发.在J2EE中 ...
- “一切都是消息”--MSF(消息服务框架)入门简介
“一切都是消息”--这是MSF(消息服务框架)的设计哲学. MSF的名字是 Message Service Framework 的简称,中文名称:消息服务框架,它是PDF.NET框架的一部分. 1,M ...
- 5款最好的免费在线网站CSS验证器
这里是一个名单, 5免费在线CSS验证器的网站.这些网站让你验证你的CSS代码的自由,没有任何麻烦.你可以选择上传文件,验证CSS添加URL,或简单的复制和粘贴完整的CSS代码.好的方面是,这些网站不 ...
- “一切都是消息”--iMSF(即时消息服务框架)入门简介
“一切都是消息”--这是iMSF(即时消息服务框架)的设计哲学. MSF的名字是 Message Service Framework 的简称,由于目前框架主要功能在于处理即时(immediately) ...
- 免费在线直播课,送给所有IT项目经理
[免费在线直播课,送给所有IT项目经理]项目管理培训领域的老资格——光环国际,精心策划了一门一个半小时的在线直播课,送给所有辛苦的IT项目经理们.[直播主题]变化时代IT项目经理的成长要求[直播内容 ...
- 免费网站监控服务阿里云监控,DNSPod监控,监控宝,360云监控使用对比
网站会因为各种原因而导致宕机,具体表现为服务器没有响应,用户打不开网页,域名解析出错,搜索引擎抓取页面失败,返回各种HTTP错误代码.网站宕机可能带来搜索引擎的惩罚,网站服务器不稳定与百度关系文章中就 ...
随机推荐
- 洛谷P1057 传球游戏 完美错觉(完美错解)
//作者:pb2 博客:https://www.luogu.com.cn/blog/pb2/ 或 http://www.cnblogs.com/p2blog //博客新闻1:"WPS开机自启 ...
- linux zip压缩文件忽略指定的文件夹
zip -r productImages.zip ./* -x "cache**" 压缩时,会忽略cache下的所有文件及文件夹
- /usr/bin/ld: cannot find -lxxx 问题
linux下编译应用程序常常会出现如下错误: /usr/bin/ld: cannot find -lxxx 意思是编译过程找不到对应库文件.其中,-lxxx表示链接库文件 libxxx.so. 注:有 ...
- 数字货币比特币以太坊买卖五档行情数据API接口
数字货币比特币以太坊买卖五档行情数据API接口 数字货币一般包含比特币BTC.以太坊ETH.瑞波币XRP.泰达币USDT.比特币现金BCH.比特币SV.莱特币LTC.柚子币EOS.OKB. ...
- Java多线程_同步工具CyclicBarrier
CyclicBarrier概念:CyclicBarrier是多线程中的一个同步工具,它允许一组线程互相等待,直到到达某个公共屏障点.形象点儿说,CyclicBarrier就是一个屏障,要求这一组线程中 ...
- (数据科学学习手札94)QGIS+Conda+jupyter玩转Python GIS
本文完整代码及数据已上传至我的Github仓库https://github.com/CNFeffery/DataScienceStudyNotes 1 简介 QGIS随着近些年的发展,得益于其开源免费 ...
- Chrome 发一个请求,后台Controller 执行2次
chrome 每发一次请求,都会执行2次controller,换成其他浏览器就不会. 最后发现是这个插件导致的,果断删除.
- REST架构简介
restful简介 在如今web开发纵横的时代,几乎处处可见web页面,每个人都有自己的设计风格,这也导致了web接口五花八门,可能一个增删改查就要对应4个不同的url,这是非常浪费资源,于是Fiel ...
- Linux服务器被入侵后的处理过程
突然,频繁收到一组服务器 ping 监控不可达邮件,赶紧登陆 zabbix 监控系统查看流量状况. 可见流量已经达到了 800M 左右,这肯定不正常了,马上尝试 SSH 登陆系统,不幸的事,由于网络堵 ...
- docker 修改容器配置文件
启动docker镜像命令docker run 可以指定端口映射,但是容器一旦创建就无法在通过命令修改.通常是保存镜像在创建一个新的容器.有没有办法不保存镜像直接修改这个容器呢?答案是有的,本文已mys ...