经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 程序设计 » 编程经验 » 查看文章
Socket.D 开源输传协议的集群转发特性
来源:cnblogs  作者:带刺的坐椅  时间:2024/2/18 9:02:44  对本文有异议

1、简介

Socket.D 是基于"事件"和"语义消息""流"的网络应用层协议。底层可以依赖 TCP、UDP、KCP、WebSocket 等传输层协议。其开发背后的动机是用开销更少的协议取代超文本传输协议(HTTP),HTTP 协议对于许多任务(如微服务通信)来说效率低下。

2、Socket.D 的集群应用

在 Socket.D 的集群故事里,会有三个角色:

  • 请求者
  • 经理人(或者中间人)
  • 响应者

客户端通过 url 连接经理人后,就会成为集群的一部分。它可以是请求者,也可以是响应者。

  1. sd:tcp://127.0.0.1:8602?@=demoapp

url 会包括:

  • 协议头(sd 表示 socket.d 协议,tcp 表示传输方案)
  • 地址与端口
  • 路径
  • 还有@参数,这个参数会申明自己的应用名字。连接经理人时,也相当于完成身份注册了。

在集群内部,相互间通过 At 进行发起向“响应者”的请求。就像:

  1. session.send("test", new StringEntity("hello").at("demoapp"));

3、集群的四种转发

在集群的活动中,请求者会发消息给经理人,经理人根据 at name 再转发给相应的响应者。

  • 四种转发方式(单播,单播!,组播,广播):
at 描述 备注
demoapp 单播 给叫这个名的其中一个会话发(使用 平均轮询 “负载均衡”策略)
demoapp! 单播! 给叫这个名的其中一个会话发(使用 ip_hash “负载均衡”策略)
demoapp* 组播 给叫这个名的整组会话发(如果自己也叫这个名,则自己除外)
* 广播 给集群里的全部会话发(自己除外)
  • 通过at方式进行转发,示例:
  1. session.send("test", new StringEntity("hello").at("demoapp"));
  2. session.send("test", new StringEntity("hello").at("demoapp!"));
  3. session.send("test", new StringEntity("hello").at("demoapp*"));
  4. session.send("test", new StringEntity("hello").at("*"));

4、演示

假设经理人(或者中间人) 的服务地址为:127.0.0.1:8602。下面以 Java 语言展示效果:

  • 创建经理人
  1. public class BrokerDemo {
  2. public static void main(String[] args) throws Exception {
  3. SocketD.createServer("sd:tcp")
  4. .config(c -> c.port(8602).fragmentHandler(new BrokerFragmentHandler()))
  5. .listen(new BrokerListener())
  6. .start();
  7. }
  8. }
  • 创建响应者(自己不需要端口启动,连接经理人后即可提供服务)
  1. public class ResponderDemo {
  2. public static void main(String[] args) throws Exception {
  3. //连接到 broker ,并给自己命名为:demoapp
  4. ClientSession session = SocketD.createClient("sd:tcp://127.0.0.1:8602?@=demoapp")
  5. .listen(new EventListener().doOn("/hello", (s,m)->{
  6. //监听 "/hello" 事件,如果是请求则答复
  7. if(m.isRequest()){
  8. s.reply(m, new StringEntity("me too!"));
  9. }
  10. }))
  11. .open();
  12. }
  13. }
  • 创建请求者
  1. public class RequesterDemo {
  2. public static void main(String[] args) throws Exception {
  3. //连接到 broker ,并给自己命名为:demotester
  4. ClientSession session = SocketD.createClient("sd:tcp://127.0.0.1:8602?@=demotester")
  5. .open();
  6. //发送消息,并要求转发给 "demoapp"
  7. session.sendAndRequest("/hello", new StringEntity("").at("demoapp")).thenReply(r->{
  8. //收到答复后,打印结果
  9. print(r.dataAsString());
  10. });
  11. }
  12. }

原文链接:https://www.cnblogs.com/noear/p/18017888

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号