写在前面

很多neter都有在用Ocelot做Api网关,但是Ocelot又不像kong或者其他网关一样,开箱即用。它需要你单独开一个web项目来部署,这样很多同学都在做重复的事了。

这里[Hei.Ocelot.ApiGateway] 就把这件事给做了,以后有同学要用的话可以单独拉下代码来部署,或者docker/k8s直接部署就好了(这是我的计划,后续怎么做可能要看我自己的需求,我们公司内部部分项目也用);

--大家也可以当成一个ocelot的demo哈,毕竟没什么代码量。

基于此,本文目标读者是对Ocelot有初步了解的同学。

项目地址:https://github.com/gebiWangshushu/Hei.Ocelot.ApiGateway

怎样跑起来

项目结构很简单:

Hei.Ocelot.ApiGateway 是主角,是我配置好的Ocelot网关;

Hei.Api 是网关测试用的Api;

Hei.IdentityServer 是测试用的IdentityServer,给部分自己没准备好IdentityServer的同学体验的;

裸机(Host)直接部署

直接clone项目下来,按需分别跑起来就行;

docker、docker-compose部署

1、clone项目下来,配置好 /Hei.Ocelot.ApiGateway/config 下的appsettings.yml;

2、把这个整个config目录拷贝到 /home/heidemo/config (因为我demo里面挂载在这个目录);

3、去项目根目录执行docker-compose up (docker-compose.yml就在根目录,你可以注释掉你不想启用的service)

k8s部署

1、deploy.yml下载到本地,修改文件后面的ConfigMap节点,这部分是配置,含义跟其他部署方式一样;

2、执行kubectl apply -f deploy.yml;

我自己部署的

Hei.Ocelot.ApiGateway 网关地址:http://172.16.3.117:5000

Hei.Api地址:http://172.16.3.117:5003

Hei.IdentityServer地址:http://172.16.3.117:5100

通过网关访问下我的HeiApi:

http://172.16.3.117:5000/user、http://172.16.3.117:5000/WeatherForecast

OK,美

我们讲下各个功能怎么开启,随便简单聊聊怎么用。

启用Admin Api 管理配置

Ocelot 有一堆的配置https://ocelot.readthedocs.io/en/latest/features/configuration.html,Ocelot 支持在运行时动态改配置,Ocelot 提供了对应的Rest Api 修改即时生效。不然每次改一点点配置都要找运维挺麻烦的;

对应的Rest Api是用IdentityServer保护的,可以直接配置用已搭建好的IdentityServer或者用Ocelot内置的IdentityServer,用来做这个Api的授权。我们实现的是前者;

开启配置

appsetting.yml加上以下配置即可启用:

Administration:
Path: /administration #这里是admin api的目录
IdentityServer:
Authority: http://172.16.3.117:5100 #IdentityServer地址
ApiName: ocelot #这些是我配置好在IdentityServer里的
RequireHttpsMetadata: false
ApiSecret: secret #这些是我配置好在IdentityServer里的

使用

1、先去IdentityServer申请token

POST http://172.16.3.117:5100/connect/token HTTP/1.1
Content-Type: application/x-www-form-urlencoded

2、去Hei-Ocelot-Gateway 查询配置

GET http://172.16.3.117:5100/administration/configuration HTTP/1.1
Authorization: Bearer token

红框中的就是步骤1申请的token。

3、更新Hei-Ocelot-Gateway 更新配置

POST http://172.16.3.117:5100/administration/configuration HTTP/1.1
Authorization: Bearer token

我发现这个admin Api配置好的配置,重启后又会复原为初始化状态,不知道是不是Bug。生产谨慎使用或有管理工具每次更新备份好再用。

集成IdentityServer做服务授权

你的网关后面有很多服务,某些服务安全性较高的话可接入IdentityServer做服务授权。

开启配置

appsetting.yml

IdentityProvider:
- Authority: http://172.16.3.117:5100
ApiName: ocelot
ApiSecret: secret
RequireHttpsMetadata: false

2、ocelot路由配置

然后使用前面搭建好的Admin Api,或者你用的是配置文件,加上以下Routes:

{
"DownstreamPathTemplate": "/{url}",
"DownstreamScheme": "http",
"DownstreamHostAndPorts": [{
"Host": "172.16.3.117",
"Port": 5003
}],
"UpstreamPathTemplate": "/protect/{url}",
"UpstreamHttpMethod": ["Get", "Post", "Put"],
"AuthenticationOptions": {
"AuthenticationProviderKey": "ocelot",
"AllowedScopes": []
},
"RouteClaimsRequirement": {}
}

3、测试

