.Net Core 基于Ocelot + IdentityServer4 + Eureka的搭建高性能网关介绍
Posted yangzhiqing
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了.Net Core 基于Ocelot + IdentityServer4 + Eureka的搭建高性能网关介绍相关的知识,希望对你有一定的参考价值。
本文以贝海API Gateway的技术改造为切入点,带大家了解贝海在dotnet core在贝海的使用情况。
全文约一万字,可参阅下面的大纲阅读。
1、背景介绍
2、ocelot网关介绍
3、ocelot网关授权认证
3.1 授权服务IdentityServer介绍
3.2 ocelot网关接入授权认证
3.3 下游微服务接入授权认证
4、服务注册与发现
4.1 Eureka介绍
4.2 启动Eureka
4.3 下游微服务接入Eureka
4.4 ocelot网关接入Eureka
5、性能测试
6、总结
1、背景介绍
API网关的流行源于最近几年移动应用与企业间接口对接的兴起,使得原来单一的PC客户端,变化到PC客户端、各种浏览器、手机移动端及智能终端等。同时系统之间大部分都不是单独运行,经常会涉及与其他系统对接、共享数据的需求。随着微服务架构概念的提出,API网关成为了微服务架构的一个标配组件。
随着贝海业务快速发展,面向手机移动应用业务越来越多,为了减少客户端与服务的耦合,节约后端微服务的开发成本,建立一个高性能、高可用、减少上线风险的API网关成为一个迫切的需求。
2、Ocelot网关介绍
Ocelot是什么?
简单的来说Ocelot是一堆的asp.net core middleware组成的一个管道,当它拿到请求之后会用一个request builder来构造一个HttpRequestMessage发到下游的API服务器,等下游的服务返回response之后再由中间件将它返回的HttpResponseMessage映射到HttpResponse上。
通过Ocelot建立的网关,根据配置接收所有的客户端请求,并路由到对应的下游服务器进行处理,再将请求结果返回。
接下来我们做一个完整的示例,它将包括以下几个应用:
1、ApiGateway,模拟网关的功能;
2、ApiProvider,用来模拟微服务,提供接口给网关调用;
3、IdentityServer,用来模拟身份认证系统,给网关和微服务提供授权认证;
4、Eureka,提供一个服务注册中心,供以上站点使用。
首先我们新建一个服务提供者(ApiProvider,端口:5002),使用MVC,提供一个/values接口,返回一个数组。
然后我们新建一个网关项目(ApiGateway,端口:5001),Nuget引用Ocelot,修改Startup类
ocelot.json 配置
小结:
通过以上的代码及配置,我们使用ocelot中间件建立了一个网关,并暴露了一个接口:http://localhost:5001/values,将它映射到下游微服务:http://localhost:5002/api/values
3、Ocelot网关授权认证
现在我们已经拥有了一个简单的网,它可以通过配置文件将接口转发给下游微服务,但通常情况下请求到达网关后,我们需要对请求进行认证以及鉴权,在认证通过以后才能将请求转发给下游的API。
让我们先修改一下网关的工作流程图:
当接口需要鉴权的时候,我们加入了一个鉴权服务,当请求到达网关ocelot会先请求鉴权服务进行验证,如果通过再将请求转发到下游微服务的接口,如果验证失败则直接返回401未授权。
Ocelot目前支持JWT Tokens和 identity server Tokens的认证,下面介绍一下IdentityServer的使用
3.1 授权服务IdentityServer介绍
我们通过IdnetityServer4实现一个标准的Oauth2.0协议的服务端,来实现对网关的授权认证;
Oauth2.0通常有以下四种授权模式:
1、授权码模式(authorization code)
2、简化模式(implicit)
3、密码模式(resource owner password credentials)
4、客户端模式(client credentials)
这里的例子我们使用第4种 密码模式(resource owner password)
步骤如下:
a) 客户端输入账户密码向授权服务器请求token:
b) 授权服务器验证信息后返回token
新建一个.Net Core 的项目,Nuget引用IdentityServer4,然后修改Startup类
以上IdentityServer为Mock代码,Identityserver4支持数据库持久化配置,具体参见文档:https://identityserver4.readthedocs.io/en/release/
现在我们使用postman调用/connect/token接口,生成一个可用的AccessToken
3.2 ocelot网关接入授权认证
我们稍微修改ApiGateway,引用IdentityServer4.AccessTokenValidation,修改Startup类ConfigureServices方法添加IdentityServer相关代码
修改ocelot.json的配置,我们将/values接口的配置添加红框中的节点,设置为授权才能访问
dotnet run运行这三个项目,使用postman调用网关的/values接口,我们会得到以下结果:Http 401 Unauthorized,返回请求失败未授权
然后我们用从IdentityServer那里拿到的accessToken,将token加入到Head中再次请求网关接口,我们会得到正常的返回:
小结:
我们通过IdentityServer建立了一个提供授权认证的服务,在网关中添加相应配置就能为网关接口添加鉴权。
PS:IdentityServer服务获取token的接口http://localhost:5003/connect/token,我们通常也要在配置在ocelot.json文件中,方便客户端调用。
3.3 下游微服务接入授权认证
通上述程序,实际上我们已经将网关与下游微服务做好了分离登录的功能。通常情况下,授权生成的token会包含一些客户端的身份信息,后端服务也会需要请求接口的身份信息,那么我们后端API如何拿到这个信息呢?
现在我们来修改下提供服务的项目,和网关一样都Nuget引用IdentityServer4.AccessTokenValidation.dll,然后修改Startup类
有了以上红框内的代码,我们在授权生成的token中的用户数据,就可以在HttpContext.User.Claims中拿到了,修改一下下游服务ApiProvider中/values接口的代码,我们输出一下所有的Claims来查看一下输出。
一切准备就绪,现在我们再请求一下网关的/values接口,看看都输出了些什么
现在我们可以直接在下游微服务可以直接拿到token解密后的信息了。
小结:
我们通过使用IdentityServer这个优秀的中间件做了一个授权认证服务,用来连接网关和下游各个微服务系统,不用自己去实现一个繁琐的授权认证系统,然后通过http频繁去互相请求,这些都已经被IdentityServer实现,代码也简单易懂。
4、服务注册与发现
随着业务的快速发展,网关对接的下游微服务会越来越多,服务治理成为一个关键问题。服务治理领域最重要的问题就是服务注册与发现,作为微服务架构中最为核心和基础的模块,它主要用来实现各个微服务实例的自动化注册和发现。
注册
在服务治理框架中,通常都会构建一个注册中心,每个服务单元向注册中心登记自己提供的服务,包括服务的主机与端口号、服务版本号、通讯协议等一些附加信息。
注册中心按照服务名分类组织服务清单,同时还需要以心跳检测的方式去监测清单中的服务是否可用,若不可用需要从服务清单中剔除,以达到排除故障服务的效果。
发现
服务调用方通过服务名从服务注册中心的服务清单中获取服务实例的列表清单,通过指定的负载均衡策略取出一个服务实例位置来进行服务调用。
Ocelot作为一个高可用的服务网关,目前提供了两个注册中心的接入:Eureka与Consul。因为贝海其它项目已经在使用Eureka提供的服务,网关也选择了Eureka。
4.1 Eureka介绍
我们使用的Spring Cloud Eureka是Spring Cloud Netflix微服务套件中的一部分,它基于Netflix Eureka做了二次封装。
Eureka服务治理体系如下:
1、配置中心 (Spring Cloud Config Server)
2、服务注册与发现(Spring Clond Eureka)
4.2 启动Eureka
接下来我们看看怎么使用Eureka来串联上游网关与下游微服务吧。
4.3 下游微服务接入Eureka
修改下游戏微服务ApiProvider,Nuget引用 Steeltoe.Discovery.Client,修改Startup文件,引用命名空间:using Steeltoe.Discovery.Client;
修改appsettings.json配置
重新启动ApiProvider,我们刷新一下注册中心的页面,可以看到ApiProvider已经注册进去了。
4.4 ocelot网关接入Eureka
修改appsettings.json文件,添加Eureka配置
修改ocelot.json配置文件中/values接口的配置,设置服务发现相关配置
生产环境任何一个微服务都是多台服务器组成的集群,有了Eureka提供的服务注册功能,ocelot会从Eureka获取可用的下游服务(IP+Port),并且负载均衡的去执行请求。
目前ocelot的负载均衡配置支持:
LeastConnection 最少连接数,跟踪发现现在有最少请求或处理的可用服务
RoundRobin 轮询机制,循环使用可用的服务
NoLoadBalancer 不使用负载均衡,直接访问config配置或者服务发现的第一个可用服务
CookieStickySessions 亲缘访问,使用Cookie判断将相同Cookie请求粘贴到特定服务器
详细配置请参见官方文档:http://ocelot.readthedocs.io/en/latest/features/loadbalancer.html
5、性能测试
我们使用Apache Jmeter分别对我们网关和网关对应的下游服务接口做个简单的性能测试,以每秒50个并发请求分别这两个接口,我们得到以下两个结果
直接请求下游服务接口测试结果:
通过网关请求下游服务接口测试结果:
可见吞吐量相差并不大。
6、总结
从上面的示例中可以看到,Ocelot特别适合dotnet团队快速搭建一个“基本可用”的API网关。它除了请求转发、路由、安全认证、高性能、高可用和高稳定性外,还拥有请求聚合、限流、缓存、断路器、请求跟踪。
更多配置请参见Ocelot官方文档:http://ocelot.readthedocs.io
以上是关于.Net Core 基于Ocelot + IdentityServer4 + Eureka的搭建高性能网关介绍的主要内容,如果未能解决你的问题,请参考以下文章
asp.net core网关Ocelot的简单介绍& Ocelot集成Identity认证