ASP.NET Core中Ocelot的使用:基于服务发现的负载均衡

本系列相关文章:

  • 《ASP.NET Core中Ocelot的使用:API网关的应用》

  • 《ASP.NET Core中Ocelot的使用:基于Spring Clound Netflix Eureka的动态路由》

本文将基于前两篇文章所述内容,继续介绍如何在服务发现和动态路由的基础上,使用Ocelot实现负载均衡。Ocelot本身是带有负载均衡功能的,这一点其实跟Nginx提供的HTTP load balancer是类似的功能(我觉得整个Ocelot提供的功能,通过Nginx也都可以实现,不过Ocelot更加.NET化,对于.NET开发人员来说更为简单和容易接受)。根据官方文档,Ocelot支持如下几种负载均衡策略:

  • LeastConnection:根据服务当前正在处理的请求个数来决定将使用哪个服务来处理新接收到的请求,将请求转发给当前连接数最少的服务

  • RoundRobin:经典模式,轮询法,逐个选择可用的服务来处理接收到的请求

  • NoLoadBalancer:仅使用第一个可用的服务来处理接收到的请求

  • CookieStickySessions:通过使用Cookie,确保特定的请求能够被分配到特定的服务上进行处理

今天我们选择RoundRobin来看看如何基于服务发现来实现负载均衡。同样,首先需要对架构进行调整。

调整架构

与上文中的架构相比,这里不会引入新的服务,而相比之下会让两个A服务的实例同时运行。调整后的架构如下图所示:

640?wx_fmt=png

整个API的调用过程如下:

  1. A服务的两个实例、B服务以及API网关在启动的时候均向Spring Cloud Eureka注册自己

  2. API用户通过访问Eureka获得API网关的地址

  3. API用户使用获得的API网关地址,发送一个查询A服务的请求

  4. API网关根据指定的A服务的名称,从Eureka查询A服务所注册的服务实例

  5. API网关根据设定的负载均衡策略,向找到的服务实例发出请求,并将调用结果反馈给API用户

可以看到,前面部分的调用过程与上文所述都是非常类似的,不同的仅有API网关在寻找A服务的实例这个部分,前面是直接获得访问地址,而此处则通过负载均衡来选择一个地址。接下来,我们看看如何改变我们的代码,来实现这个架构。

代码修改

这里的代码修改会基于上文结尾时的代码,也就是实现了Ocelot的动态路由。首先,我们在计算服务(也就是A服务)中增加一个API,用以返回当前设置在主机上的machineName环境变量(如果设置为空,那么就直接返回主机机器名):

1
2
3
4
5
6
7
8
9
10
[Route("api/[controller]")]
[ApiController]
public class ValuesController : ControllerBase
{
    [HttpGet("info")]
    public ActionResult<string> Info()
        => Environment.GetEnvironmentVariable("machineName") ?? Environment.MachineName;
    // 其它代码省略
}

然后,就是配置Ocelot,使其能够实现负载均衡:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
{
  "ReRoutes": [
  ],
  "GlobalConfiguration": {
    "RequestIdKey": "OcRequestId",
    "AdministrationPath": "/administration",
    "ServiceDiscoveryProvider": {
      "Host": "localhost",
      "Port": 8761,
      "Type": "Eureka",
      "Token": null,
      "ConfigurationKey": null
    },
    "LoadBalancerOptions": {
      "Type": "RoundRobin"
    },
    "DownstreamScheme": "http"
  }
}

只需注意上面的LoadBalancerOptions部分,这里我们采用了RoundRobin模式,这个配置文件的其它部分都与之前的一样,没有区别。

好了,代码改好了。什么?就改好了?对的,就是这么简单!接下来让我们测试一下。先在Eclipse里启动Spring Cloud Eureka:

640?wx_fmt=png

然后,进入CalcService的编译输出目录,首先设置machineName环境变量,然后用下面的命令启动服务:

640?wx_fmt=png

用同样的命令再启动另一个CalcService的实例:

640?wx_fmt=png

