剥析surging的架构思想

1、前言 

前面第一篇阐述了采用基于.NET CORE微服务架构,应用surging服务端与客户端之间进行通信的简单示例以及对于surging服务化框架简单介绍。在这篇文章中,我们将剥析surging的架构思想。

surging源码下载

2、通信机制

2.1 简介

     在单体应用中,模块之间的调用通信通过引用加载方法或者函数来实现,但是单体应用最终都会因为团队壮大,项目模块的扩展和部署等出现难以维护的问题。随着业务需求的快速发展变化,敏捷性、灵活性和可扩展性需求不断增长,迫切需要一种更加快速高效的软件交付方。微服务可以弥补单体应用不足,是一种更加快速高效软件架构风格。单体应用被分解成多个更小的服务,每个服务有自己的独立模块,单独部署,然后共同组成一个应用程序。把范围限定到单个独立业务模块功能。分布式部署在各台服务器上。一般来说,每个微服务都是一个进程。而各服务之间的交互必须通过进程间通信(IPC)来实现

 2.2 交互模式

交互模式有以下几种方式:

• 请求/响应:客户端向服务器端发起请求,同步等待响应,等待过程可能造成线程阻塞。
• 通知(也就是常说的单向请求):客户端请求发送到服务端,服务端不返回请求响应。
• 请求/异步响应:客户端发送请求到服务端,服务端异步响应请求。客户端不会阻塞,而且被设计成默认响应不会立刻到达。

• 发布/ 订阅模式:客户端发布通知消息,被零个或者多个订阅者服务消费。

• 发布/异步响应模式:客户端发布请求消息,然后异步或者回调服务发回响应。

服务之间的通信可以使用同步的请求/响应和请求/异步响应模式,在surging框架采用的基于RPC的netty 请求/异步响应和基于rabbitmq 的消息通信模式。首先来看异步消息通信模式

2.1.1 异步消息通信模式

Surging采用基于Rabbitmq发布订阅的异步交换消息的IPC进程通信,客户端通过pub发布请求,然后服务端进行Consume,之间的通信是异步,客户端不会因为等待而阻塞。

   消息由头部(元数据)和消息体构成,生产者发送消息到channel,消费者则通过channel接受数据,channel 则分为点对点和发布订阅,点对点Channel 会把消息准确发送到消费者,之间采用的是一对一的交互模式。而发布/订阅则把消息PUB到所有从channel 订阅消息的消费者中,之间采用的一对多的交互模式

2.1.2 基于请求/异步响应通信模式

Surging采用基于netty的 (IPC)进程通信,是基于请求/异步响应的IPC机制,客户端向服务端发送请求,服务端处理请求,异步响应,客户端不会因为等待服务返回而阻塞其它请求。

在请求/异步响应模式中,服务器端异步响应是在多处理器系统上可以并行处理或者单处理上交错执行,这使得当某个线程阻塞请求的同时其它线程得以继续执行。但访问共享资源时,需要保证其线程安全,可以通过锁,先进先出集合或者其它机制来处理线程安全的问题。

3、部署和调用

1.单体应用架构

当网站流量很小时,只需要将所有功能部署在一起,以减少部署节点和成本

单体架构业务流程往往在同一个进程内部完成处理,不需要进行分布式协作,它的工作原理如下:

 


图 1-1 单体架构本地方法调用

 

2.垂直应用架构

当访问量逐渐增大,单体架构压力越来越大,将架构拆成互不相干的若干应用以提升效率,此时采用MVC、webAPI进行调用 

3.分布式微服务架构

当垂直应用越来越多,应用之间交互不可避免,可以将各个独立的业务模块,部署成独立的微服务,逐渐形成稳定的服务中心。

而Surging 微服务采用分布式集群部署方式,服务的消费者和提供者通常运行在不同的进程中,进程之间通信采用RPC方式调用,它的工作原理如下:

 图1-2 Surging分布式RPC调用

        Surging微服务采用基于netty进行通信,数据之间的传递通过序列化和反序列JSON,相比于本地方法调用,会产生如下问题:

       1.数据序列化问题:微服务进程的通信都需要经过序列化和反序列化,因数据结构不一致、数据类型的不支持、编码错误都会造成数据转化的失败,从而导致调用失败

       2.网络问题:常见的包括网络超时、网络闪断、网络阻塞等, 都会导致微服务远程调用失败。

       每个微服务都独立打包部署,让服务之间进行进程隔离,对于大型的互联网项目,会有成百上千的微服务,通常不会百分百独立部署,对于同一业务的微服务会打包部署在一起,对于时延非常敏感,会合设在同一进程之内,采用本地方法调用。

