surging 微服务引擎从2017年6月至今已经有两年的时间,这两年时间有多家公司使用surging 服务引擎,并且有公司搭建了CI/CD,并且使用了k8s 集群,这里我可以说下几家公司的服务搭建情况,公司名不便透露,我们就以字母标识

A公司:40多个服务提供者,一个服务提供者扩展了四五个实例节点,只使用了3台服务器,并且搭建了CI/CD, k8s 集群,使用suring 构建航空行业信息化系统

B公司:房产系统,门店2300多家,峰值在线使用人数1700,平均保持在1200人左右,有21个服务提供者,每个服务提供者有70-80个服务,使用了三台服务器,部署在linux环境,并且使用docker, 数据库使用sql server 2017,运行了1年,产生的数据已经超过1亿

C公司:业务中台,服务2000多个,移动端和web端都已经上线,至今没产生什么问题,反应挺稳定

D公司:物联网,服务提供者1个,服务器1台8核支持了3.5W+, 部署在window 环境

....

以上是了解比较详细的一些数据,还有很多公司都采用了surging,还有一些公司采用surging 做二次开发,有了这些市场的证明,说明surging 作为服务引擎是及格的,可为各行业公司快速研发投入市场提供了可靠的解决方案。

那谈了这么多surging又是怎么样定义微服务这个边界的?

微服务应该是粒度最小的功能业务模块,针对于行业解决方案,集成相应的service host,而针对于业务需要一些中间件来辅助,比如缓存中间件,eventbus中间件(消息中间件),数据储存中间件,而各个服务又可以互相通过rpc进行可靠性通信。

以下是surging 服务引擎的调用链

从以上调用可以看出surging 可以支持多行业的解决方案,通过协议Mqtt、ws、http服务主机生成服务提供者,  在服务启动的时候服务A、服务B、服务C、服务D的ServiceRoute 会注册到注册中心,而A,B,C,D如果不是部署在同一个服务提供者中就需要通过RPC进行通信,而RPC提供了服务发现 和服务治理功能从而保证了通信之间,可靠性,可用性和可扩展性。

那么新版本surging 又有多少新的功能,多少惊喜呢?

1.灵活配置RoutePath

针对于RoutePath做了一次优化,可以通过ServiceBundle设置RoutePath, 也可以通过 ServiceRoute进行设置,具体参考以下代码

    [ServiceBundle("api/{Service}")]
//[ServiceBundle("api/{Service}/{Method}")]
//[ServiceBundle("api/{Service}/{Method}/test")]
//[ServiceBundle("api/{Service}/{Method}/test",false)]
public interface IUserService: IServiceKey
{ /// <summary>
/// 获取用户姓名
/// </summary>
/// <param name="id">用户编号</param>
/// <returns></returns>
[ServiceRoute("{id}")] //[ServiceRoute("{参数名}")]
Task<string> GetUserName(int id);
}

通过以上设置,GetUserName 生成的routepath是/api/user/getusername/{id}, 然后我们可以通过引用swagger组件来测试服务是否调用成功,具体效果如下

或者也可以用postman进行访问,具体效果如下图

2.扩展Dns 协议服务主机

因dotnetty没有dns 组件,扩展了基于dotnetty 的dns 编解码,支持tcp,udp协议, 但仅支持PTR、OPT记录类型。

引擎扩展了Dns 协议服务主机组件,包含了以下功能

1、Domain Name 解析
2、支持模块化Domain Name 解析自定义扩展
3.、支持引擎模块的集群化域名解析

那么我们可以按照以下方式把dns 集成到引擎中

1、需要通过nuget包引用Surging.Core.DNS或者通过指定目录Components进行扫描装载,再通过以下配置RootDnsAddress

  "Dns": {
"RootDnsAddress": "192.168.1.1",
"QueryTimeout":
}

2. dns服务接口,需要继承IServiceKey

   [ServiceBundle("Dns/{Service}")]
public interface IDnsService : IServiceKey
{
}

3. dns业务模块需要继承DnsBehavior,dns 服务主机才能进行加载

    public class DnsService : DnsBehavior, IDnsService
{
public override Task<IPAddress> Resolve(string domainName)
{
if(domainName=="localhost")
{
return Task.FromResult<IPAddress>(IPAddress.Parse("127.0.0.1"));
}
return Task.FromResult<IPAddress>(null);
}
}

然后通用以上配置,然后指向部署的DNS服务主机地址,解析域名规则为 前缀.(XX.XX.XX).后缀, 前缀会解析为key,以结合基于key做哈希一致性负载算法, (XX.XX.XX)会解析成routepath, 后缀不解析可以随便取名。以下是通过nslookup命令进行测试

3.扩展Udp 协议服务主机

需要按照以下方式把Udp集成到引擎中

1、需要通过nuget包引用Surging.Core.Protocol.Udp或者通过指定目录Components进行扫描装载,再通过以下代码编写Udp Service