OK,两个CalcService的实例已经启动,分别侦听49814和49815两个端口,接下来,启动我们的Ocelot API网关。等Ocelot API网关启动之后,查看Eureka的服务注册,可以看到所有的服务已经就绪:

640?wx_fmt=png

请注意,对于CALC这个应用程序,我们可以看到,有两个实例已经注册成功。然后,我们通过访问API网关进而访问刚刚新加的Info API,可以看到,服务调用成功。然后按F5刷新,可见返回的结果会在CalcService-1与CalcService-2之间来回切换,也就意味着我们的请求被依次分配到两个不同的Calc服务的实例上执行。动图为证:


由此可见,我们已经实现了基于Ocelot API网关的负载均衡。当然,我们可以继续修改ASP.NET Core MVC的前端页面,让它能够直观地显示这个效果。这里也就不贴代码了,大家可以按本文后面的源代码链接下载源码,自己研究。

解决方案容器化

同样,我们可以把整个解决方案容器化,与上一篇文章所述的容器化有区别的一点是,对于CalcService的Dockerfile,我们要扩充它的EXPOSE的端口范围,原来是写死的49814,现在让它能够曝露从49800到49899的所有端口,以便新的服务可以通过不同的端口接收请求。此外,还需要在docker-compose.yml中增加另一个Calc服务的配置,详细可以仿照docker-compose.yml中已有的服务配置信息,这里也不多啰嗦了,源代码库中有完整的内容供参考。

完成这些配置之后,可以直接用docker-compose一次性启动所有服务,然后看看我们的API页面,其中的“计算服务名称”会随着页面的刷新动态改变:

640?wx_fmt=gif

总结

本文对前文的案例做了一些简单的调整,实现了基于Ocelot API网关的负载均衡。其实,负载均衡还可以实现在某个微服务的多个实例的层面,然后将这个层面的负载均衡器地址注册到Eureka上,也是可以的。这样的架构能够更好地控制每个服务的伸缩,并对其进行监控。接下来的文章中,我会继续尝试基于微服务的一些部署拓扑,以及在云中如何运行我们的微服务架构。

源代码的使用

请访问https://github.com/daxnet/ocelot-sample/releases/tag/chapter_3下载本文相关案例的源代码。

相关文章:

  • AspNetCore中使用Ocelot之 IdentityServer4

  • Ocelot-基于.NET Core的开源网关实现

  • .NET Core微服务之基于Ocelot+IdentityServer实现统一验证与授权

  • Swagger如何访问Ocelot中带权限验证的API

  • Ocelot.JwtAuthorize:一个基于网关的Jwt验证包

  • .NET Core微服务之基于Ocelot实现API网关服务

  • .NET Core微服务之基于Ocelot实现API网关服务(续)

  • .NET微服务体系结构中为什么使用Ocelot实现API网关

  • Ocelot简易教程(一)之Ocelot是什么

  • Ocelot简易教程(二)之快速开始1

  • Ocelot简易教程(二)之快速开始2

  • Ocelot简易教程(三)之主要特性及路由详解

  • Ocelot简易教程(四)之请求聚合以及服务发现

  • Ocelot简易教程(五)之集成IdentityServer认证以及授权

  • Ocelot简易教程(六)之重写配置文件存储方式并优化响应数据

  • Ocelot简易教程(七)之配置文件数据库存储插件源码解析

  • ASP.NET Core中Ocelot的使用:API网关的应用

  • ASP.NET Core中Ocelot的使用:基于Spring Cloud Netflix Eureka的动态路由

原文地址: http://sunnycoding.cn/2018/11/06/aspnetcore-ocelot-service-discovery-load-balancing/


.NET社区新闻,深度好文,欢迎访问公众号文章汇总 http://www.csharpkit.com

640?wx_fmt=jpeg

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

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

相关文章

POJ2155 - Matrix(二维树状数组)

POJ2155 - Matrix 文章目录题目题解&#xff1a;代码题目 给你一个二维矩阵&#xff0c;初始化为0&#xff0c;然后可以进行两次操作&#xff1a; C:x,y,x1,y2 对该小矩阵内的数进行取反 Q:查询某个点是0还是1 题解&#xff1a; C是区间修改&#xff0c;Q是单点查询&#xf…

