当前位置: 首页 > news >正文

一个简单的通讯服务框架(大家发表意见一起研究)JAVA版本

最近研究下java语言,根据一般使用的情况,写了个连接通讯服务的框架;

框架结构 C-Manager-S;

把所有通讯内容抽取成三个方法接口:GetData,SetData,带返还的Get;

所有数据都处理为byte[];客户端与服务端和管理器以及服务端有多重处理模式

管理信息:

1.不需要中心管理器;服务端启动时向客户端广播自己绑定的地址;接收数据;客户端使用时广播一次请求,向所有服务端获取服务信息;

2.管理中心:客户端向管理器请求服务信息;服务端向管理器注册地址;根据需要,可以把客户端传递的数据直接转发给服务,也可以将地址转发给客户端,具体哪种由客户端需要决定

服务端:

1.服务端必须是命名的;整个结构以服务名称为准;所有请求也以名称为准;

2.服务端具有相同名称时;根据服务配置;将服务分为主从模式和负载均衡模式;如果是主从模式,则管理器或者客户端只调用主服务,当判断主服务死掉才会启用从服务;多个从服务时按照产生的序列依次启用(也会按照时间,其实是参考了zookeeper中的选举算法);如果是负载均衡模式(没有设置服务是主从模式则是负载均衡),负载均衡采用Hash一致算法,抽取服务使用;

客户端:

客户端直接封装为一个代理接口,又内部转换,只需要调用接口方法,传入服务名称,返回一个代理接口,然后传送数据

信息缓存:

采用了多个本地数据库(关系型,非关系型,内存数据库,都是本地化的);

传输层:

传输层现在只提供了最基本的TCP,UDP;我把通讯层高度抽取,抽取为接口,通过一个通讯管理器来创建接口对象(反射),只需要传入一个名称(“TCP”,"UDP")来建立通讯,方便修改,可以很灵活的修改通讯方式,也可以替换熟悉的第三方通讯;大家可以自己开发自己的通讯层,只需要实现接口,给该通讯取一个名称即可

做了一个简单的管理器界面如图:


该框架中有一个序列化组件:magpack;另外就是本地化数据库

现在网络上的框架组件都比较复杂比较大,比如:zookeeper;其实我们很多都是中小企业或者是小数据运用,没有必要那么复杂庞大,也不一定好维护,我只是想弄一个易用,通用,很小,很快的东西,简化通讯处理,高度抽象;

另外就是所有网络组件都是选择处理快,简单的,尤其是免费开源;设计的时候考虑这些组件易更换,尽量不去复杂引用,尽可能抽象接口;

另外准备了一个加载更多的界面:


Java的界面当前不适合复杂开发,只是准备简单的显示

已经将代码提交到了github;

框架功能将逐步更新,可能完善以后也会庞大,基于设计目标,在使用中会尽量模块化,可以分离使用(比如只使用封装的数据库连接池,数据库操作,通讯层,代理转换这些);或通过配置,反射,接口分离代码;

现在主要是JAVA语言实现,其实所有语言都一样;

最后一点:很多人在部署时害怕中心节点,因为它挂了就一切完蛋。这里的服务端可以有多种模式;至于管理器,它更加类似DNS解析地址,DNS都挂了,大家都没有玩的了;不过可以讨论有没有其它方式,我考虑到用多个,内部替换(类似用zookeeper选举一个中心的中心管理服务,然后切换),有懂通讯或者地址解析的多多提意见;

下一步完善可能添加的技术UDP挖洞;



转载于:https://www.cnblogs.com/jinyu20180311/p/10312395.html

相关文章:

  • mysql中的列属性
  • tcp三次握手与四次挥手
  • ajax php 点击加载更多
  • 【VS开发】ClientToScreen 和ScreenToClient 用法
  • 简单获取CDN背后网站的真实IP
  • jquery 简单实现tab切换
  • int的最大最小值补码原码转换
  • Js 跨域CORS报错 Response for preflight has invalid HTTP status code 405
  • Spring随笔(01)
  • 全屏显示
  • pickle使用及案例
  • 改变this指向
  • mac 自定义脚本命令
  • sdk相关
  • 去掉IE提示:internet explorer 已限制此网页运行脚本或Activex控件
  • Android开发 - 掌握ConstraintLayout(四)创建基本约束
  • ES6 学习笔记(一)let,const和解构赋值
  • Github访问慢解决办法
  • Js基础知识(四) - js运行原理与机制
  • js正则,这点儿就够用了
  • mysql 数据库四种事务隔离级别
  • Python学习笔记 字符串拼接
  • ReactNativeweexDeviceOne对比
  • vue数据传递--我有特殊的实现技巧
  • XForms - 更强大的Form
  • 道格拉斯-普克 抽稀算法 附javascript实现
  • 复杂数据处理
  • 湖南卫视:中国白领因网络偷菜成当代最寂寞的人?
  • 看图轻松理解数据结构与算法系列(基于数组的栈)
  • 实战|智能家居行业移动应用性能分析
  • 使用 QuickBI 搭建酷炫可视化分析
  • 数组的操作
  • 微信如何实现自动跳转到用其他浏览器打开指定页面下载APP
  • 为什么要用IPython/Jupyter?
  • 用Canvas画一棵二叉树
  • 原生js练习题---第五课
  • ​猴子吃桃问题:每天都吃了前一天剩下的一半多一个。
  • ​什么是bug?bug的源头在哪里?
  • ​虚拟化系列介绍(十)
  • ​直流电和交流电有什么区别为什么这个时候又要变成直流电呢?交流转换到直流(整流器)直流变交流(逆变器)​
  • (2022 CVPR) Unbiased Teacher v2
  • (安卓)跳转应用市场APP详情页的方式
  • (二)Eureka服务搭建,服务注册,服务发现
  • (附源码)springboot人体健康检测微信小程序 毕业设计 012142
  • ./configure,make,make install的作用
  • ./indexer: error while loading shared libraries: libmysqlclient.so.18: cannot open shared object fil
  • .net core 控制台应用程序读取配置文件app.config
  • .NET命令行(CLI)常用命令
  • .NET中使用Redis (二)
  • :not(:first-child)和:not(:last-child)的用法
  • @property python知乎_Python3基础之:property
  • @Transaction注解失效的几种场景(附有示例代码)
  • [C++] new和delete
  • [c++] 单例模式 + cyberrt TimingWheel 单例分析
  • [C语言]一维数组二维数组的大小