Ocelot是一个用.NET Core实现而且开源的API网关,它功能强大,包括了:路由、请求聚合、服务发现、认证、鉴权、限流熔断、并内置了负载均衡器与Service Fabric、Butterfly Tracing集成。这些功能只都只须要经过一个统一的Ocelot.Json配置文件简单的配置便可完成。git
简单的来讲Ocelot是一堆的asp.net core middleware组成的一个管道。github
当它拿到请求以后会用一个request builder来构造一个HttpRequestMessage发到下游的真实服务器,等下游的服务返回response以后再由一个middleware将它返回的HttpResponseMessage映射到HttpResponse上。web
用一台web service来host Ocelot,在这里有一个json配置文件,里面设置了全部对当前这个网关的配置。它会接收全部的客户端请求,并路由到对应的下游服务器进行处理,再将请求结果返回。而这个上下游请求的对应关系也被称之为路由。算法
当咱们涉及到认证和鉴权的时候,咱们能够跟Identity Server进行结合。当网关须要请求认证信息的时候会与Identity Server服务器进行交互来完成。json
只有一个网关是很危险的,也就是咱们一般所讲的单点,只要它挂了,全部的服务全挂。这显然没法达到高可用,因此咱们也能够部署多台网关。固然这个时候在多台网关前,你还须要一台负载均衡器。api
在Ocelot已经支持简单的负载功能,也就是当下游服务存在多个结点的时候,Ocelot可以承担起负载均衡的做用。可是它不提供健康检查,服务的注册也只能经过手动在配置文件里面添加完成。这不够灵活而且在必定程度下会有风险。这个时候咱们就能够用Consul来作服务发现,它能与Ocelot完美结合。浏览器
本篇文章为Ocelot入门的第一步要走的步骤,使用Ocelot做为微服务的网关服务器
1、建立下游微服务负载均衡
1. 新建3个asp.net core webapi项目,分别命名为Service1,Service2,Service3asp.net
2. 将三个项目的启动端口分别设置为39991,39992,39993
在每一个服务的属性设置中将服务的host端口略做修改,分别叫作39991,39992,39993
3. 将默认的/api/values接口的返回值稍作修改,让其比较明显对应三个端口
打开默认生成的/api/Values控制器Action,改造原来的Get方法返回值,让其对应三个端口以便提升区分度
例如Service1:
Service2和Service3依次修改
2、Ocelot网关Api
1. 新建一个asp.net core webapi项目,命名为OcelotGateway
2. 该项目引入Nuget: Ocelot 最新稳定版
3. 根目录添加配置文件Ocelot.json,添加上述三个api地址信息
根目录下新建一个Jso文件
内容以下(最简单的配置,采用默认路由模板):
1 { 2 "ReRoutes": [ 3 { 4 // - 上游服务配置 5 "UpstreamPathTemplate": "/{url}", 6 "UpstreamHttpMethod": [ "Get", "Post", "Put", "Delete" ], 7 8 // - 下游服务配置 9 "DownstreamPathTemplate": "/{url}", 10 "DownstreamScheme": "http", 11 "DownstreamHostAndPorts": [ 12 { 13 "Host": "localhost", 14 "Port": 39991 15 }, 16 { 17 "Host": "localhost", 18 "Port": 39992 19 }, 20 { 21 "Host": "localhost", 22 "Port": 39993 23 } 24 ], 25 26 // - LoadBalancer将决定负载均衡的算法,三种取值 27 // RoundRobin:轮流发送 28 // LeastConnection:将请求发往最空闲的那个服务器 29 // NoLoadBalance:老是发往第一个请求或者是服务发现 30 "LoadBalancerOptions": { 31 "Type": "RoundRobin" 32 } 33 } 34 ], 35 "GlobalConfiguration": { 36 "BaseUrl": "https://api.mybusiness.com" 37 } 38 }
里面指定了相关配置项:
4. 调整OcelotGateway项目的Programe和Start须要配置的相关代码(详情见代码)
修改Program.cs文件,引入Ocelot.Json
改造StartUp.cs文件的配置项,.netcore请求管道内加入Ocelot
3、运行
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及负载均衡的配置”