API是Application Programming Interface缩写,翻译成中文就是应用程序接口。在实际微服务中可以理解一个个功能方法。就比如你一个商品服务的微服务, 可以对外提供 API 接口为,获取商品目录、获取商品详情等。
(2).什么是网关(Gateway)
它是一个服务器,用来转发其他服务器通信数据的, 它接收从客户端发送来的请求时,它就像自己拥有资源的源服务器一样对请求进行处理。
(3).什么是Api网关
通俗的来说就是用来限制客户端访问服务端api一道门槛。
2. 微服务架构中为什么要用网关?
(1).在这之前,我们的技术栈中只引入了Consul,客户端访问Consul拿到对应的IP+Port,最终还是要访问业务服务器的,但很多情况我们并不想让业务服务器直接对外开放,所以这个时候就需要引入网关进行转发了.
(2).现在的微服务还没有加权限校验,如果将权限校验加个每个微服务的业务服务器上,开发量很大,这个时候引入网关,可以在网关层校验.
(3).没有网关,很难做限流,而且各个业务的负责人员不能独立负责自己的服务器器。
3. 网关都有哪些作用?
路由、负载均衡、限流、认证、授权、链路监控、熔断降级、Service Fabric
4. Ocelot相关信息
(1).依赖程序集:通过Nuget安装 【Ocelot 16.0.1】
GitHub地址:https://github.com/ThreeMammals/Ocelot
(2).参考文档:
官网:https://ocelot.readthedocs.io/en/latest/
ocelot 中文文档:https://blog.csdn.net/sD7O95O/article/details/79623654
资料:
(3).其他网关框架:
A. Netflix Zuul +java实现
B. Kong nginx +lua脚本实现
C. Tyk go语言开发,收费版本
D. Ocelot aspnetcore开发的
5. Ocelot的原理
Ocelot是一堆的asp.net core middleware组成的一个管道。当它拿到请求之后会用一个request builder来构造一个HttpRequestMessage发到下游的真实服务器,等下游的服务返回response之后再由一个middleware将它返回的HttpResponseMessage映射到HttpResponse上。
(1).上游是什么:Ocelot自身就是上游(Upstream)
(2).下游是什么:Ocelot转发给的(业务)服务器就是下游(Downstream)
二. 路由功能
架构图:
1.路由的含义
Ocelot(即上游)按照匹配规则接收客户端发送的请求 → 将客户端请求转换成业务服务器(即下游)的地址 → 调用下游服务,返回结果 → Ocelot再将下游服务的结果返回给客户端.
2. 参数介绍
- Downstream 下游服务配置
- UpStream 上游服务配置
- Aggregates 服务聚合配置
- ServiceName, LoadBalancer, UseServiceDiscovery 配置服务发现
- AuthenticationOptions 配置服务认证
- RouteClaimsRequirement 配置Claims鉴权
- RateLimitOptions 限流配置
- FileCacheOptions 缓存配置
- QosOptions 服务质量与熔断
- DownstreamHeaderTransform 头信息转发
3. 路由直接转发指定的地址
(1).业务场景:
客户端访问网关 → 网关把请求直接转发给"指定ip+端口"业务服务器 (该场景网关本身不配置Consul,直接转发)
(2).业务编写与测试:
A. 新建网关项目OcelotGateWay,通过Nuget安装【Ocelot 16.0.1】程序集
B. 新建一个OcelotConfig.json的配置文件,属性改为"始终复制",用于存放Ocelot的配置。
代码如下:
{ "Routes": [ { //转发下游(业务服务器)的匹配规则 "DownstreamPathTemplate": "/api/{url}", //下游请求类型 "DownstreamScheme": "http", //下游的ip和端口,和上面的DownstreamPathTemplate匹配起来 "DownstreamHostAndPorts": [ { "Host": "127.0.0.1", "Port": 7001 } ], //上游(即Ocelot)接收规则 "UpstreamPathTemplate": "/GoodsService/{url}", //上游接收请求类型 "UpstreamHttpMethod": [ "Get", "Post" ] }, { "DownstreamPathTemplate": "/api/{url}", "DownstreamScheme": "http", "DownstreamHostAndPorts": [ { "Host": "127.0.0.1", "Port": 7004 } ], "UpstreamPathTemplate": "/OrderService/{url}", "UpstreamHttpMethod": [ "Get", "Post" ] } ] }