我们再次访问,http://172.16.3.117:5000/user 的受保护路由 http://172.16.3.117:5000/protect/user

申请token

再次访问

服务发现

Ocelot 支持Consul和Eureka做服务发现,基本能满足我们日常需求;

Consul

开启配置

1、appsetting.yml

GlobalConfiguration:
ServiceDiscoveryProvider:
Host: 172.16.3.119 #这是我配置在其他机器的consul agent,生产用的一般会在本机配个agent
Port: 8500
Type: Consul

2、ocelot路由配置

首先要求你们的服务要注册到Consul,这里我自己注册了一个叫MessageApi的服务;

加上以下Routes:

{
"DownstreamPathTemplate": "/api/{url}",
"DownstreamScheme": "http",
"UpstreamPathTemplate": "/consul/{url}",
"UpstreamHttpMethod": [ "Get", "Post", "Put" ],
"ServiceName": "MessageApi",
"LoadBalancerOptions": {
"Type": "LeastConnection"
}
}

这样你访问网关 http://172.16.3.117:5000/consul/ 就能访问到对应服务了;

Eureka

开启配置

1、appsetting.yml

Eureka:
Client:
ServiceUrl: http://localhost:8761/eureka/ #你的eureka
ShouldRegisterWithEureka: false
ShouldFetchRegistry: true

2、ocelot配置

GlobalConfiguration:
ServiceDiscoveryProvider:
Type: Eureka

3、测试

略,eureka环境给我删了,今天懒得搭了,如果需求强烈,我加上。

K8s支持

ocelot是支持k8s的,如果你启用k8s,那它在k8s集群里的角色比较接近于“ocelot-ingress”吧;然后我用的是

<PackageReference Include="Ocelot.Provider.Kubernetes" Version="16.0.1" />

16.0.0 有点问题,直接用AddKubernetes()访问总会报错,我换了种方式实现;

开启配置

开启前你肯定要搭建好k8s集群了;

1、ocelot配置

GlobalConfiguration:
ServiceDiscoveryProvider:
Type: Kube
NameSpace: dotnetcore #这是我自己部署的HeiApi的命名空间,你的如果你的api有多个命名空间可以在路由里配置

2、ocelot新增路由

 {
"DownstreamPathTemplate": "/{url}",
"DownstreamScheme": "http",
"UpstreamPathTemplate": "/kube/{url}",
"ServiceName": "hei-ocelot-api",
#"Namespace": "dev", #比如这里你的这个路由对应的serverName不是dotnetcore,你可以这样配置
"UpstreamHttpMethod": [ "Get" ]
}

3、测试

我们来访问我们刚刚新增的路由对应地址: http://172.16.1.30:31500/kube/user (之所以换了地址是因为我刚刚172。16.3.117那台机没搭k8s环境)

大家也看到服务发现和k8s(在ocelot这里也是一种新式的服务发现)都在配置GlobalConfiguration:ServiceDiscoveryProvider: 下面,那Consul和eureka和k8s是互斥的,都有配置的话优先级consul>eureka>k8s

总结

我大概看着自己的需求实现了部分需要单独引用拓展包才能启用的功能,但是还有部分功能未有实现,比如Caching、Tracing这些(大家可以修改测好后直接提pr,我不是懒得写而是测试麻烦,懒哈哈)

同样,不需要引用包,单独配置就可以启用的功能,都一一保留着,比如

  • 限流
  • 服务熔断降级
  • 求求合并
  • 请求头转换等等

参考

https://ocelot.readthedocs.io/en/latest/

项目地址

https://github.com/gebiWangshushu/Hei.Ocelot.ApiGateway (喜欢的话给我点个星~~)

