surging是一款开源的微服务引擎,包含了rpc服务治理,中间件,以及多种外部协议来解决各个行业的业务问题。在日益发展的今天,业务的需求也更加复杂,单一语言也未必能满足所有需求。因此,在多语言行业解决方案优势情况下,需要多语言的协同研发。在协同研发环境下,统一配置的网关,多语言访问调用必然会涉及到需要数据缓存的问题。本文将介绍如何实现跨网关跨语言缓存降级。
继承IInterceptor,创建拦截,如下代码所示。
服务引擎针对于IInterceptor扩展了CacheInterceptor用来做缓存拦截,如以下代码所示。
通过设置特性Metadatas.ServiceCacheIntercept配置缓存拦截,如以下代码所示。
在处理业务的修改,删除方法时候,需要移除依赖的缓存,那么可以设置CorrespondingKeys,如以下代码所示。
1. 比如缓存设置为GetUserById_{0},传递的参数是int类型,值为2199,那么产生的key就是GetUserById_2199。
2. 比如缓存设置为GetUser_{0}_{1},传递的参数是UserModel类型,传递为new UserModel{ UserId=2199,Name=”Fanly” }值,那么产生的Key就是GetUser_fanly_2199。标识CacheKeyAttribute特性以生成缓存key,并且设置SortIndex排序依次生成。
通过以下代码,把拦截器注入到服务引擎中。
在surging是调用分为两种。
1. 基于接口创建代理调用,可以作为同一语言的互相调用,性能上比第二种基于routepath要快,但是具有高耦合性。
2. 基于routepath调用,可以作为跨语言调用,性能上比第一种基于接口创建代理要慢,但是具有低耦合性。
在服务调用下,因为业务模型参数在基于routepath调用情况,做不到模型参数解析,只能支持单一参数和无参数的缓存拦截调用,而基于接口创建代理调用是可以支持业务模型缓存调用的。在以下特征情况下就需要在Metadatas.ServiceCacheIntercept特性下开启EnableStageCache,代码如下。
通过以上的代码,运行后,在注册中心注册的服务路由下可以看到拦截器元数据,这样在其它语言通过元数据可以构造服务消费者的缓存拦截降级。
以下是基于两种调用的缓存结果存储redis中。
缓存中间件Redis是一种高性能的内存数据库,用于存储键值对的数据结构。当value的大小超过一定限制时,一般超过10K就会影响查询的性能。这时候使用一二级缓存来解决,一级缓存用redis存储标记,标记缓存是否失效,二级缓存用本地缓存存储,当标记失效不存在后,会远程调用服务,返回结果添加一级缓存标记,返回结果添加到二级缓存。
提示:大家可以按照自己的业务需求,研发缓存拦截,不一定非要使用CacheProviderInterceptor,按照CacheProviderInterceptor一二级缓存进行构建研发。
社区版:
https://github.com/fanliang11/surging
,如果需要其它版本,请联系作者。