.Net微服务实战之负载均衡(上)(一)

本文涉及的产品
云原生网关 MSE Higress,422元/月
注册配置 MSE Nacos/ZooKeeper,118元/月
服务治理 MSE Sentinel/OpenSergo,Agent数量 不受限
简介: .Net微服务实战之负载均衡(上)(一)

系列文章



相关源码:https://github.com/SkyChenSky/Sikiro


分布式?集群?负载均衡?

  

我曾经面试过一家企业,当时描述完我在老东家完成的微服务架构后,面试官问了我一个问题:

  

面试官:您有做过分布式系统吗?

  

我:有,刚刚我描述的微服务架构就是分布式的……

  

面试官:不不不,我意思是你有没有尝试过把一个站点部署到多台服务器上?

  

我:哦……你意思是我有没有用过类似nginx这些工具做负载均衡是吧?有,现在我们就这么做的。但是我对分布式理解是工作方式,但是你描述的更多具体称之为集群或者负载均衡。

 

面试官:对对,大家的站在的观点不一样所以理解的不一样(尴尬的笑了笑)


PS:首先我申明下我没有对该面试官有任何贬低嘲讽之意,也没刻意突出谁对谁错,面试完了后我回去回想了下我的回答并找到些资料做出以下总结。


分布式

  

分布式计算是指系统的工作方式,主要分为数据分布式任务分布式:

  

数据分布式也称为数据并行,把数据拆分后,利用多台计算机并行执行多个相同任务。优点是缩短所有任务总体执行时间,缺点是无法减少单个任务的执行时间。

  

任务分布式也称为任务并行,单个串行的任务拆分成多个可并行子任务。优点是提高性能、可扩展性、可维护性,缺点是增加设计复杂性。


负载均衡

  

负载均衡(Load Balance),简称LB,就是将并发的用户请求通过规则后平衡、分摊到多台服务器上进行执行,以此达到压力分摊数据并行的效果。


集群

  

集群是系统在负载均衡结果后的物理表现,系统(服务)通过部署到多台服务器以达到共同提供相同的功能,可以称这一组服务为某某集群,例如Redis集群,某Web站点集群。


负载均衡器


作用

  

负载均衡器的分类有很多,而他们的作用主要体现于架构要素的其中三个:可用性、性能、安全

  

可用性,多台服务器的部署避免了单点故障。

  

性能,一台Web站点能提供每秒4000次的并发请求,5台服务器构成的一个集群就可以达到20000。

  

安全,通过反向代理到真实服务器,避免直接路由到高危Web服务,避免开放危险端口。


算法

  

常用的负载均衡算法主要以下4个:

  • 加权轮询
  • 随机
  • 最少链接数
  • 哈希


分类

  

制造上主要分为软件负载硬件负载:

  

软负载,包含了Nginx、LVS、HAProxy等。

  

硬负载,包含了F5、Array等。

  

量级上主要分为:百万级数十万级、万级

  

百万级,硬负载,例如F5、Array。

  

数十万级,第四层负载,LVS、HAProxy。

  

万级,第七层负载,Nginx。

  

当然从成本上,硬负载绝对是土豪公司的工具,便宜的十来万RMB,贵则上百万RMB。而软负载只需要一台Linux服务器的钱就足够了。此外LVS的部署复杂度相比于Nginx会高那么一点,但是Nginx的七层负载的灵活性是四层负载的无法比拟的。


image.png

  

在实际工作中大家更多会接触到上图的架构模型,从功能职责上又可以划分地域级、集群级和应用级的负载:

  

地域级的负载均衡使用的是DNS的智能解析来完成的DNS全称Domain Name System,中文叫域名系统(服务)协议,一般都会采用云服务厂商的DNS系统,我们知道域名是需要花钱购买的,而厂商会附带一个免费的域名解析套餐,如果需要对域名进行域名智能解析,就需要付费给厂商获取相应的服务。


image.png

  


Nginx作为应用级负载也有自己的并发处理上限,如果超过上限了那么只能通过再上一层加一个更高处理性能的负载均衡器作为解决,而LVS可以很好担任集群级的负载重任。如果是土豪公司可以在自己选择使用硬负载来代替LVS,硬负载虽然贵也有自己的优势,例如防火墙、加密、高性能处理等。