.NET Core2使用Azure云上的Iot-Hub服务

基于工业4.0大背景下的工业物联网是近几年内热门的话题&#xff0c;依靠信息化技术企业可以实现数字化转型&#xff0c;生产可以实现智能化制造&#xff0c;设备可以实现自动化运作。然而&#xff0c;海量的数据采集是整个建设过程的基础环节&#xff0c;如何处理与利用这海量的…

SmartCode.ETL 这不是先有鸡还是蛋的问题!

继国庆节 SmartCode 正式版&#xff08;SmartCode.Generator&#xff09;发布之后&#xff0c;SmartCode 迎来了新的能力 SmartCode.ETL !SmartCode 正式版从开始发布就从未说过自己仅仅是个代码生成器&#xff0c;这点上从我第一次宣布SmartCode正式开源的文章就可以说明&…

dubbo线程池为什么耗尽

文章概述 大家可能都遇到过DUBBO线程池打满这个问题&#xff0c;报错如下&#xff0c;本文我们就一起分析DUBBO线程池打满这个问题。 cause: org.apache.dubbo.remoting.RemotingException: Server side(10.0.0.100,20881) thread pool is exhausted, detail msg:Thread pool …

手把手教你写DI_0_DI是什么?

DI是什么&#xff1f;Dependency Injection 常常简称为&#xff1a;DI。它是实现控制反转&#xff08;Inversion of Control – IoC&#xff09;的一个模式。fowler 大大大神 “几十年”前的经典文章 https://www.martinfowler.com/articles/injection.html 说的很清楚。“几十…

C++顺序创建txt文件

今天下午在对拍数据的时候感觉好麻烦。。 一次次手调文件名称&#xff0c;突然想起可以直接写段程序集中操作 顺序输出 #include <iostream> #include <fstream> #include<string> using namespace std;int main () {ofstream File;for(int i0;i<3;i){str…

使用Visual Studio Code开发.NET Core看这篇就够了

在本文中&#xff0c;我将带着大家一步一步的通过图文的形式来演示如何在Visual Studio Code中进行.NET Core程序的开发&#xff0c;测试以及调试。尽管Visual Studio Code的部分功能还达不到Visual Studio的水平&#xff0c;但它实际上已经足够强大来满足我们的日常开发。而且…

手把手教你写DI_3_小白徒手支持 Singleton 和 Scoped 生命周期

在上一节&#xff1a;手把手教你写DI_2_小白徒手撸构造函数注入浑身绷带的小白同学&#xff1a;我们继续开展我们的工作&#xff0c;大家都知道 Singleton是什么&#xff0c;就是全局只有一个呗&#xff0c;我们就先从它开始&#xff0c;这个多简单&#xff0c;我们找个字典放这…

手把手教你写DI_2_小白徒手撸构造函数注入

在上一节&#xff1a;手把手教你写DI_1_DI框架有什么&#xff1f;我们已经知道我们要撸哪些东西了那么我们开始动工吧&#xff0c;这里呢&#xff0c;我们找小白同学来表演下小白同学 &#xff1a;我们先定义一下我们的广告招聘纸有什么&#xff1a;好&#xff0c;我们实现两种…

服务器win2008 R2 x64 部署ASP.net core到IIS 并解决 HTTP Error 502.5 的问题

1、发布网站 &#xff1b;2、安装 vc_redist.x64 (Visual C Redistributable for Visual Studio 2015) 新装的系统没装的补丁&#xff0c;装过略过&#xff1b;3、安装WindowsHosting &#xff1a;如&#xff1a; dotnet-hosting-2.1.3-win &#xff1b;4、安装.Net Core SDK&…

Data Structure Problem