不同的微服务合设在同一进程中,会产生以下问题:

  1. 处理较慢的微服务会阻塞其它微服务

  2. 某个微服务故障,可能导致整个进程不可用

3、总体架构

  Surging框架代码逻辑一共划分了8层,各个层的设计要点:

  • 业务模块服务接口层(IModuleServices):该层是与实际业务逻辑相关的,根据服务提供方和服务消费方,设计业务模块接口。

  • 业务模块服务层(ModuleServices):该层是通过Domain和Repository实现实际业务逻辑

  • 基础通信平台(CPlatform):提供基础数据通信对应的接口和基础实现,如:基础日志,远程调用服务,Event bus,负载均衡算法,数据序列化等

  • DotNetty服务层(DotNetty):实现基于DotNetty服务的信息的发送和接收

  • RabbitMQ服务层(EventBusRabbitMQ):封装基于Rabbitmq的发布订阅的事件总线

  • 代理服务层(ProxyGenerator):封装代理服务的生成及创建调用。

  •  服务注册层(Zookeeper):封装服务地址的注册与发现,以Zookeeper为服务注册中心,实现ServiceRouteManagerBase抽象,通过心跳检测的方式更新路由

  • 系统服务层(system):对于系统底层接口的封装

4、分布式的可靠性

      Surging 微服务的运行质量,除了自身的可靠性因素之外,还受到其它因素的影响,包括网络,数据库访问,其它关联的微服务的运行质量,可靠性设计,需要考虑上述综合因素,总结如下:

      

4.1 异步I/O 操作

  4.1.1 网络I/O

  1.同步阻塞I/o 通信:

  即典型的请求/响应模式。  该模型最大的问题就是缺乏弹性伸缩能力,当客户端并发访问量增加后,服务端的线程个数和客户端并发访问数呈1:1的正比关系,线程数量快速膨胀后,系统的性能将急剧下降,随着访问量的继续增大,系统最终崩溃。

  1. 异步非阻塞I/O 通信:

  Surging 是基于Netty进行异步非阻塞I/O 通信,即典型的请求/异步响应模式。此模式的优点如下:

  1. 更好的吞吐量,低延迟,更省资源

  2. 不再因过快、过慢或超负载访问导致系统崩溃

  4.1.2 磁盘I/O

  微服务对磁盘I/O的操作主要分为同步文件操作和异步文件操作,

  在Surging项目中,需要从注册中心获取路由信息缓存到本地,通过创建代理,负载均衡算法选择Router,路由信息的缓存到采用的是心跳检测的方式进行更新。

  4.1.3 数据库操作

  一般来说文件 I/O、网络访问乃至于进程间同步通信,以及本节所讨论的 数据库访问等都较为耗时,ado.net,Entity Framework以及其它ORM框架都提供了异步执行方法。

4.2 故障隔离

  由于大部分微服务采用同步接口调用,而且多个领域相关的微服务会部署在同一个进程中,很容易发生“雪崩效应”,即某个微服务提供者故障,导致调用该微服务的消费者、或者与故障微服务合设在同一个进程中的其它微服务发生级联故障,最终导致系统崩溃。为了避免“雪崩效应”的发生,需要支持多种维度的依赖和故障隔离,

  4.1.1 通信链路隔离

  由于网络通信本身通常不是系统的瓶颈,因此大部分服务框架会采用多线程+单个通信链路的方式进行通信,原理如下所示:

       

  4.1.2 调度资源隔离

  4.1.2.1微服务之间隔离

  当多个微服务合设运行在同一个进程内部时,可以利用线程实现不同微服务之间的隔离。

4.3 进程级隔离

对于核心的微服务,例如商品用户注册、计费、订单等,可以采用独立部署的方式,实现高可用性。

4.3.1 容器隔离

  微服务将整个项目解耦成各个独立的业务模块,部署成独立的微服务,利用Docker 容器部署微服务可以升级和扩容,并且有以下优点:

  高效:使用Docker部署微服务,微服务的启动    和销毁速度非常快,在高压力时,可以实现秒级弹性伸缩。

  高性能:Docker 容器的性能接近逻辑,比VM高20%

  隔离性:可以实现高密度的部署微服务,而且是基于细粒度的资源隔离机制,实现微服务隔离,保证微服务的可靠性

  可移植性:通过将运行环境和应用程序打包到一起,来解决部署的环境依赖问题,真正做到跨平台的分发和使用。可谓是一次编写,到处运行。

