服务网关Ocelot 入门Demo系列(01-Ocelot极简单Demo及负载均衡的配置)

摘要:
路由、请求聚合、服务发现、认证、身份验证、电流限制和融合以及内置负载平衡器与ServiceFabric和ButterflyTracing集成。当网关需要请求身份验证信息时,它将与Identity Server服务器交互以完成请求。服务注册只能通过手动将其添加到配置文件来完成。

【前言】

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配置文件,里面设置了所有对当前这个网关的配置。它会接收所有的客户端请求,并路由到对应的下游服务器进行处理,再将请求结果返回。而这个上下游请求的对应关系也被称之为路由。

640?wx_fmt=jpeg&wxfrom=5&wx_lazy=1

集成Identity Server

当我们涉及到认证和鉴权的时候,我们可以跟Identity Server进行结合。当网关需要请求认证信息的时候会与Identity Server服务器进行交互来完成。

640?wx_fmt=jpeg

网关集群

只有一个网关是很危险的,也就是我们通常所讲的单点,只要它挂了,所有的服务全挂。这显然无法达到高可用,所以我们也可以部署多台网关。当然这个时候在多台网关前,你还需要一台负载均衡器。

640?wx_fmt=jpeg

Consul 服务发现

在Ocelot已经支持简单的负载功能,也就是当下游服务存在多个结点的时候,Ocelot能够承担起负载均衡的作用。但是它不提供健康检查,服务的注册也只能通过手动在配置文件里面添加完成。这不够灵活并且在一定程度下会有风险。这个时候我们就可以用Consul来做服务发现,它能与Ocelot完美结合。

640?wx_fmt=jpeg

【Demo】

  本篇文章为Ocelot入门的第一步要走的步骤,使用Ocelot作为微服务的网关

  1. Ocelot网关api的创建
  2. 三个下游Demo微服务接口的创建
  3.  网关轮询负载均衡的演示

【实现过程】

一、创建下游微服务

1. 新建3个asp.net core webapi项目,分别命名为Service1,Service2,Service3

服务网关Ocelot 入门Demo系列(01-Ocelot极简单Demo及负载均衡的配置)第5张

2. 将三个项目的启动端口分别设置为39991,39992,39993

在每个服务的属性设置中将服务的host端口略作修改,分别叫做39991,39992,39993

服务网关Ocelot 入门Demo系列(01-Ocelot极简单Demo及负载均衡的配置)第6张

3. 将默认的/api/values接口的返回值稍做修改,让其比较明显对应三个端口

 打开默认生成的/api/Values控制器Action,改造原来的Get方法返回值,让其对应三个端口以便提高区分度

例如Service1:

服务网关Ocelot 入门Demo系列(01-Ocelot极简单Demo及负载均衡的配置)第7张

Service2和Service3依次修改

二、Ocelot网关Api

1. 新建一个asp.net core webapi项目,命名为OcelotGateway

服务网关Ocelot 入门Demo系列(01-Ocelot极简单Demo及负载均衡的配置)第8张

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

服务网关Ocelot 入门Demo系列(01-Ocelot极简单Demo及负载均衡的配置)第9张

服务网关Ocelot 入门Demo系列(01-Ocelot极简单Demo及负载均衡的配置)第10张

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

根目录下新建一个Jso文件

服务网关Ocelot 入门Demo系列(01-Ocelot极简单Demo及负载均衡的配置)第11张

内容如下(最简单的配置,采用默认路由模板):

 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 }

服务网关Ocelot 入门Demo系列(01-Ocelot极简单Demo及负载均衡的配置)第12张

里面指定了相关配置项:

  • 上游服务器请求路由模板
  • 下游服务器转发时的请求路由模板
  • 下游服务器的三个相同api的不同地址(模拟负载均衡)
  • 负载均衡的策略(轮询)

4. 调整OcelotGateway项目的Programe和Start需要配置的相关代码(详情见代码)

 修改Program.cs文件,引入Ocelot.Json

服务网关Ocelot 入门Demo系列(01-Ocelot极简单Demo及负载均衡的配置)第13张

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

服务网关Ocelot 入门Demo系列(01-Ocelot极简单Demo及负载均衡的配置)第14张

三、运行

1. 先同时运行三个下游微服务,可以看到三个浏览器窗口分别返回了三个接口对应的返回值

可以在vs中设置多启动项,让三个服务同时启动

服务网关Ocelot 入门Demo系列(01-Ocelot极简单Demo及负载均衡的配置)第15张