试题链接 题目描述 题意&#xff1a; 有两个序列&#xff0c; 操作1是将a序列的第x位改成y 操作2是将b序列的第x位改成y 操作3是找到一个cx&#xff0c;满足递推式c00&#xff0c;ci max(ci-1bi&#xff0c;ai) 题解&#xff1a; 官方题解 说实话我没大看懂。。。 题是我同…

定制Ocelot来满足需求

这篇文章&#xff0c;我们将从Ocelot的中间件源码分析&#xff0c;目前Ocelot已经实现那些功能&#xff0c;还有那些功能在我们实际项目中暂时还未实现&#xff0c;如果我们要使用这些功能&#xff0c;应该如何改造等方面来说明。一、Ocelot源码解读在使用一个组件前&#xff0…

【.NET Core项目实战-统一认证平台】第一章 功能及架构分析

从本文开始&#xff0c;我们正式进入项目研发阶段&#xff0c;首先我们分析下统一认证平台应该具备哪些功能性需求和非功能性需求&#xff0c;在梳理完这些需求后&#xff0c;设计好系统采用的架构来满足已有的需求和未来的扩展应用。1 功能性需求统一认证平台应该具备以下基本…

Shift and Reverse

题目链接 题意&#xff1a; 一个序列a1&#xff0c;a2&#xff0c;a3…an 选择一个i&#xff0c;然后将序列改成ai,ai-1,…a1,an,an-1,…ai1 可以进行无数次这样的操作 问&#xff1a;最多有多少不同的序列产生&#xff1f;&#xff08;答案mod1e97&#xff09; 题解&#xf…

Redis基本使用及百亿数据量中的使用技巧分享

作者&#xff1a;依乐祝原文地址&#xff1a;https://www.cnblogs.com/yilezhu/p/9941208.html作者&#xff1a;大石头时间&#xff1a;2018-11-10 晚上20&#xff1a;00地点&#xff1a;钉钉群&#xff08;组织代码BKMV7685&#xff09;QQ群&#xff1a;1600800内容&#xff1…

Subsequence Pair

题目 题目描述 题意&#xff1a; X和Y两个字符串&#xff0c;两个字符串各取子序列X1和Y1&#xff0c;问X1<Y1的情况下X1和Y1的长度和最长是多少&#xff1f; 比如例子&#xff1a; zazxwabzczazazd abcaa 第一个字符串选取子序列为azxwabzczazazd 第二个为bcaa azxwabzc…

【.NET Core项目实战-统一认证平台】第三章 网关篇-数据库存储配置(1)

本篇将介绍如何扩展Ocelot中间件实现自定义网关&#xff0c;并使用2种不同数据库来演示Ocelot配置信息存储和动态更新功能&#xff0c;内容也是从实际设计出发来编写我们自己的中间件&#xff0c;本文内容涵盖设计思想内容和代码内容&#xff0c;我希望园友们最好跟着我这个文章…

一个技术管理者的苦逼【技术管理漫谈】

希望给你3-5分钟的碎片化学习&#xff0c;可能是坐地铁、等公交&#xff0c;积少成多&#xff0c;水滴石穿&#xff0c;谢谢关注。角色转变 从工程师转技术管理这两年&#xff0c;好比头马变成车夫&#xff0c;除了角色认知的转变&#xff0c;还要看方向&#xff0c;定计划。不…

[机器翻译]参与 Microsoft 开放源代码软件项目的方式

下面是一个事实&#xff1a;Microsoft 托管在 GitHub&#xff0c;包括.NET 编译器平台&#xff0c;也称为"Roslyn"具有多达 4 万行代码等一些相当大的大约 2,000 开放源代码软件 (OSS) 存储库。很多开发人员的代码将更改提交到数以百万计的计算机运行的项目可能会令人…

【蓝桥杯】 2018年国赛 矩阵求和

题目 题目&#xff1a; 经过重重笔试面试的考验&#xff0c;小明成功进入 Macrohard 公司工作。 今天小明的任务是填满这么一张表&#xff1a; 表有 n 行 n 列&#xff0c;行和列的编号都从1算起。 其中第 i 行第 j 个元素的值是 gcd(i, j)的平方&#xff0c; gcd 表示最大公…