4.3.2 VM隔离

  除了Docker容器隔离,也可以使用VM对微服务进行故障隔离,相比于Docker容器,使用VM进行微服务隔离存在如下优势:

  1.微服务的资源隔离性更好,CPU、内存、网络等可以实现完全的资源隔离。

  2.对于已经完成硬件虚拟化的遗留系统,可以直接使用已有的VM,而不需要在VM中重新部署Docker容器。

4.4 集群容错

           略

5、Cache和EventBus中间件

5.1 Cache 中间件设计  

设计目标:

  1. 将缓存服务器的部署配置与应用隔离,

  2. 实现分布式,提高数据的均匀分布,并且能实现故障隔离

  3. 根据KEY前缀的不同分配到MemoryCache 或者redis 上

  4. 统计缓存的使用情况,便于分析和提高缓存合理资源的分配。

设计如下:

    

  缓存中间件内部使用一致性哈希算法实现分布式。设置的虚拟节点能均匀分布。

  缓存中间件暂时只实现Redis,MemoryCache做为缓存服务。后期应该会实现CacheBase

  缓存中间件后期会提供配置服务,方便管理缓存服务配置,以及显示一些状态信息

 5.2 EventBus中间件设计

设计目标:

  1. 基于发布/订阅的模式异步传递消息。

  2. 集成第三方消息中间件,如:MSMQ,Rabbitmq

  3. 实现基于发布/订阅的异步通知

设计如下:

           

        1.publisher: 是发布者把消息事件Event通过Event Bus 发布到Topic

        2.Event bus::是事件总线,对于publisher 和 Subscriber 之间进行解耦,找到已经注册的事件订阅者,消息事件Event发送到topic

        3.Topic: 是消息路由对于订阅者以广播的形式,让在线的Subscriber接收消息事件。

        4.Subscriber:是订阅者, 收到事件总线发下来的消息。即Handle方法被执行。注意参数类型必须和发布者发布的参数一致。

5、总结

          surging 0.0.0.1版本还有很多需要完善的地方,比如路由容错,服务降级、熔断,监控平台和配置服务平台,以及后续的第三方中间件的集成,这些任务都已经规划到日程,再不久的将来会看到1.0稳定版本的发布 ,如有兴趣可以加入QQ群:615562965

相关文章

  • 谷歌发布的首款基于HTTP/2和protobuf的RPC框架:GRPC

  • 拥抱.NET Core,跨平台的轻量级RPC:Rabbit.Rpc

  • 基于DotNet Core的RPC框架(一) DotBPE.RPC快速开始

  • 基于.NET CORE微服务框架 -surging的介绍和简单示例 (开源)

原文地址:http://www.cnblogs.com/fanliang11/p/7191030.html


.NET社区新闻,深度好文,微信中搜索dotNET跨平台或扫描二维码关注

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/324489.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

javaweb实现分页(二)

前言:我们都知道,实现分页需要三个步骤。第一,确定页大小(每页显示的数据量)。第二,计算显示的总页数。第三,写分页的sql语句。这三步已经在昨天的推文中详细说明,需要的可以点击这里…

滴滴出行基于RocketMQ构建企业级消息队列服务的实践

转载自 滴滴出行基于RocketMQ构建企业级消息队列服务的实践 本文整理自滴滴出行消息队列负责人 江海挺 在Apache RocketMQ开发者沙龙北京站的分享。通过本文,您将了解到滴滴出行: 1. 在消息队列技术选型方面的思考; 2. 为什么选择 RocketMQ…

[信息安全] 1.密码工具箱

0. 何谓安全? 对于信息安全性的重要性,我想大家都不会否认。那么具体来说应该具有哪些特性才能称之为安全呢?举个简单的例子:我给你发送一条消息“借给我100元”,当你收到这条消息并且处理后你的账户里面会少出来100块…

深入理解TCP/IP协议-TCP建立与终止连接

转载自 深入理解TCP/IP协议-TCP建立与终止连接 一、引言 TCP 是一个面向连接的协议。无论哪一方向另一方发送数据之前,都必须先在双方之间建立一条连接。连接创建与终止的状态变化图如下: 二、三次握手建立连接 过程如下: 客户端发送一个 SY…

在Docker中运行asp.net core 跨平台应用程序

概述 Docker已经热了有一两年了,而且我相信这不是一个昙花一现的技术,而是一个将深远影响我们日后开发和部署、运营应用系统的一种创新(很多人将其作为devops的一种非常重要的基石)。学习docker的最好方式,莫过于它的…

java中的Queue队列的用法

大家好,欢迎来到雄雄的小课堂,今天给大家分享的是“java中的Queue队列的用法” 前言:好多人对Queue不是很熟悉,毕竟平时也不怎么用,遇到集合要么List要么map这些常用的,殊不知,java中还有个Que…

