1、前言

分布式已经成为了当前最热门的话题,分布式框架也百花齐放,群雄逐鹿。从中心化服务治理框架,到去中心化分布式服务框架,再到分布式微服务引擎,这都是通过技术不断积累改进而形成的结果。esb,网关,nginx网关 这些中心化服务治理框架现在都是各个公司比较主流的架构,而最近几年大家炒的比较火的去中心化微服务框架,各个语言都有其代表作品,比如.NET就有orleans、akka.net,这些框架不言而喻都能从网上了解一二,但是针对于这些框架,是不是就满足公司的需要,就能搭建起整个平台呢?

可以告诉大家,下一代框架应该称为分布式微服务引擎,也可以叫做服务网格,它应该是基础设施引擎,加载驱动业务模块服务,负责服务之间的可靠传递,提供了所需的网络协议,而针对surging 服务引擎就是朝着这个思想前进,内部通过RPC进行调用,有一套完整的服务治理规则,提供了tcp、http、ws 协议,并且可以支持容器化、可定制化引擎部署,下面我们来看看是如何实现的。

2.服务引擎

服务引擎是用于处理服务与服务可靠通信的专用基础设施。而服务应该是独立进行部署的,无需寄宿在其它框架当中,由于服务之间的独立性,业务团队不再需要操心服务治理相关的复杂度,全权交给服务引擎处理即可。针对每一个服务实例,服务引擎都会在同一主机上一对一并行部署一个服务进程,实现该服务实例所有对外的网络通讯(参见下图),借助于良好的框架封装,运维成本也可以得到有效的控制。

2.1 演化史

surging从无到有可分为三个演化阶段

第一个阶段RPC服务治理框架,服务与服务之间通信通过接口创建代理的方式进行访问

第二个阶段RPC服务治理框架+网关,服务与服务之间通信通过接口创建代理或RoutePath进行访问,外部通过网关进行调用

第三个阶段服务引擎,服务不再关心通讯细节和通信协议,统统交给引擎, 只需要关注业务的实现

2.2 架构

针对于surging现在提供了tcp、http、ws三种通信协议,tcp、http协议是基于dotnetty,而ws是基于websocket-sharp的分支版本websocketcore(该版本支持.NET CORE)

而整个引擎的架构如下图所示,通过对外的网络通信协议,可以对接移动、web、物联网应用,通过服务发现RPC远程调用内部业务服务。

3.如何开发基于协议的业务模块

3.1 基于http,tcp协议业务接口

继承IServiceKey,并且都需要标识[ServiceBundle("Api/{Service}")],代码如下

    [ServiceBundle("api/{Service}")]
public interface IManagerService : IServiceKey
{
[Command(Strategy = StrategyType.Injection, ShuntStrategy = AddressSelectorMode.HashAlgorithm, ExecutionTimeoutInMilliseconds = 2500, BreakerRequestVolumeThreshold = 3, Injection = @"return 1;", RequestCacheEnabled = false)]
Task<string> SayHello(string name);
}

3.2 基于ws协议业务接口

继承IServiceKey,并且都需要标识[ServiceBundle("Api/{Service}")],ws服务与服务之间的远程调用,需要把负载分流设置为哈希算法代码如下

  [ServiceBundle("Api/{Service}")]
public interface IChatService: IServiceKey
{
[Command( ShuntStrategy=AddressSelectorMode.HashAlgorithm)]
Task SendMessage(string name,string data);
}

3.3 基于http,tcp协议业务实现

继承ProxyServiceBase和业务接口IManagerService

 public class ManagerService : ProxyServiceBase, IManagerService
{
public Task<string> SayHello(string name)
{
return Task.FromResult($"{name} say:hello");
}
}

3.4 基于ws协议业务实现