[Hei-Ocelot-Gateway ].Net Core Api网关Ocelot的开箱即用版本的更多相关文章

  1. 初探.Net Core API 网关Ocelot(一)

    一.介绍 Ocelot 是基于.NetCore实现的开源的API网关,支持IdentityServer认证.Ocelot具有路由.请求聚合.服务发现.认证.鉴权.限流熔断等功能,并内置了负载均衡器与S ...

  2. Asp.Net Core API网关Ocelot

    首先,让我们简单了解下什么是API网关? API网关是一个服务器,是系统的唯一入口.从面向对象设计的角度看,它与外观模式类似.API网关封装了系统内部架构,为每个客户端提供一个定制的API.它可能还具 ...

  3. Net Core API网关Ocelot

    Ocelot在github的地址 https://github.com/TomPallister/Ocelot , 非常给力的是在课程当天完成了.NET Core 2.0的升级,升级过程请看https ...

  4. ASP.NET Core Api网关Ocelot的中文文档

    架构图 入门 不支持 配置 路由 请求聚合 GraphQL 服务发现 微服务ServiceFabric 认证 授权 Websockets 管理 流量控制 缓存 QoS服务质量 转换Headers 转换 ...

  5. .NET Core 微服务—API网关(Ocelot) 教程 [二]

    上篇文章(.NET Core 微服务—API网关(Ocelot) 教程 [一])介绍了Ocelot 的相关介绍. 接下来就一起来看如何使用,让它运行起来. 环境准备 为了验证Ocelot 网关效果,我 ...

  6. .NET Core 微服务—API网关(Ocelot) 教程 [三]

    前言: 前一篇文章<.NET Core 微服务—API网关(Ocelot) 教程 [二]>已经让Ocelot和目录api(Api.Catalog).订单api(Api.Ordering)通 ...

  7. .NET Core开源API网关 – Ocelot中文文档

    Ocelot是一个用.NET Core实现并且开源的API网关,它功能强大,包括了:路由.请求聚合.服务发现.认证.鉴权.限流熔断.并内置了负载均衡器与Service Fabric.Butterfly ...

  8. .Net Core的API网关Ocelot使用 (一)

    1.什么是API网关 API网关是微服务架构中的唯一入口,它提供一个单独且统一的API入口用于访问内部一个或多个API.它可以具有身份验证,监控,负载均衡,缓存,请求分片与管理,静态响应处理等.API ...

  9. .NET Core 微服务—API网关(Ocelot) 教程 [一]

    前言: 最近在关注微服务,在 eShop On Containers 项目中存在一个API网关项目,引起想深入了解下它的兴趣. 一.API网关是什么 API网关是微服务架构中的唯一入口,它提供一个单独 ...

随机推荐

  1. 全卷积神经网络FCN详解(附带Tensorflow详解代码实现)

    一.导论 在图像语义分割领域,困扰了计算机科学家很多年的一个问题则是我们如何才能将我们感兴趣的对象和不感兴趣的对象分别分割开来呢?比如我们有一只小猫的图片,怎样才能够通过计算机自己对图像进行识别达到将 ...

  2. sscanf,sprintf(思修课的收获)

    转载的,就是做个笔记 sprintf函数原型为 int sprintf(char *str, const char *format, ...).作用是格式化字符串,具体功能如下所示: (1)将数字变量 ...

  3. 关于if后有无else谜题

    在自定义函数中 for(i=1;i<=6;i++) { if(a%i==0) return 0; else return 1; } 意思是,如果有一个除不尽就返回零,有一个除尽会立刻返回一. 如 ...

  4. Day03_企业权限管理(SSM整合)

    学于黑马程序员和传智播客联合做的教学项目 感谢 黑马程序员官网 传智播客官网 个人根据教程的每天的工作进度的代码和资料 密码:cti5 b站在线视频 微信搜索"艺术行者",关注并回 ...

  5. 接口工具Apifox

    最近发现一款接口测试工具--apifox,我我们很难将它描述为一款接口管理工具 或 接口自测试工具. 官方给了一个简单的公式,更能说明apifox可以做什么. Apifox = Postman + S ...

  6. PHP array_uintersect() 函数

    实例 比较两个数组的键值(使用用户自定义函数比较键值),并返回交集: <?php function myfunction($a,$b) { if ($a===$b) { return 0; } ...

  7. luogu P3645 [APIO2015]雅加达的摩天楼 分块 根号分治

    LINK:雅加达的摩天楼 容易想到设\(f_{i,j}\)表示第i个\(doge\)在第j层楼的最小步数. 转移显然是bfs.值得一提的是把初始某层的\(doge\)加入队列 然后转移边权全为1不需要 ...

  8. CF R638 div2 F Phoenix and Memory 贪心 线段树 构造 Hall定理

    LINK:Phoenix and Memory 这场比赛标题好评 都是以凤凰这个单词开头的 有凤来仪吧. 其实和Hall定理关系不大. 不过这个定理有的时候会由于 先简述一下. 对于一张二分图 左边集 ...

  9. CF R 635 div1 C Kaavi and Magic Spell 区间dp

    LINK:Kaavi and Magic Spell 一打CF才知道自己原来这么菜 这题完全没想到. 可以发现 如果dp f[i][j]表示前i个字符匹配T的前j个字符的方案数 此时转移变得异常麻烦 ...

  10. 使用jsdelivr + GitHub + PicGo搭建免费图床

    前言 之前一直有开通有道云笔记会员,主要是为了会员markdown图片可以在线保存的功能,前一阵子会员到期,考虑这个功能可不可以自己单独实现,从而替代使用有道云会员. 通过网上搜索的方式,查询到了几种 ...