服务网关Ocelot 入门Demo系列(01-Ocelot极简单Demo及负载均衡的配置)第16张

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

服务网关Ocelot 入门Demo系列(01-Ocelot极简单Demo及负载均衡的配置)第17张

三个微服务启动成功

2. 运行OcelotGateway项目,可以看到返回了第一个下游微服务的返回值

我们单独运行OcelotGateway项目

服务网关Ocelot 入门Demo系列(01-Ocelot极简单Demo及负载均衡的配置)第18张

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

服务网关Ocelot 入门Demo系列(01-Ocelot极简单Demo及负载均衡的配置)第19张

并且通过通用模板转发到了其中一个微服务上,返回了响应值。

3. 刷新Gateway项目的窗口,可以看到根据我们配置的轮询复杂均衡策略分别轮询地返回了三个接口的结果

 既然我们配置了轮询的负载均衡,那么我们刷新Gateway项目地址看是否会分别请求到三个微服务上。

服务网关Ocelot 入门Demo系列(01-Ocelot极简单Demo及负载均衡的配置)第20张

服务网关Ocelot 入门Demo系列(01-Ocelot极简单Demo及负载均衡的配置)第21张

服务网关Ocelot 入门Demo系列(01-Ocelot极简单Demo及负载均衡的配置)第22张

 Gif版本:

服务网关Ocelot 入门Demo系列(01-Ocelot极简单Demo及负载均衡的配置)第23张

可以看到,相同的请求被转发到了不通的api接口上,且是按我们配置的负载均衡策略顺序轮询转发

【项目源码】

项目源码已托管至GitHub:https://github.com/sevenTiny/Demo.Ocelot

说明:为了更好地展示我们的项目配置是渐进性的,我们采用分支策略来展示不同阶段的Demo成果,master分支为当前所有配置的功能总和

例如:roadmap-01分支对应我们本篇文章的源代码,对应说明文档 “01-Ocelot极简单Demo及负载均衡的配置

免责声明:文章转载自《服务网关Ocelot 入门Demo系列(01-Ocelot极简单Demo及负载均衡的配置)》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇移动App该如何保存用户密码(转)vue+uniapp 项目中一些常用知识下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

docker 和 FastDFS上传和下载文件

1,从仓库拉取镜像 sudo docker image pull delron/fastdfs  也可以解压已经打包好的镜像文件 $ sudo docker load -i 文件路径/fastdfs_docker.tar 2,开启tracker容器   将tracker运行目录映射到宿主机的/var/fdfs/tracker目录中 sudo docker...

Maven 多模块父子工程 (含Spring Boot示例)

 一、为什么要用Maven多模块 假设有这样一个项目,很常见的Java Web应用。在这个应用中,我们分了几层: Dao Service Web 对应的,在一个项目中,我们会看到一些包名: org.xx.app.dao org.xx.app.service org.xx.app.web org.xx.app.util 但随着项目的进行,你可能会遇...

vue版本更新

之前电脑已经安装 Node环境和 vue-cli脚手架,但是过段时间没有使用,然后现在用 vue-cli 搭建项目的时候,启动服务器的时候报错,无法启动成功,摸索半天,发现是因为 Node和vue-cli 的版本过低,都需要更新,更新过后成功启动...... 以下是 Node 和 vue-cli 更新的总结: 一. vue-cli更新   在百度了好久,...

使用log4j无法输出日志

前段时间在项目的过程中使用log4j来输出日志,但是在一个项目里我明明已经在src/main/resource目录下创建了log4j.properties。具体配置如下: log4j.rootLogger = INFO, stdout log4j.category.appcloud.approuter = INFO log4j.category.appcl...

IDEA中集成gitee插件

我的IDEA版本为2018.3.4,不同的IDEA版本操作相差无几,请参照下文开始使用Gitee插件吧!   IDEA版本 安装Gitee插件 【File】-【Settings】-【Plugins】,查看gitee插件并安装   安装Gitee插件 安装完成后,重启IDEA   重启IDEA 添加Gitee账户 【File...

DotNet Core 介绍

前言 asp.net core rtm 6月底即将发布,自己也想着为社区做点共享,刚好最近不太忙,看到社区的小伙伴们都在为dotnet core的推广而贡献力量,项目中刚好在用rc2版本,就多写些文章来帮助那些还在学习的朋友们吧。 目录 dotnet core 和 .net的区别 github中dotnet core各个项目的状况 一、 dotnet...