配置udp端口

{
"Surging": {
"Ports": {
"HttpPort": "${HttpPort}|280",
"WSPort": "${WSPort}|96",
"MQTTPort": "${MQTTPort}|97",
"UdpPort": "${UdpPort}|95"
}
}
}

udp服务接口,需要继承IServiceKey

    [ServiceBundle("Udp/{Service}")]
public interface IUdpService : IServiceKey
{
}

udp业务模块需要继承UdpBehavior,udp服务主机才能进行加载

    public class UdpService : UdpBehavior, IDnsService
{
public override async Task<bool> Dispatch(IEnumerable<byte> bytes)
{
await this.GetService<IMediaService>().Push(bytes);
return await Task.FromResult(true);
} public override Task<bool> Dispatch(object message)
{
return Task.FromResult(true);
}
}

通过以上代码,可以通过ffmpeg推流到Udp,再通过udp 推流MPEG-TS 格式分发到ws 服务,再通过http://127.0.0.1:280/JSMpeg.html查看ws 推送的共享桌面

以下是推送的高清视频,有可能是播放器缓冲的问题,推送的视频流解析的不是很清楚

4.扩展基于netty 的ws 协议服务主机

引擎扩展了netty 的ws协议服务主机组件,包含了以下功能

1.支持基于webscoket 的Open、Error、nMessage、Close方法的封装

2.支持消息的发送和广播

需要按照以下方式把Udp集成到引擎中

1、需要通过nuget包引用Surging.Core.Protocol.Udp或者通过指定目录Components进行扫描装载,再通过以下代码编写Udp Service

配置ws端口

{
"Surging": {
"Ports": {
"HttpPort": "${HttpPort}|280",
"WSPort": "${WSPort}|96",
"MQTTPort": "${MQTTPort}|97",
"UdpPort": "${UdpPort}|95"
}
}
}

ws服务接口,需要继承IServiceKey

    [ServiceBundle("Api/{Service}")]
[BehaviorContract(Protocol = "media")]
public interface IMediaService : IServiceKey
{
Task Push(IEnumerable<byte> data);
}

ws业务模块需要继承WSBehavior,ws服务主机才能进行加载

    public class MediaService : WSBehavior, IMediaService
{
public Task Push(IEnumerable<byte> data)
{
this..Broadcast(data.ToArray());
return Task.CompletedTask;
}
}

5. 多注册中心集群支持

可以通过设置多注册中心进行服务注册,配有健康检查和负载均衡,注册中心地址以,隔开,具体按照以下进行配置

  "Consul": {
"ConnectionString": "${Register_Conn}|127.0.0.1:8500,127.0.0.1:9500", // "127.0.0.1:8500,127.0.0.1:9500",
"SessionTimeout": "${Register_SessionTimeout}|50",
"RoutePath": "${Register_RoutePath}",
"ReloadOnChange": true,
"EnableChildrenMonitor": false
}
以下是通过网关的管理界面配置

  "Register": {
"Provider": "Consul",
"Address": "${Register_Conn}|127.0.0.1:8500,127.0.0.1:9500"
}

以下查看以下界面,就说明配置成功

6,扩展支持ABP 组件

ABP 组件在.NET使用者还是比较多,ABP是一套业务封装快速开发框架,大多数使用者都是使用abp 架设单体应用和垂直应用SOA服务,那么使用微服务,必然需要用到ABP的组件,那么对于一些组件可以集成到surging 引擎中来,

其中通过引入Surging.Core.Abp组件,就能装载ABP组件。那么有多少ABP组件可以引入到引擎,这个等后面的章节会讲到。

7.  扩展关卡组件

surging 外层只能通过网关进行访问,这样破坏了组件引擎化思想,后面会考虑扩展关卡组件,以代替网关的路由转发、鉴权,具体设想会有以下功能

1. 支持AppSecret,能支持第三方调用

2.支持jwt来实现鉴权功能

3. 通过业务模块生成服务聚合服务提供者,服务聚合无需注册到注册中心

4.支持SSL配置

8. 扩展支持Reactive Extensions(Rx)响应式编程

计划是surging 能支持响应式编程,扩展支持Reactive Extensions, 具体实现哪些功能,还需要考虑

总结

针对.NET还有很多很多人对于微服务这个概念模拟两可,很多人分不清微服务的边界,那么对于这种情况,你们可以花点时间研究下surging 或者看下其它语言是如何定义这个边界的,也希望.NET同僚们能分清正确的微服务系统的架设,也希望.NET 在微服务迎头赶上,能给公司带来一套稳定高效的解决方案。

