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

本文涉及的产品
任务调度 XXL-JOB 版免费试用,400 元额度,开发版规格
服务治理 MSE Sentinel/OpenSergo,Agent数量 不受限
MSE Nacos/ZooKeeper 企业版试用,1600元额度,限量50份
简介: .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

相关实践学习
每个IT人都想学的“Web应用上云经典架构”实战
本实验从Web应用上云这个最基本的、最普遍的需求出发,帮助IT从业者们通过“阿里云Web应用上云解决方案”,了解一个企业级Web应用上云的常见架构,了解如何构建一个高可用、可扩展的企业级应用架构。
目录
相关文章
|
3月前
|
监控 Java API
Spring Boot 3.2 结合 Spring Cloud 微服务架构实操指南 现代分布式应用系统构建实战教程
Spring Boot 3.2 + Spring Cloud 2023.0 微服务架构实践摘要 本文基于Spring Boot 3.2.5和Spring Cloud 2023.0.1最新稳定版本,演示现代微服务架构的构建过程。主要内容包括: 技术栈选择:采用Spring Cloud Netflix Eureka 4.1.0作为服务注册中心,Resilience4j 2.1.0替代Hystrix实现熔断机制,配合OpenFeign和Gateway等组件。 核心实操步骤: 搭建Eureka注册中心服务 构建商品
679 3
|
1月前
|
Cloud Native Serverless API
微服务架构实战指南:从单体应用到云原生的蜕变之路
🌟蒋星熠Jaxonic,代码为舟的星际旅人。深耕微服务架构,擅以DDD拆分服务、构建高可用通信与治理体系。分享从单体到云原生的实战经验,探索技术演进的无限可能。
微服务架构实战指南:从单体应用到云原生的蜕变之路
|
1月前
|
监控 Cloud Native Java
Spring Boot 3.x 微服务架构实战指南
🌟蒋星熠Jaxonic,技术宇宙中的星际旅人。深耕Spring Boot 3.x与微服务架构,探索云原生、性能优化与高可用系统设计。以代码为笔,在二进制星河中谱写极客诗篇。关注我,共赴技术星辰大海!(238字)
Spring Boot 3.x 微服务架构实战指南
|
3月前
|
负载均衡 监控 Java
微服务稳定性三板斧:熔断、限流与负载均衡全面解析(附 Hystrix-Go 实战代码)
在微服务架构中,高可用与稳定性至关重要。本文详解熔断、限流与负载均衡三大关键技术,结合API网关与Hystrix-Go实战,帮助构建健壮、弹性的微服务系统。
455 1
微服务稳定性三板斧:熔断、限流与负载均衡全面解析(附 Hystrix-Go 实战代码)
|
8月前
|
存储 NoSQL API
微服务——MongoDB实战演练——需求分析
本文档《5-MongoDB实战演练》聚焦于某头条文章评论业务的需求分析与功能实现。基于MongoDB,需完成以下功能:1)提供基本的增删改查API;2)支持通过文章ID查询相关评论;3)实现评论点赞功能。结合实际业务场景,演示MongoDB在数据存储与操作中的应用,附带示意图帮助理解业务结构。
134 2
微服务——MongoDB实战演练——需求分析
|
8月前
|
NoSQL MongoDB 微服务
微服务——MongoDB实战演练——文章评论的基本增删改查
本节介绍了文章评论的基本增删改查功能实现。首先,在`cn.itcast.article.dao`包下创建数据访问接口`CommentRepository`,继承`MongoRepository`以支持MongoDB操作。接着,在`cn.itcast.article.service`包下创建业务逻辑类`CommentService`,通过注入`CommentRepository`实现保存、更新、删除及查询评论的功能。最后,新建Junit测试类`CommentServiceTest`,对保存和查询功能进行测试,并展示测试结果截图,验证功能的正确性。
182 2
|
8月前
|
NoSQL Java MongoDB
微服务——MongoDB实战演练——文章评论实体类的编写
本节主要介绍文章评论实体类的编写,创建了包`cn.itcast.article.po`用于存放实体类。具体实现中,`Comment`类通过`@Document`注解映射到MongoDB的`comment`集合,包含主键、内容、发布时间、用户ID、昵称等属性,并通过`@Indexed`和`@CompoundIndex`注解添加单字段及复合索引,以提升查询效率。同时提供了Mongo命令示例,便于理解和操作。
155 2
|
8月前
|
NoSQL 测试技术 MongoDB
微服务——MongoDB实战演练——MongoTemplate实现评论点赞
本节介绍如何使用MongoTemplate实现评论点赞功能。传统方法通过查询整个文档并更新所有字段,效率较低。为优化性能,采用MongoTemplate对特定字段直接操作。代码中展示了如何利用`Query`和`Update`对象构建更新逻辑,通过`update.inc("likenum")`实现点赞数递增。测试用例验证了功能的正确性,确保点赞数成功加1。
188 0
|
8月前
|
NoSQL 测试技术 MongoDB
微服务——MongoDB实战演练——根据上级ID查询文章评论的分页列表
本节介绍如何根据上级ID查询文章评论的分页列表,主要包括以下内容:(1)在CommentRepository中新增`findByParentid`方法,用于按父ID查询子评论分页列表;(2)在CommentService中新增`findCommentListPageByParentid`方法,封装分页逻辑;(3)提供JUnit测试用例,验证功能正确性;(4)使用Compass插入测试数据并执行测试,展示查询结果。通过这些步骤,实现对评论的高效分页查询。
144 0
|
8月前
|
NoSQL MongoDB 微服务
微服务——MongoDB实战演练——文章微服务模块搭建
本节介绍文章微服务模块的搭建过程,主要包括以下步骤:(1)创建项目工程 *article*,并在 *pom.xml* 中引入依赖;(2)配置 *application.yml* 文件;(3)创建启动类 *cn.itcast.article.ArticleApplication*;(4)启动项目,确保控制台无错误提示。通过以上步骤,完成文章微服务模块的基础构建与验证。
115 0

热门文章

最新文章