SpringCloud Netflix Eureka

文章目录一、 Eureka简介Eureka组件二、 Eureka和Zookeeper 对比1 什么是CAP定理2 基于CAP定理比对Eureka和Zookeeper三、 搭建Eureka注册中心1 POM文件2 配置文件application.yml3 启动类4 访问Eureka Server WEB服务管理平台四、 Eureka 服务管理平台介绍1 Eureka Server服务…

使用枚举定义常量更好点儿

大家好,欢迎来到雄雄的小课堂,昨天给大家分享的是“java中的Queue队列的用法示例”,今天,分享的主题是“java中,推荐使用枚举定义常量”。 前言:常量,相信大家多不会陌生,常量值一般…

SpringCloud Netflix Ribbon

文章目录一、 Ribbon简介二、 使用Ribbon开发微服务1 创建springcloud工程 和 commons子模块2 开发服务提供者 - ribbonappservice3 开发服务消费者 - ribbonappclient三、 集中式与进程内负载均衡区别四、 Ribbon常见的负载均衡策略1 Ribbon中的常用负载均衡简介2 配置负载均衡…

Entity Framework Core 生成跟踪列

注意:我使用的是 Entity Framework Core 2.0 (2.0.0-preview2-final)。正式版发布时,功能可能存在变动。 当您设计数据库时,有时需要添加列以跟踪记录何时更改,以及谁进行了更改。例如,您添加以下列: Cre…

老师,我们想看到您的笑容!

“老师,你可以对我们笑笑吗?”今天偶然遇见一位学生在吃饭的路上和我说道。我冲他点了点头,笑道:“好呀”!是啊,我是好久没有把笑声带回班级中了。1目前,4班都在倾尽全力的做项目,试…

阿里巴巴开源 Spring Cloud Alibaba,加码微服务生态建设

转载自 阿里巴巴开源 Spring Cloud Alibaba,加码微服务生态建设 本周,Spring Cloud联合创始人Spencer Gibb在Spring官网的博客页面宣布:阿里巴巴开源 Spring Cloud Alibaba,并发布了首个预览版本。随后,Spring Cloud…

微软发布Azure Stack更多细节,预计9月交付

在近日举行的微软全球合作伙伴大会上,微软宣布Azure Stack现在开始接受预定,预计9月份就可以交付。Azure Stack是微软公有Azure云的私有云实现。和其他私有云提供商不同,微软将把Azure Stack作为一项基于消费的服务,这和其公有云的…

今天你们表现的真棒!!!

12月5日在报告厅举行了“2020级青鸟4班 HTML网页设计大赛”。从一个洁白如纸的空白页面,到布满五彩斑斓样式的cool页面,是同学们一个字母一个单词的敲打出来的。从头脑空白啥都不会说到现在的条理清晰张嘴就来的演讲,是同学们时时刻刻写稿子背…

再有人问你Netty是什么,就把这篇文章发给他

转载自 再有人问你Netty是什么,就把这篇文章发给他 本文基于Netty4.1展开介绍相关理论模型,使用场景,基本组件、整体架构,知其然且知其所以然,希望给大家在实际开发实践、学习开源项目提供参考。 这是一篇万字长文&a…

SpringCloud Netflix Hystrix

文章目录一、 Hystrix简介1 什么是灾难性雪崩效应2 什么是Hystrix二、 服务降级(Ribbon中)三、 服务熔断(Ribbon中)(服务降级的强化版)四、 请求缓存(Ribbon中)(不推荐)(查询频率高,修改频率低时谨慎使用)五、 Openfeign的雪崩处理1 服务降级…

[信息安全] 3.HTTPS工作流程

0. 简单回顾 在前面两篇博客中介绍了密码相关的一些基本工具,包括(对称密码,公钥密码,密码散列函数,混合密码系统,消息认证码码,数字签名,伪随机数,数字证书&#xff09…

如何实现省市关联的下拉列表

前言:在某些电商网站或者APP中,通常填写地址时,会有这样的功能:当我们选择的省份是“山东”时,则城市的下拉列表里所展示的便是山东的城市,当选择的省份是“山西”时,城市的下拉列表所展示的便是…

什么样的事才是有意义的

有时候就在想,真正什么样的事才算有意义呢?

在Azure Container Service创建Kubernetes(k8s)群集运行ASP.NET Core跨平台应用程序

引子 在此前的一篇文章中,我介绍了如何在本地docker环境中运行ASP.NET Core跨平台应用程序,看起来非常不错,不是吗?那么,如果我们希望真正在实际的生产环境去部署和运行这个应用程序,应该怎么做呢&#xf…