Nginx

  

Nginx是一个高性能的反向代理服务器,也是稳定且高效的基于七层的负载均衡器。Nginx可以根据以随机、加权轮询,IP哈希、URL哈希等方式调度后端真是服务器,Nginx也支持对后端服务器的健康检查功能。


LVS

  

LVS即Linux Virtual Server,翻译中文为 Linux虚拟服务器,目前LVS是已经被集成到Linux内核模块中,LVS的工作模式分为NAT模式、TUN模式以及DR模式。那么在实战中,更多会Keepalived + LVS一起集成使用,Keepalived可以自动将LVS备用调度器升级为主调度器,最终实现整个集群系统的高负载、高可用。

  

本篇的重点主要讲解Keepalive + LVS + Nginx + .Net Core的搭建与使用。


效果图


image.png

  

PS:上图是我完成搭建后录制的视频转gif,因为中间有等待的一分钟,为了观看效果剪断了。

  

Web1与Web2是同一个Nginx,Web3和Web4是同为另外的一个Nginx。在图里可见需要过一段时间才能从一个Nginx切换到另外一个Nginx,原因主要是LVS会根据访问客户端的IP+端口在会话时间内重复的转发到同一个目标服务器。而控制这个会话时间的可以通过设置ipvsadm --persistent 与--set这两个参数决定。


LVS的三种工作模式


NAT(Network Address Translation)-网络地址转换模式。


首先,外部请求会经过LVS的VIP(Virtual IP Address);接着,LVS会根据预设的调度算法选择一台真实的服务器进行数据请求包转发,转发前会把原数据包的目标地址与目标端口修改为真实服务器的地址与端口;最后,LVS在得到响应数据包后会把源地址与源端口改为VIP及调度器相应的端口。因为由于所有的请求与响应都会经过LVS调度器转发,因此容易成为集群的瓶颈。


image.png


TUN-隧道模式


因为NAT会的瓶颈问题,因此TUN模式采用用了请求与响应数据分离的思路,让调度器仅处理数据请求,让真实服务器响应数据包直接返回给客户端,需要注意的是该模式下的真实服务器需要与外部网络连接。另外TUN模式下需要在LVS调度器与真实服务器之间创建隧道连接,同样会增加服务器的负担。


image.png


DR(Direct Routing)-直接路由模式


DR模式也是采用请求与响应分离的思路,由真实服务器直接响应客户端,但是它的报文转发方法有所不同,在不修改数据报文的情况下,将数据帧的MAC地址修改为需要转发到的真实服务器MAC地址,免去了TUN中的IP隧道开销。这种方式是三种负载调度机制中性能最高最好的,但是LVS调度器与真实后端服务器必须在一个局域网内。


image.png


LVS的部署


  image.png

  

接下来的部署操作将实现上图Keepalived + LVS +Nginx的多层负载均衡,LVS将是以DR模式实现。


