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

Containerizing ASP.net core API Gateways

写在前面

不少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

怎样跑起来

1597215263573

项目结构很简单: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

1597218730749

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里的

使用

一、先去IdentityServer申请token

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

1597203533753

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

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

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

1597203753334

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

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

1597204124724

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

集成IdentityServer作服务受权

你的网关后面有不少服务,某些服务安全性较高的话可接入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

1597219742675

申请token

1597220844358

再次访问

1597220881342

服务发现

Ocelot 支持Consul和Eureka作服务发现,基本能知足咱们平常需求;

Consul

开启配置

一、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/ 就能访问到对应服务了;

Eureka

开启配置

一、appsetting.yml

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

二、ocelot配置

GlobalConfiguration:
  ServiceDiscoveryProvider:
   Type: Eureka

三、测试

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

K8s支持

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环境)

1597229456658

你们也看到服务发现和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 (喜欢的话给我点个星~~)

本站公众号
   欢迎关注本站公众号,获取更多信息