继承WSServiceBase和业务接口IChatService,注意:ws服务之间的调用只能通过基于routepath远程调用,不支持通过接口创建代理远程调用

 public class ChatService : WSServiceBase, IChatService
{
private static readonly ConcurrentDictionary<string, string> _users = new ConcurrentDictionary<string, string>();
private static readonly ConcurrentDictionary<string, string> _clients = new ConcurrentDictionary<string, string>();
private string _name; protected override void OnMessage(MessageEventArgs e)
{
if (_clients.ContainsKey(ID))
{
Dictionary<string, object> model = new Dictionary<string, object>();
model.Add("name", _clients[ID]);
model.Add("data", e.Data);
var result = ServiceLocator.GetService<IServiceProxyProvider>()
.Invoke<object>(model, "api/chat/SendMessage").Result; }
} protected override void OnOpen()
{
_name = Context.QueryString["name"];
if (!string.IsNullOrEmpty(_name))
{
_clients[ID] = _name;
_users[_name] = ID;
}
}
public Task SendMessage(string name, string data)
{
if (_users.ContainsKey(name))
{
this.GetClient().SendTo($"hello,{name},{data}", _users[name]);
}
return Task.CompletedTask;
}
}

3.5. 提供哈希分流选址接口

通过调用内部提供的哈希分流选址接口,就可以把传递同一参数KEY分配到同一个服务提供者上。

3.6 基于WS协议测试

4.容器化部署

通过docker下载surging引擎,现在的版本是v0.8.0.2

docker pull serviceengine/surging:v0.8.0.2

启动surging 引擎

docker run --name surging --env Mapping_ip=192.168.249.242  --env Mapping_Port=93 --env RootPath=/home/fanly --env Register_Conn=192.168.249.162:8500 --env EventBusConnection=192.168.249.162 --env Surging_Server_IP=0.0.0.0  --env Surging_Server_Port=93 -v /home/fanly:/home/fanly -it -p 93:93 surging

运行如下图所示:

环境变量

Protocol:可以设置Http、Tcp、WS、None, 其中设置Http、Tcp、WS表示仅支持相关协议,None表示可以支持所有协议

RootPath:业务模块存储的根目录,如:/home/fanly

HttpPort: 启动Http协议主机端口

WSPort:启动WS协议主机端口

UseEngineParts:设置启用的服务引擎组件,默认是DotNettyModule;NLogModule;MessagePackModule;ConsulModule;HttpProtocolModule;EventBusRabbitMQModule;WSProtocolModule;(注意:如果是nuget定制化引擎,不需要配置Packages,可以进行删除,只需下载所需的引擎组件,会自动装配注册到服务引擎)

IP:私有容器IP,一般都是设置0.0.0.0

Server_Port: 私有容器端口

Mapping_ip:公开主机IP

Mapping_Port:公开主机端口

5.总结

surging 研发已经过去一年,从原来只支持RPC远程服务访问,到现在可以支持容器化部署,支持tcp、http、ws 协议的服务引擎,其中的成长演化非常有意思,有很多灵感只有在开发的时候才会灵光乍现,也希望以后能有更好的设计思想融入到surging中,也同时希望surging越来越强大。