相关实践学习
SLB负载均衡实践
本场景通过使用阿里云负载均衡 SLB 以及对负载均衡 SLB 后端服务器 ECS 的权重进行修改,快速解决服务器响应速度慢的问题
负载均衡入门与产品使用指南
负载均衡(Server Load Balancer)是对多台云服务器进行流量分发的负载均衡服务,可以通过流量分发扩展应用系统对外的服务能力,通过消除单点故障提升应用系统的可用性。 本课程主要介绍负载均衡的相关技术以及阿里云负载均衡产品的使用方法。
目录
相关文章
|
2月前
|
XML JSON API
ServiceStack:不仅仅是一个高性能Web API和微服务框架,更是一站式解决方案——深入解析其多协议支持及简便开发流程,带您体验前所未有的.NET开发效率革命
【10月更文挑战第9天】ServiceStack 是一个高性能的 Web API 和微服务框架,支持 JSON、XML、CSV 等多种数据格式。它简化了 .NET 应用的开发流程,提供了直观的 RESTful 服务构建方式。ServiceStack 支持高并发请求和复杂业务逻辑,安装简单,通过 NuGet 包管理器即可快速集成。示例代码展示了如何创建一个返回当前日期的简单服务,包括定义请求和响应 DTO、实现服务逻辑、配置路由和宿主。ServiceStack 还支持 WebSocket、SignalR 等实时通信协议,具备自动验证、自动过滤器等丰富功能,适合快速搭建高性能、可扩展的服务端应用。
143 3
|
1月前
|
运维 NoSQL Java
后端架构演进:微服务架构的优缺点与实战案例分析
【10月更文挑战第28天】本文探讨了微服务架构与单体架构的优缺点,并通过实战案例分析了微服务架构在实际应用中的表现。微服务架构具有高内聚、低耦合、独立部署等优势,但也面临分布式系统的复杂性和较高的运维成本。通过某电商平台的实际案例,展示了微服务架构在提升系统性能和团队协作效率方面的显著效果,同时也指出了其带来的挑战。
71 4
|
28天前
|
消息中间件 开发框架 .NET
.NET 8 强大功能 IHostedService 与 BackgroundService 实战
【11月更文挑战第7天】本文介绍了 ASP.NET Core 中的 `IHostedService` 和 `BackgroundService` 接口及其用途。`IHostedService` 定义了 `StartAsync` 和 `StopAsync` 方法,用于在应用启动和停止时执行异步操作,适用于资源初始化和清理等任务。`BackgroundService` 是 `IHostedService` 的抽象实现,简化了后台任务的编写,通过 `ExecuteAsync` 方法实现长时间运行的任务逻辑。文章还提供了创建和注册这两个服务的实战步骤,帮助开发者在实际项目中应用这些功能。
|
2月前
|
开发框架 NoSQL MongoDB
C#/.NET/.NET Core开发实战教程集合
C#/.NET/.NET Core开发实战教程集合
|
3月前
|
Dubbo Java 应用服务中间件
微服务框架Dubbo环境部署实战
微服务框架Dubbo环境部署的实战指南,涵盖了Dubbo的概述、服务部署、以及Dubbo web管理页面的部署,旨在指导读者如何搭建和使用Dubbo框架。
261 17
微服务框架Dubbo环境部署实战
|
3月前
|
运维 持续交付 API
深入理解并实践微服务架构:从理论到实战
深入理解并实践微服务架构:从理论到实战
143 3
|
3月前
|
SQL 关系型数据库 数据库
七天.NET 8操作SQLite入门到实战详细教程(选型、开发、发布、部署)
七天.NET 8操作SQLite入门到实战详细教程(选型、开发、发布、部署)
|
3月前
|
自然语言处理 Java 网络架构
解锁跨平台微服务新纪元:Micronaut与Kotlin联袂打造的多语言兼容服务——代码、教程、实战一次打包奉送!
【9月更文挑战第6天】Micronaut是一款轻量级、高性能的Java框架,适用于微服务开发。它支持Java、Groovy和Kotlin等多种语言,提供灵活的多语言开发环境。本文通过创建一个简单的多语言兼容服务,展示如何使用Micronaut及其注解驱动特性实现REST接口,并引入国际化支持。无论是个人项目还是企业应用,Micronaut都能提供高效、一致的开发体验,成为跨平台开发的利器。通过简单的配置和代码编写,即可实现多语言支持,展现其强大的跨平台优势。
54 3
|
3月前
|
运维 监控 持续交付
深入浅出:微服务架构的设计与实战
微服务,一个在软件开发领域如雷贯耳的名词,它代表着一种现代软件架构的风格。本文将通过浅显易懂的语言,带领读者从零开始了解微服务的概念、设计原则及其在实际项目中的运用。我们将一起探讨如何将一个庞大的单体应用拆分为灵活、独立、可扩展的微服务,并分享一些实践中的经验和技巧。无论你是初学者还是有一定经验的开发者,这篇文章都将为你提供新的视角和深入的理解。
82 3
|
4月前
|
测试技术 API 开发者
.NET单元测试框架大比拼:MSTest、xUnit与NUnit的实战较量与选择指南
【8月更文挑战第28天】单元测试是软件开发中不可或缺的一环,它能够确保代码的质量和稳定性。在.NET生态系统中,MSTest、xUnit和NUnit是最为流行的单元测试框架。本文将对这三种测试框架进行全面解析,并通过示例代码展示它们的基本用法和特点。
373 8