写在前面

很多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: falseApiSecret: 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:5100ApiName: ocelotApiSecret: secretRequireHttpsMetadata: 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,生产用的一般会在本机配个agentPort: 8500Type: 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/ #你的eurekaShouldRegisterWithEureka: falseShouldFetchRegistry: 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: KubeNameSpace: 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. 一日一技:ASP.NET Core Api网关Ocelot初探

    概述 Ocelot面向使用.NET运行微型服务/面向服务的体系结构的人员,这些体系结构需要在系统中具有统一的入口点.特别是我想与IdentityServer参考和承载令牌轻松集成.Ocelot是按特定 ...

  2. 『Ocelot』.NET开源API网关 – Ocelot详细使用及其说明(可当文档收藏使用)

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

  3. .NET Core API网关Ocelot(十四)【转换Claims,日志,跟踪】

    Ocelot允许用户访问claims并把它们转换到头部,请求字符串参数和其他claims中.这仅在用户通过身份验证后才可用. 用户通过身份验证之后,我们运行claims转换中间件.这个中间件允许在授权 ...

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

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

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

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

  6. API网关—Ocelot

    API网关-Ocelot API网关 Ocelot Ocelot的基本使用 API网关 我们知道在微服务架构中,后端会有许许多多的服务实例,但是在UI上进行展示的时候,我们通常需要在一个界面上展示很多 ...

  7. API网关—Ocelot之服务发现

    API网关-Ocelot之服务发现 集成Consul 集成nacos 动态路由 扩展Ocelot对注册中心的适配 通过配置文件,我们可以设定路由规则模板,Ocelot网关会将接收到的符合规则的请求转发 ...

  8. API网关—Ocelot之负载均衡

    API网关-Ocelot之负载均衡 负载均衡 请求缓存 负载均衡 分布式架构中,当后端同一个应用的实例较多,负载均衡是非常必要的,否则前端对后端API的请求,可能只命中其中的几个应用实例,这几个实例压 ...

  9. API网关Ocelot 使用Polly 处理部分失败问题

    在实现API Gateway过程中,另外一个需要考虑的问题就是部分失败.这个问题发生在分布式系统中当一个服务调用另外一个服务超时或者不可用的情况.API Gateway不应该被阻断并处于无限期等待下游 ...

最新文章

  1. python生成随机数—random模块
  2. SQL Server select语句执行顺序
  3. Java 基础复习实践 --- Hashcode Equals
  4. ansys用什么cpu_ANSYS图形工作站与集群配置探讨201904-1
  5. 关于 SAP 产品 UI 的搜索引擎优化 SEO - Search Engine Optimization
  6. 网易邮箱大师如何定时发送 定时发送邮件方法步骤详解
  7. 科研诚信与学术规范_大学教授学术造假,违背科研诚信
  8. do…while 第二讲
  9. phalcon执行原始SQL查询语句
  10. 随想录(关于aarch64)
  11. Cause: org.apache.ibatis.binding.BindingException: Parameter 'eName' not found.解决方案
  12. python怎么制作简单图_Python简单的制作图片验证码实例
  13. Android图形显示系统——下层显示1:基础知识与相关文件
  14. 股票经典书籍推荐(豪华版)
  15. 挑战华为社招:智慧树java程序设计答案
  16. 2019暑期在校培训总结
  17. 计算机地图制图相关论文,计算机地图制图原理、特点及发展趋势论文
  18. 支付宝开发流程及注意事项
  19. Android源码学习------SystemUI(二)
  20. archlinux安装kde桌面和sddm登录管理器

热门文章

  1. stm32串口通讯问题
  2. ASP.NET程序中常用的三十三种代码(二)
  3. php html 伪静态,php 伪静态(url重写)的写法
  4. 收银员英文缩写_如何在没有收银员的苹果商店购买东西
  5. 甘特图看起来很生硬?教你使用智能颜色装饰你的甘特图!(二)
  6. 用window.location.href实现页面跳转
  7. 关于JAVA异常处理的20个最佳实践
  8. 实验三《实时系统的移植》 20145222黄亚奇 20145213祁玮
  9. 第五周项目2-对象作为数据成员
  10. 一个不成功人士的“成功之道”