谈谈surging引擎的tcp、http、ws协议和如何容器化部署的更多相关文章

  1. 浅谈surging服务引擎中的rabbitmq组件和容器化部署

    1.前言 上个星期完成了surging 的0.9.0.1 更新工作,此版本通过nuget下载引擎组件,下载后,无需通过代码build集成,引擎会通过Sidecar模式自动扫描装配异构组件来构建服务引擎 ...

  2. Fixed-Length Frames 谈谈网络编程中应用层(基于TCP/UDP)的协议设计

    http://blog.sina.com.cn/s/blog_48d4cf2d0101859x.html 谈谈网络编程中应用层(基于TCP/UDP)的协议设计 (2013-04-27 19:11:00 ...

  3. 基于.NET CORE微服务框架 -谈谈surging API网关

    1.前言 对于最近surging更新的API 网关大家也有所关注,也收到了不少反馈提出是否能介绍下Api网关,那么我们将在此篇文章中剥析下surging的Api 网关 开源地址:https://git ...

  4. WebSocket和long poll、ajax轮询的区别,ws协议测试

    WebSocket和long poll.ajax轮询的区别,ws协议测试 WebSocket是HTML5出的东西(协议),也就是说HTTP协议没有变化,或者说没关系,但HTTP是不支持持久连接的(长连 ...

  5. 对TCP/IP网络协议的深入浅出归纳

    前段时间做了一个开发,涉及到网络编程,开发过程比较顺利,但任务完成后始终觉得有一些疑惑.主要是因为对网络协议不太熟悉,对一些概念也没弄清楚.后来 我花了一些时间去了解这些网络协议,现在对TCP/IP网 ...

  6. TCP与UDP协议

    传输控制协议(Transmission Control Protocol, TCP)和用户数据报协议(User Datagram Protocol, UDP)是典型的传输层协议. 传输层协议基于网络层 ...

  7. 转:对TCP/IP网络协议的深入浅出归纳

    转自:http://blog.jobbole.com/74795/ 前段时间做了一个开发,涉及到网络编程,开发过程比较顺利,但任务完成后始终觉得有一些疑惑.主要是因为对网络协议不太熟悉,对一些概念也没 ...

  8. 对TCP/IP网络协议的深入浅出归纳(转)

    前段时间做了一个开发,涉及到网络编程,开发过程比较顺利,但任务完成后始终觉得有一些疑惑.主要是因为对网络协议不太熟悉,对一些概念也没弄清楚.后来 我花了一些时间去了解这些网络协议,现在对TCP/IP网 ...

  9. 关于tcp封装http协议

    如果tcp中没有上层协议,那么就是简单的数据包的传输,如果tcp中有上层协议,那么,当客户端把tcp包发给server的时候,server端的socket收到数据包后,从中分离出应用层协议,交给上层继 ...

随机推荐

  1. linux利用命令重置大量密码

     yum -y install expectmkpasswd -l 10 -v was | grep 'is *'  >> 123.txtmkpasswd -l 10 -v logv |  ...

  2. golang基础- ElasticSearch搜索引擎、kibana可视化工具、向ES输出数据

    转载自:https://blog.csdn.net/u013210620/article/details/78647366 安装ElasticSearch ElasticSearch是一个基于Luce ...

  3. YUV420格式解析

    一般的的YUV420图像格式实际上是Y'UV,420指的是其在Y U V上面的采样率.在YUV420的格式中,首先存储每一个像素的Y'值,然后跟着存储的是每2*2方阵采样一次的U值,最后存储的是每2* ...

  4. SVN中与资源库同步时报告了错误。1 中的 0 个资源已经同步

    SVN中与资源库同步时报告了错误.1 中的 0 个资源已经同步 原因: 文件被lock, 此时再次提交则出错,解决办法就是clean释放锁即可再次提交: 解决方案: 右键项目–>team–> ...

  5. Apache 流框架 Flink,Spark Streaming,Storm对比分析(一)

    本文由  网易云发布. 1.Flink架构及特性分析 Flink是个相当早的项目,开始于2008年,但只在最近才得到注意.Flink是原生的流处理系统,提供high level的API.Flink也提 ...

  6. python3学习笔记3---引用http://python3-cookbook.readthedocs.io/zh_CN/latest/

    2018-03-01数据结构和算法(3) 1.11 命名切片 假定你有一段代码要从一个记录字符串中几个固定位置提取出特定的数据字段(比如文件或类似格式): ###### 012345678901234 ...

  7. linux环境安装svn并进行多个源码库区分管理

    关于svn的文档有很多大部分已Windows为例子,因公司没有Windows服务器经过一天的曲折终于初步安装了解了svn.下面一些经验希望能帮助新手 本文采用的yum安装(简单快速没必要源码) 1.y ...

  8. memcached usage

    https://github.com/ragnor/simple-spring-memcached/wiki/Getting-Started 1) maven <dependency> & ...

  9. ORA-01658: 无法为表空间 YJXT 中的段创建 INITIAL 区

    oracle 用imp导入数据的时候报错:遇到ORACLE 错误1658: 无法为表空间 MAXDATA 中的段创建 INITIAL 区 解决办法:需要添加数据文件而不是新增表空间,代码如下: alt ...

  10. ES2015也就是ES6知识点持续更新

    ES6,全名:ECMAScript2015,先扯点其他的,ECMA是一个国际标准化组织,它最重要最重要的作用就是让ECMAScript这门语言标准化,什么意思呢?我们知道,js这门脚本语言是运行在浏览 ...