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

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

系列文章



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


前言

  

2020.1.10,陪我老婆到她所属的千亿企业的科技部值班,顺便参观了一下他们IT部门,舒适的环境让我灵感大发,终于把这篇拖了半年的博文完成了。

  

上一篇文章《.Net微服务实战之负载均衡(上)》从DNS、LVS和Nginx讲解如何在实战中结合使用,那么以上三种负载方式离开发人员相对来说比较远,平常也不容易接触到,更多是由团队的运维或者技术Leader关注的比较多。

  

该篇主要讲解在微服务架构中,如何使用我们耳熟能详的API网关+服务注册中心进行负载均衡的请求。让大家在实际工作中知道,如何将拆分后的微服务应用衔接起来,如何在微服务应用之间跨主机的访问容器进行请求。

  

下文的中间件的部署与使用,我将以下面的网络拓扑图的形式大家进行演示。在实际开发项目中,是以Docker Overlay的网络方式部署的,有些中间件为了开放给开发人员使用并且在文章中很好的展示给各位读者,我是把容器端口映射到了宿主,大家可以根据自生的实际情况进行定义。该文虽然是说.Net的微服务,但是实际上这几个中间件可以使用到其他各种平台,也是比较开源界相对热门、稳定的。

  

其次我也把在日常和同行沟通的时候,讨论得最多的问题给整理了出来,也方便入门微服务的读者能解答心中的疑惑,只有基础、理论理解清楚了,才能很好的进行实施。


image.png


我被问得多的那些问题


服务之间的调用关系容易混乱,该怎么划分?


下图的架构分层图是我当时实施后的应用分层,在这张图有几个关键点我给大家列一下


  • 自顶向下的分为UI层、聚合API层、公共API层,
  • 每一层只会依赖于下一层,不会跨层依赖,也不会同一层之间存在调用依赖
  • 聚合API层与公共API层都是属于内网环境,无法被外网直接访问,聚合API层如果要被UI层调用或者外网访问则由API网关暴露出去,公共API层需要被聚合API层访问则由RPC、Consul与Fabio进行衔接请求。
  • 纵向维度的从物理视角出发,分层目的是为了职责分离,避免调用关系乱套,循环依赖的问题
  • 水平维度的从业务视角出发,分解目的是为了解耦与复用



image.png


在微服务架构里前后端分离后不知道如何调用API接口?

  

该问题其实跟微服务无关,也就是前后端分离的基本问题。提出的人应该是属于做单体系统多了,然后去了解微服务的时候发现概念多中间件多,什么API网关、服务注册中心、RPC的直接把他们搞晕了。

  

对于该问题的回答就是,客户端与API之间是使用HTTP协议进行交互的,甚至是微服务内的服务与服务之间都是以HTTP协议进行交互,因为马丁福勒在他的博客里说了个重要的单词【轻量】,该词就是指轻量级的通信协议也就是HTTP。

  

那么对于该问题的一个衍生问题就是,我怎么知道该接口怎么调用呢?答案就是Swagger,Swagger担任的服务描述的重任,他描述了,接口路径、协议类型、参数结构,只要有了以上3者是不是就很好让前后端人员对接了。

  

清楚上面的问题后,再引入API网关,API网关其实就是把原本零散的API服务给整合起来,形成统一的流量入口,由API网关进行路由转发,如下图:


image.png


微服务里服务与服务之间是怎么通信的?

  

首先协议跟上面的问题一致是HTTP的,那么在.Net里HTTP API是不是可以通过HttpClient进行请求?但是HttpClient调用API时是需要关注很多参数的细节,那么RPC的优势就来了。

  

RPC主要工作是像调用内部方法一样做远程调用和隐藏请求细节。在.Net里WebApiClient和gRPC都是不错的RPC框架。

  

此外,RPC框架也是我认为做微服务第一个考虑选型并且慎重选型的组件。


从服务注册中心拿到的是服务地址列表,该怎么做负载均衡请求?

  

我们从服务注册中心拿到某个服务信息是一组ip+port的集合,那么需要对该集合的某一项进行请求。

  

有两种解决方式:


  •   调用端RPC集成,从注册中心获取服务地址列表,然后使用负载均衡算法选择其中一个IP+Port让RPC进行请求
  • 使用中间件,该中间件是与注册中心集成的,例如Consul+Fabio,调用端会通

过RPC框架请求Fabio,Fabio会从Consul获取健康的地址请求转发。

  

