[Hei-Ocelot-Gateway ].Net Core Api网关Ocelot的开箱即用版本

写在前面
很多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的开箱即用版本的更多相关文章
- 初探.Net Core API 网关Ocelot(一)
一.介绍 Ocelot 是基于.NetCore实现的开源的API网关,支持IdentityServer认证.Ocelot具有路由.请求聚合.服务发现.认证.鉴权.限流熔断等功能,并内置了负载均衡器与S ...
- Asp.Net Core API网关Ocelot
首先,让我们简单了解下什么是API网关? API网关是一个服务器,是系统的唯一入口.从面向对象设计的角度看,它与外观模式类似.API网关封装了系统内部架构,为每个客户端提供一个定制的API.它可能还具 ...
- Net Core API网关Ocelot
Ocelot在github的地址 https://github.com/TomPallister/Ocelot , 非常给力的是在课程当天完成了.NET Core 2.0的升级,升级过程请看https ...
- ASP.NET Core Api网关Ocelot的中文文档
架构图 入门 不支持 配置 路由 请求聚合 GraphQL 服务发现 微服务ServiceFabric 认证 授权 Websockets 管理 流量控制 缓存 QoS服务质量 转换Headers 转换 ...
- .NET Core 微服务—API网关(Ocelot) 教程 [二]
上篇文章(.NET Core 微服务—API网关(Ocelot) 教程 [一])介绍了Ocelot 的相关介绍. 接下来就一起来看如何使用,让它运行起来. 环境准备 为了验证Ocelot 网关效果,我 ...
- .NET Core 微服务—API网关(Ocelot) 教程 [三]
前言: 前一篇文章<.NET Core 微服务—API网关(Ocelot) 教程 [二]>已经让Ocelot和目录api(Api.Catalog).订单api(Api.Ordering)通 ...
- .NET Core开源API网关 – Ocelot中文文档
Ocelot是一个用.NET Core实现并且开源的API网关,它功能强大,包括了:路由.请求聚合.服务发现.认证.鉴权.限流熔断.并内置了负载均衡器与Service Fabric.Butterfly ...
- .Net Core的API网关Ocelot使用 (一)
1.什么是API网关 API网关是微服务架构中的唯一入口,它提供一个单独且统一的API入口用于访问内部一个或多个API.它可以具有身份验证,监控,负载均衡,缓存,请求分片与管理,静态响应处理等.API ...
- .NET Core 微服务—API网关(Ocelot) 教程 [一]
前言: 最近在关注微服务,在 eShop On Containers 项目中存在一个API网关项目,引起想深入了解下它的兴趣. 一.API网关是什么 API网关是微服务架构中的唯一入口,它提供一个单独 ...
随机推荐
- 循序渐进nginx(三):日志管理、http限流、https配置,http_rewrite模块,第三方模块安装,结语
目录 日志管理 access_log error_log 日志文件切割 自定义错误页 http访问限流 限制请求数 语法 使用 限制连接数 语法 测试 补充: https配置 使用 生成证书 配置ng ...
- 宽度优先搜索--------迷宫的最短路径问题(dfs)
宽度优先搜索运用了队列(queue)在unility头文件中 源代码 #include<iostream>#include<cstdio>#include<queue&g ...
- ~~网络编程(三):TCP/UDP~~
进击のpython ***** 网络编程--TCP/UDP协议 其实你也发现了,应用层是交给应用来处理的,我们什么也做不了 相较于网络编程来说,我们更重要的是在做应用层和传输层的对接 因为你也看到了, ...
- python的pyc文件
编译型语言在程序执行之前,先会通过编译器对程序执行一个编译的过程,把程序转变成机器语言.运行时就不需要翻译,而直接执行就可以了.最典型的例子就是C语言. 解释型语言就没有这个编译的过程,而是在程序运行 ...
- Android实现QQ登录
https://www.jianshu.com/p/e59bc198e88f
- 如何在 UltraEdit 删除空行(含空格,制表符)
如何在 UltraEdit 删除空行(含空格,制表符) 打开UltraEdit,ctrl+r弹出替换对话框,点选启用正则表达式方法1:在查找框输入 ^p^p:在替换框输入 ^p执行全部替换:这种方法是 ...
- PHP timezone_location_get() 函数
------------恢复内容开始------------ 实例 返回指定时区的位置信息: <?php$tz=timezone_open("Asia/Taipei");ec ...
- PHP timezone_identifiers_list() 函数
------------恢复内容开始------------ 实例 输出非洲的所有时区: <?phpprint_r(timezone_identifiers_list(1));?> 运行实 ...
- 一个轻量级的基于RateLimiter的分布式限流实现
上篇文章(限流算法与Guava RateLimiter解析)对常用的限流算法及Google Guava基于令牌桶算法的实现RateLimiter进行了介绍.RateLimiter通过线程锁控制同步,只 ...
- RabbitMQ学习总结(3)-集成SpringBoot
1. pom.xml引用依赖 SpringBoot版本可以自由选择,我使用的是2.1.6.RELEASE,使用starter-web是因为要使用Spring的相关注解,所以要同时加上. <dep ...