服务网关Ocelot 入门Demo系列(01-Ocelot极简单Demo及负载均衡的配置)
【前言】
Ocelot是一个用.NET Core实现并且开源的API网关,它功能强大,包括了:路由、请求聚合、服务发现、认证、鉴权、限流熔断、并内置了负载均衡器与Service Fabric、Butterfly Tracing集成。这些功能只都只需要通过一个统一的Ocelot.Json配置文件简单的配置即可完成。
简单的来说Ocelot是一堆的asp.net core middleware组成的一个管道。
当它拿到请求之后会用一个request builder来构造一个HttpRequestMessage发到下游的真实服务器,等下游的服务返回response之后再由一个middleware将它返回的HttpResponseMessage映射到HttpResponse上。
Ocelot的基本使用
用一台web service来host Ocelot,在这里有一个json配置文件,里面设置了所有对当前这个网关的配置。它会接收所有的客户端请求,并路由到对应的下游服务器进行处理,再将请求结果返回。而这个上下游请求的对应关系也被称之为路由。
集成Identity Server
当我们涉及到认证和鉴权的时候,我们可以跟Identity Server进行结合。当网关需要请求认证信息的时候会与Identity Server服务器进行交互来完成。
网关集群
只有一个网关是很危险的,也就是我们通常所讲的单点,只要它挂了,所有的服务全挂。这显然无法达到高可用,所以我们也可以部署多台网关。当然这个时候在多台网关前,你还需要一台负载均衡器。
Consul 服务发现
在Ocelot已经支持简单的负载功能,也就是当下游服务存在多个结点的时候,Ocelot能够承担起负载均衡的作用。但是它不提供健康检查,服务的注册也只能通过手动在配置文件里面添加完成。这不够灵活并且在一定程度下会有风险。这个时候我们就可以用Consul来做服务发现,它能与Ocelot完美结合。
【Demo】
本篇文章为Ocelot入门的第一步要走的步骤,使用Ocelot作为微服务的网关
- Ocelot网关api的创建
- 三个下游Demo微服务接口的创建
- 网关轮询负载均衡的演示
【实现过程】
一、创建下游微服务
1. 新建3个asp.net core webapi项目,分别命名为Service1,Service2,Service3

2. 将三个项目的启动端口分别设置为39991,39992,39993
在每个服务的属性设置中将服务的host端口略作修改,分别叫做39991,39992,39993

3. 将默认的/api/values接口的返回值稍做修改,让其比较明显对应三个端口
打开默认生成的/api/Values控制器Action,改造原来的Get方法返回值,让其对应三个端口以便提高区分度
例如Service1:

Service2和Service3依次修改
二、Ocelot网关Api
1. 新建一个asp.net core webapi项目,命名为OcelotGateway

2. 该项目引入Nuget: Ocelot 最新稳定版


3. 根目录添加配置文件Ocelot.json,添加上述三个api地址信息
根目录下新建一个Jso文件

内容如下(最简单的配置,采用默认路由模板):
{
"ReRoutes": [
{
// - 上游服务配置
"UpstreamPathTemplate": "/{url}",
"UpstreamHttpMethod": [ "Get", "Post", "Put", "Delete" ],
// - 下游服务配置
"DownstreamPathTemplate": "/{url}",
"DownstreamScheme": "http",
"DownstreamHostAndPorts": [
{
"Host": "localhost",
"Port": 39991
},
{
"Host": "localhost",
"Port": 39992
},
{
"Host": "localhost",
"Port": 39993
}
],
// - LoadBalancer将决定负载均衡的算法,三种取值
// RoundRobin:轮流发送
// LeastConnection:将请求发往最空闲的那个服务器
// NoLoadBalance:总是发往第一个请求或者是服务发现
"LoadBalancerOptions": {
"Type": "RoundRobin"
}
}
],
"GlobalConfiguration": {
"BaseUrl": "https://api.mybusiness.com"
}
}

里面指定了相关配置项:
- 上游服务器请求路由模板
- 下游服务器转发时的请求路由模板
- 下游服务器的三个相同api的不同地址(模拟负载均衡)
- 负载均衡的策略(轮询)
4. 调整OcelotGateway项目的Programe和Start需要配置的相关代码(详情见代码)
修改Program.cs文件,引入Ocelot.Json

改造StartUp.cs文件的配置项,.netcore请求管道内加入Ocelot

三、运行
1. 先同时运行三个下游微服务,可以看到三个浏览器窗口分别返回了三个接口对应的返回值
可以在vs中设置多启动项,让三个服务同时启动


然后我们运行三个服务,可以看到三个浏览器窗口分别打开了三个服务,并返回了Demo api的返回值

三个微服务启动成功
2. 运行OcelotGateway项目,可以看到返回了第一个下游微服务的返回值
我们单独运行OcelotGateway项目

可以看到Ocelot服务也被host成功

并且通过通用模板转发到了其中一个微服务上,返回了响应值。
3. 刷新Gateway项目的窗口,可以看到根据我们配置的轮询复杂均衡策略分别轮询地返回了三个接口的结果
既然我们配置了轮询的负载均衡,那么我们刷新Gateway项目地址看是否会分别请求到三个微服务上。



Gif版本:

可以看到,相同的请求被转发到了不通的api接口上,且是按我们配置的负载均衡策略顺序轮询转发
【项目源码】
项目源码已托管至GitHub:https://github.com/sevenTiny/Demo.Ocelot
说明:为了更好地展示我们的项目配置是渐进性的,我们采用分支策略来展示不同阶段的Demo成果,master分支为当前所有配置的功能总和
例如:roadmap-01分支对应我们本篇文章的源代码,对应说明文档 “01-Ocelot极简单Demo及负载均衡的配置”
服务网关Ocelot 入门Demo系列(01-Ocelot极简单Demo及负载均衡的配置)的更多相关文章
- Asp.Net Core + Ocelot 网关搭建:负载均衡的配置
前言 上一篇中简单做了一个网关Demo.本篇中也记录一下负载均衡的配置实现. 演示 首先开三个服务,端口分别为 60001,60003,60005,然后分别启动三个服务.接下来在ApiGate ...
- Dubbo 系列(07-3)集群容错 - 负载均衡
目录 Dubbo 系列(07-3)集群容错 - 负载均衡 Spring Cloud Alibaba 系列目录 - Dubbo 篇 1. 背景介绍 1.1 负载均衡算法 1.2 继承体系 2. 源码分析 ...
- 服务注册中心之ZooKeeper系列(二) 实现一个简单微服务之间调用的例子
上一篇文章简单介绍了ZooKeeper,讲了分布式中,每个微服务都会部署到多台服务器上,那服务之间的调用是怎么样的呢?如图: 1.集群A中的服务调用者如何发现集群B中的服务提供者呢? 2.集群A中的服 ...
- 从零入门 Serverless | SAE 场景下,应用流量的负载均衡及路由策略配置实践
作者 | 落语 阿里云云原生技术团队 本文整理自<Serverless 技术公开课>,关注"Serverless"公众号,回复"入门",即可获取 S ...
- Nginx入门教程-简介、安装、反向代理、负载均衡、动静分离使用实例
场景 Nginx入门简介和反向代理.负载均衡.动静分离理解 https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/102790862 Ub ...
- spring cloud微服务快速教程之(三)声明式访问Feign、负载均衡Ribbon
0-前言 eureka实际上已经集成了负载均衡调度框架Ribbon: 我们有了各个微服务了,那怎么来调用他们呢,一种方法是可以使用 RestTemplate(如:String str= restTem ...
- api-gateway实践(04)新服务网关 - 新手入门
一.网关引擎环境 1.下载代码 2.搭建环境 3.打包部署 二.配置中心环境 1.下载代码 2.搭建环境 3.打包部署 三.创建业务实例 1.以租户身份登录配置中心,注册 group.version. ...
- 【转】《从入门到精通云服务器》第七讲—负载均衡和CDN技术
在IDC知识中,我们常常会遇上负载均衡与CDN的概念而不知所云.第一讲[什么是云计算], 我们提到过负载均衡,仅给大家留下了印象.这次我们将深入浅出的讲讲到底什么是负载均衡与CDN技术.---互联网数 ...
- 【转】Nginx系列(五)--nginx+tomcat实现负载均衡
原博文出于: http://blog.csdn.net/liutengteng130/article/details/47129909 感谢! Nginx占有内存少,并发能力强,事实上Nginx ...
随机推荐
- Thread类详解 多线程中篇(二)
Java.lang.Thread是Java应用程序员对Java多线程的第一站,Thread就是对Java线程本身的抽象 所以在Java中的线程编程概念中,一个Thread实例 == 一个线程 线程有哪 ...
- -1-1 java 基础语法 java关键字 java 注释 常量 语句 运算符 函数 数组定义
Java语言基础组成 关键字 标识符 注释 常量和变量 运算符 语句 函数 数组 关键字 定义:被Java语言赋予了特殊含义的单词 特点:关键字中所有字母都为小写 用于定义数据类型的关键字 class ...
- Zuul上实现限流(spring-cloud-zuul-ratelimit)
简述 Spring Cloud Zuul RateLimit项目Github地址: https://github.com/marcosbarbero/spring-cloud-zuul-ratelim ...
- Puppet部署Nginx返代示例
一.创建目录并编辑Nginx安装模块 mkdir -pv /etc/puppet/modules/nginx/{manifests,files,templates,spec,tests,lib} ]# ...
- SDWebImage源码解析
但凡经过几年移动开发经验的人去大公司面试,都会有公司问到,使用过哪些第三方,看过他们的源码嘛?而SDWebImage就是经常被面试官和应聘者的提到的.下面将讲述SDWebImage的源码解析以及实现原 ...
- Linux系统命令行整理
1.pwd 查看当前所在目录 2.cd / 跳往根目录 3.ls 查看当前目录所有子目录或文件 4.ls -l 列出当前目录详细信息 5.ls -lh h=human 人性化列出当前目录详细 ...
- 【转载】ASP.NET MVC重写URL制作伪静态网页,URL地址以.html结尾
在搜索引擎优化领域,静态网页对于SEO的优化有着很大的好处,因此很多人就想把自己的网站的一些网页做成伪静态.我们现在在网络上发现很多博客网站.论坛网站.CMS内容管理系统等都有使用伪静态这一种情况,伪 ...
- 【开源】SpringBootNetty聊天室V1.2.0升级版本介绍
前言 SpringBoot!微服务微架构的基础,Netty通信框架的元老级别框架,即之前的SpringBoot与Netty的实现聊天室的功能后已经过了不到一周的时间啦,今天我们更新了项目版本从V1.0 ...
- nodejs 动态创建二维码
<!--弹出二维码--> <div class="qrcode"> <div> <p id="saoma">扫描 ...
- css transition 实现滑入滑出
transition是css最简单的动画. 通常当一个div属性变化时,我们会立即看的变化,从旧样式到新样式是一瞬间的,嗖嗖嗖!!! 但是,如果我希望是慢慢的从一种状态,转变成另外一种状态,怎么办? ...