写在前面

很多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. .NET Core 发布到 IIS

    ①右键项目->属性 将生成配置为Release ②右键项目->重新生成 ③提示生成成功后,右键项目->发布 点击新建,-> 这一步可以选择文件系统, 也可以选择IIS FT 以 ...

  2. mysql字符集 utf8 和utf8mb4 的区别

    一.导读我们新建mysql数据库的时候,需要指定数据库的字符集,一般我们都是选择utf8这个字符集,但是还会又一个utf8mb4这个字符集,好像和utf8有联系,今天就来解析一下这两者的区别. 二.起 ...

  3. NGINX 上的限流

    NGINX 上的限流(译) zlup YP小站  今天 前言 本文是对Rate Limiting with NGINX and NGINX Plus的主要内容(去掉了关于NGINX Plus相关内容) ...

  4. 看完这篇,再也不怕被问到 AsyncTask 的原理了

    本文很多资料基于Google Developer官方对AsyncTask的最新介绍. AsyncTask 是什么 AsyncTask is designed to be a helper class ...

  5. Python访问元组

    Python访问元组: 使用索引下标进行访问元组: # 通过索引下标进行访问 tuple_1 = ('a','b','c','d','e','f','g') # 输出元组中的第一个值 print(tu ...

  6. luogu P4726 【模板】多项式指数函数 多项式 exp 牛顿迭代 泰勒展开

    LINK:多项式 exp 做多项式的题 简直在嗑药. 前置只是 泰勒展开 这个东西用于 对于一个函数f(x) 我们不好得到 其在x处的取值. 所以另外设一个函数g(x) 来在x点处无限逼近f(x). ...

  7. RDD和Dataframe相互转换

    参考:https://www.cnblogs.com/starwater/p/6841807.html 在spark中,RDD.DataFrame.Dataset是最常用的数据类型,本博文给出笔者在使 ...

  8. [转] SpringBoot返回json 数据以及数据封装

    作者:武哥     来源:武哥聊编程   https://mp.weixin.qq.com/s/QZk0sKxBX4QZiCTHQIA6pg 1. Spring Boot关于Json的知识点 在项目开 ...

  9. [转]为什么阿里巴巴要禁用Executors创建线程池?

    作者:何甜甜在吗 链接:https://juejin.im/post/5dc41c165188257bad4d9e69 来源:掘金 看阿里巴巴开发手册并发编程这块有一条:线程池不允许使用Executo ...

  10. python字符串和数字的基本运算符

    python字符穿的4种表达方式 name='张三' name="张三" name='''张三''' name="""张三""&q ...