surging 微服务引擎 2.0 会有多少惊喜?的更多相关文章

  1. 谈谈surging 微服务引擎 2.0的链路跟踪和其它新增功能

    一.前言 surging是基于.NET CORE 服务引擎.初始版本诞生于2017年6月份,经过NCC社区二年的孵化,2.0版本将在2019年08月28日进行发布,经历二年的发展,已经全部攘括了微服务 ...

  2. surging 微服务引擎 1.0 正式发布

    surging 是一个分布式微服务引擎,提供高性能RPC远程服务调用,服务引擎支持http.TCP.WS.Mqtt协议,采用Zookeeper.Consul作为surging服务的注册中心,集成了哈希 ...

  3. surging 微服务引擎 -协议主机的Behavior特性

    1.前言 因为工作的关系,最近很少更新surging,因为surging 一直处在不温不火的状态,而自己每天利用业余时间进行完善,每天都是疲惫的状态,还要应付新手的提问,曾经一度想放弃,但是有些人劝说 ...

  4. Surging 微服务框架使用入门

    原文:Surging 微服务框架使用入门 前言 本文非 Surging 官方教程,只是自己学习的总结.如有哪里不对,还望指正.  我对 surging 的看法 我目前所在的公司采用架构就是类似与Sur ...

  5. Anno微服务引擎与传统应用相融合

    1.Anno是什么? Anno是一个微服务引擎.在此之前我们通过 Viper项目对Anno有一个基本的认识,并且Viper也受到的很多朋友的喜欢,截止发稿前Viper在GitHub收获了300多个星. ...

  6. (三)surging 微服务框架使用系列之我的第一个服务(审计日志)

    前言:前面准备了那么久的准备工作,现在终于可以开始构建我们自己的服务了.这篇博客就让我们一起构建自己的第一个服务---审计日志. 首先我们先创建两个项目,一个控制台的服务启动项目,一个业务的实现项目. ...

  7. 一)surging 微服务框架使用系列之surging 的准备工作rabbitmq安装(转载 https://www.cnblogs.com/alangur/p/8339905.html)

    (一)surging 微服务框架使用系列之surging 的准备工作rabbitmq安装   (1)下载erlang: http://www.erlang.org/download/otp_win64 ...

  8. 转载 (三)surging 微服务框架使用系列之我的第一个服务(审计日志)

    (三)surging 微服务框架使用系列之我的第一个服务(审计日志)   前言:前面准备了那么久的准备工作,现在终于可以开始构建我们自己的服务了.这篇博客就让我们一起构建自己的第一个服务---审计日志 ...

  9. 云图说丨初识华为云微服务引擎CSE

    摘要:微服务引擎(Cloud Service Engine,CSE),是用于微服务应用的云中间件,为用户提供注册发现.服务治理.配置管理等高性能和高韧性的企业级云服务能力 本文分享自华为云社区< ...

随机推荐

  1. UVA 1347(POJ 2677) Tour(双色欧几里德旅行商问题)

    Description John Doe, a skilled pilot, enjoys traveling. While on vacation, he rents a small plane a ...

  2. PHP中遍历关联数组的方法

    下面介绍PHP中遍历关联数组的三种方法:foreach <?php $sports = array( 'football' => 'good', 'swimming' => 'ver ...

  3. NuttX 构建系统

    (嵌入式 实时操作系统 rtos nuttx 7.1 makefile) NuttX 构建系统 转载请注明出处: http://blog.csdn.net/zhumaill/article/detai ...

  4. SICP 锻炼 (1.40)解决摘要

    SICP 锻炼1.40 是一个休闲的工作非常easy,但它看起来很复杂,单的一道题. 题目原题例如以下: 请定义一个过程cubic, 它和newtons-method过程一起使用在以下形式的表达式里: ...

  5. 潜移默化学会WPF--值转换器

    原文:潜移默化学会WPF--值转换器 1. binding 后面的stringFormat的写法----连接字符串 <TextBlock Text="{Binding Path=Qty ...

  6. WPF里的一些Effect特效

    原文:WPF里的一些Effect特效 Blend的特效都在Microsoft.Expression.Media.Effects里,用之前添加一下引用. 可以在前台选中对象后直接点击Effect新建一种 ...

  7. sql 循环 随机数创建数据

    --循环 WHILE @i<40 BEGIN …… end --随机数 SET @money=rand()*100000 例子: DECLARE @i INT DECLARE @money MO ...

  8. IIS基本介绍

    应用程序池-网站-应用程序   1 应用程序池 设置应用程序的各种设置,新建.修改应用程序的时候可以选择应用程序池   2 [站外图片上传中...(image-3924c8-1511163001873 ...

  9. python selenium chrome 测试

    #coding=utf-8 from selenium import webdriver from selenium.webdriver.common.keys import Keys from se ...

  10. SQL Server根据字段查询不出记录

    今天写了一条select语句,很奇怪的一件事,我写程序几年了,第一次碰到这个问题,就是数据库里有这个值,你根据这个值查询就是查询不出来这行记录. 所以我想是不是里面有空格,回车什么的,最后果然如此. ...