不少neter都有在用Ocelot作Api网关,可是Ocelot又不像kong或者其余网关同样,开箱即用。它须要你单独开一个web项目来部署,这样不少同窗都在作重复的事了。html
这里[Hei.Ocelot.ApiGateway] 就把这件事给作了,之后有同窗要用的话能够单独拉下代码来部署,或者docker/k8s直接部署就行了(这是个人计划,后续怎么作可能要看我本身的需求,咱们公司内部部分项目也用);git
--你们也能够当成一个ocelot的demo哈,毕竟没什么代码量。github
基于此,本文目标读者是对Ocelot有初步了解的同窗。web
项目地址:https://github.com/gebiWangshushu/Hei.Ocelot.ApiGatewaydocker
项目结构很简单:api
Hei.Ocelot.ApiGateway 是主角,是我配置好的Ocelot网关;安全
Hei.Api 是网关测试用的Api;app
Hei.IdentityServer 是测试用的IdentityServer,给部分本身没准备好IdentityServer的同窗体验的;运维
裸机(Host)直接部署ide
直接clone项目下来,按需分别跑起来就行;
docker、docker-compose部署
一、clone项目下来,配置好 /Hei.Ocelot.ApiGateway/config 下的appsettings.yml;
二、把这个整个config目录拷贝到 /home/heidemo/config (由于我demo里面挂载在这个目录);
三、去项目根目录执行docker-compose up
(docker-compose.yml就在根目录,你能够注释掉你不想启用的service)
k8s部署
一、deploy.yml下载到本地,修改文件后面的ConfigMap节点,这部分是配置,含义跟其余部署方式同样;
二、执行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,美
咱们讲下各个功能怎么开启,随便简单聊聊怎么用。
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里的
一、先去IdentityServer申请token
POST http://172.16.3.117:5100/connect/token HTTP/1.1 Content-Type: application/x-www-form-urlencoded
二、去Hei-Ocelot-Gateway 查询配置
GET http://172.16.3.117:5100/administration/configuration HTTP/1.1 Authorization: Bearer token
红框中的就是步骤1申请的token。
三、更新Hei-Ocelot-Gateway 更新配置
POST http://172.16.3.117:5100/administration/configuration HTTP/1.1 Authorization: Bearer token
我发现这个admin Api配置好的配置,重启后又会复原为初始化状态,不知道是否是Bug。生产谨慎使用或有管理工具每次更新备份好再用。
你的网关后面有不少服务,某些服务安全性较高的话可接入IdentityServer作服务受权。
appsetting.yml
IdentityProvider: - Authority: http://172.16.3.117:5100 ApiName: ocelot ApiSecret: secret RequireHttpsMetadata: false
二、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": {} }
三、测试
咱们再次访问,http://172.16.3.117:5000/user 的受保护路由 http://172.16.3.117:5000/protect/user
申请token
再次访问
Ocelot 支持Consul和Eureka作服务发现,基本能知足咱们平常需求;
一、appsetting.yml
GlobalConfiguration: ServiceDiscoveryProvider: Host: 172.16.3.119 #这是我配置在其余机器的consul agent,生产用的通常会在本机配个agent Port: 8500 Type: Consul
二、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/ 就能访问到对应服务了;
一、appsetting.yml
Eureka: Client: ServiceUrl: http://localhost:8761/eureka/ #你的eureka ShouldRegisterWithEureka: false ShouldFetchRegistry: true
二、ocelot配置
GlobalConfiguration: ServiceDiscoveryProvider: Type: Eureka
三、测试
略,eureka环境给我删了,今天懒得搭了,若是需求强烈,我加上。
ocelot是支持k8s的,若是你启用k8s,那它在k8s集群里的角色比较接近于“ocelot-ingress”吧;而后我用的是
<PackageReference Include="Ocelot.Provider.Kubernetes" Version="16.0.1" />
16.0.0 有点问题,直接用
AddKubernetes()
访问总会报错,我换了种方式实现;
开启前你确定要搭建好k8s集群了;
一、ocelot配置
GlobalConfiguration: ServiceDiscoveryProvider: Type: Kube NameSpace: dotnetcore #这是我本身部署的HeiApi的命名空间,你的若是你的api有多个命名空间能够在路由里配置
二、ocelot新增路由
{ "DownstreamPathTemplate": "/{url}", "DownstreamScheme": "http", "UpstreamPathTemplate": "/kube/{url}", "ServiceName": "hei-ocelot-api", #"Namespace": "dev", #好比这里你的这个路由对应的serverName不是dotnetcore,你能够这样配置 "UpstreamHttpMethod": [ "Get" ] }
三、测试
咱们来访问咱们刚刚新增的路由对应地址: 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 (喜欢的话给我点个星~~)