前言
关于网关(Ocelot)的分享,还遗留一些功能没演示呢,接着来聊聊;这次重点针对网关Ocelot使用缓存、集成Polly做服务治理、集成IdentityServer4做认证授权来详细说说;如果对上一篇感兴趣,点这里(网关Ocelot功能演示安排的明明白白~~~)。
正文
1. 使用缓存
Ocelot中的缓存是对下游请求结果进行缓存处理,多次请求下游API时,在有效期内就可以从缓存中获取,提升服务性能。
以下演示代码还是接着上一次代码举例的,代码地址为:https://github.com/zyq025/IDS4Demo/tree/main/OcelotDemo/OcelotCodeDemo
1.1 使用默认内存缓存
其实只要增加下面红框部分的配置,就可以使用缓存了,如下:
配置说明:
- TtlSeconds:配置有效期的时间,单位为秒;
- Region:区域名,即分区缓存数据;Oeclot可以提供缓存管理接口,然后指定区域清除缓存;其实就是在Ocelot那里增加相关接口管理缓存;
配置文件准备好了,在ServiceAPI1中新增一个测试接口,如下:
运行网关和ServiceAPI1项目,然后根据配置的路由规则访问新增的接口:
到这有小伙伴会好奇,什么缓存操作都没做,就一个简单的配置就行了? 是的,Ocelot默认是有内存缓存实现的,老版本的InMemoryCache是通过Dictionary来实现的,就是键值对存储;新版本的是AspMemoryCache是通过IMemoryCache来实现的;所以只要配置开启就可以用啦,只不过功能比较单一,但可以集成其他扩展缓存,当然也可以自定义。
1.2 集成CacheManager做缓存
CacheManager除了缓存管理外,还封装了很多功能,如事件、性能计数器、并发更新等,让开发人员更容易处理和配置缓存。这里主要演示如何集成到Ocelot使用,就不详细展开说明啦,详解请查阅官网:https://cachemanager.michaco.net/documentation。
Ocelot中集成CacheManager非常简单,简单小三步:
- 引入Ocelot.Cache.CacheManager包;
- 注册对应的服务;
- 添加配置文件,其实就是配置FileCacheOptions,上一小节已经使用啦;
这样就完成集成了,运行网关和服务接口,然后访问,同样是每隔十秒才能重新获取值; 基于内存的使用是不是很简单,分布式访问咋办? 可不可以用Redis或者其他方式存储,答案当然是肯定的,往下看看↓↓↓
1.3 集成CacheManager配合Redis做分布式缓存
首先得安装好Redis环境,这块我就不展开啦,如果小伙伴对Redis系列感兴趣,也有专门的文章进行分享,进入Redis系列。
- 引入对应包,增加Redis相关配置即可,如下:
- 运行网关和服务接口,访问,同样也是每隔10秒才能获取新值,不过这次不一样的是数据在Redis中存储啦,结果如下:
1.4 自定义缓存
自定义缓存通过继承接口IOcelotCache,然后注册到容器即可,So easy!!!
- 自定义一个缓存类,继承IOcelotCache接口;
- 将缓存类注册到容器中;
- 运行看结果,还是用之前上面配置文件的FileCacheOptions信息:
如果没有特别定制化的需求,用现成造好的轮子也是很不错的。
2. 集成Polly做服务治理
在WebAPI中,接口超时、访问异常、并发量大等这种问题已经是家常便饭了,故障处理和弹性预防肯定少不了,上一节专门分享了一下Polly,这里就可以很丝滑般的集成进来啦,关于Polly的分享,请进入Polly-故障处理和弹性应对很有一手查看详情。
Ocelot集成Polly超级给力,引入包,注册服务,剩下的功能通过配置文件配置就轻松实现~~~
- 引入包,注册服务
- 超时熔断配置实现
为了方便测试,在ServiceAPI1中增加一个TimeoutTest的接口,如下:
然后配置超时熔断,然后运行,通过网关访问接口:
通过上面演示,如果超时,不让请求一直处于等待,及时反馈信息;Ocelot默认超时时间为90s。同时上面还配置了熔断机制,如果出现3次异常,就会熔断3秒。
- 限流配置实现,这里就用ServiceAPI1中CacheTest接口做演示
当达到最大请求时,可以自定义返回消息和状态码,只需要全局配置中增加如下配置即可:
运行效果如下:
3. 集成IdentityServer4做认证授权
认证授权在API项目中是不可缺少的,而对于微服务项目,每一个服务都做一次验证,显得冗余,而且后期代码维护性也不好,所以找一个公共的入口统一做认证是很不错的解决方案,而在网关上集成认证授权功能完全符合条件。
关于IdentityServer4的相关知识,之前做过几篇文章的分享,小伙伴可以进入IdentityServer4系列详细查看,这里不展开讲,重点还是演示Ocelot如何集成IdentityServer4;步骤如下:
- 准备一个IdentitiServer4的项目
为了不喧宾夺主,这里就直接用之前IdentityServer4 之Client Credentials走起来这篇文章中的AuthorizationServerDemo项目代码,github源码路径是:https://github.com/zyq025/IDS4Demo。直接拷过来即可。
- Ocelot项目中增加认证逻辑
- 修改配置文件
配置认证信息可以针对路由进行配置,其中AuthenticationProviderKey对应的值与网关项目中注册服务定义的authenticationProviderKey值一致。 如果配置了认证信息,就会经过授权服务器进行认证校验,否则不进行验证。
- 运行结果如下:
通过上图,对应的API被保护起来啦!那试试获取一个Token,带上Token访问需认证的API地址,看看能否问;为了演示方便,这里要用到Postman工具啦,如下:
上面已经获取到Token,如果小伙伴有疑惑,可以去看看之前IDS4的文章。 将得到的Token放在请求头中去访问需认证的API地址,如下:
最后可以正常访问接口啦,统一在网关做共同的逻辑,避免各服务的功能实现冗余,在后期维护和替换也很方便。
源码地址:https://github.com/zyq025/IDS4Demo,统一放在这里面了。
总结
到这Ocelot的常用功能已经演示完毕了,这些示例只是提供思路,具体应用还需要小伙伴花点心思结合需求进行落地。
下一步的安排继续聊聊服务之间的调用、分布式最终一致性等开发应用,还会集成一些中间件进行日志监控和分析及链路追踪,对于部署还会系列的分享Nignx、Docker、K8s。
一个被程序搞丑的帅小伙,关注"Code综艺圈",跟我一起学~~~