下面的使用我主要以中间件的方式来解决上述的问题,主要.Net多数RPC是没有集成注册中心,如果由开发人员整合起来,改动相对会花精力与时间。


image.png


PS:上面的提到的API网关、Fabio请求转发如果把大家绕晕了话,你们可以把他们两个当成类似Nginx功能(不完全一样)的中间件。

  

那么经过上面问题讲述后,那么就可以开始接下来的Kong、Consul、Fabio与.Net Core的集成使用。


Docker环境的准备


所有服务器关闭防火墙,不然下面使用Overlay2后,容器之间也无法ping通,如果原本已经启动了防火墙后再关闭的后需要重启docker。


#关闭防火墙


systemctl disable firewalld


#重启docker
systemctl restart docker
在Server A初始化Docker Swarm
docker swarm init --advertise-addr 192.168.88.138
然后在其他worker节点Server B和Server C执行上面反馈的指令加入Docker Swarm集群
docker swarm join --token SWMTKN-1-0odogegq3bwui4o76aq5v05doqqvuycb5jmuckjmvzy4bfmm59-ewht2cz6fo0r39ky44uv00aq5 192.168.88.138:2377
在Server A上可以查看Docker Swarm节点信息
docker node ls
在Server A创建Overlay2网络覆盖,方便后续创建的容器之间可以跨主机访问
docker network create -d overlay --attachable overlay


image.png


测试容器之间是否可以跨主机访问


#创建nginx集群
docker service create -d --network=overlay --replicas 3  --name=nginx nginx
#查找出某个实例的Ip
docker inspect 1af2984adda9
#进入另外容器实例尝试请求跨主机请求
docker exec -it 1af2984adda9 /bin/bash
curl 10.0.1.8
有以下响应结果就是网络环境OK了。


image.png

相关实践学习
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 等实时通信协议,具备自动验证、自动过滤器等丰富功能,适合快速搭建高性能、可扩展的服务端应用。
166 3
|
28天前
|
负载均衡 Java 持续交付
深入解析微服务架构中的服务发现与负载均衡
深入解析微服务架构中的服务发现与负载均衡
62 0
|
1月前
|
消息中间件 开发框架 .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月前
|
SQL 关系型数据库 数据库
七天.NET 8操作SQLite入门到实战详细教程(选型、开发、发布、部署)
七天.NET 8操作SQLite入门到实战详细教程(选型、开发、发布、部署)
|
4月前
|
测试技术 API 开发者
.NET单元测试框架大比拼:MSTest、xUnit与NUnit的实战较量与选择指南
【8月更文挑战第28天】单元测试是软件开发中不可或缺的一环,它能够确保代码的质量和稳定性。在.NET生态系统中,MSTest、xUnit和NUnit是最为流行的单元测试框架。本文将对这三种测试框架进行全面解析,并通过示例代码展示它们的基本用法和特点。
435 8
|
4月前
|
开发框架 缓存 前端开发
实战.NET Framework 迁移到 .NET 5/6
从.NET Framework 迁移到.NET 5/6 是一次重要的技术革新,涵盖开发环境与应用架构的全面升级。本文通过具体案例详细解析迁移流程,包括评估现有应用、利用.NET Portability Analyzer 工具识别可移植代码、创建新项目、逐步迁移代码及处理依赖项更新等关键步骤。特别关注命名空间调整、JSON 序列化工具更换及数据库访问层重构等内容,旨在帮助开发者掌握最佳实践,确保迁移过程平稳高效,同时提升应用性能与可维护性。
157 2
|
4月前
|
API 开发者 Java
API 版本控制不再难!Spring 框架带你玩转多样化的版本管理策略,轻松应对升级挑战!
【8月更文挑战第31天】在开发RESTful服务时,为解决向后兼容性问题,常需进行API版本控制。本文以Spring框架为例,探讨四种版本控制策略:URL版本控制、请求头版本控制、查询参数版本控制及媒体类型版本控制,并提供示例代码。此外,还介绍了通过自定义注解与过滤器实现更灵活的版本控制方案,帮助开发者根据项目需求选择最适合的方法,确保API演化的管理和客户端使用的稳定与兼容。
216 0
|
25天前
|
负载均衡 前端开发 应用服务中间件
负载均衡指南:Nginx与HAProxy的配置与优化
负载均衡指南:Nginx与HAProxy的配置与优化
44 3
|
6月前
|
缓存 负载均衡 算法
解读 Nginx:构建高效反向代理和负载均衡的秘密
解读 Nginx:构建高效反向代理和负载均衡的秘密
134 2