如何基于surging跨网关跨语言进行缓存降级

一给  金牌会员 | 2024-5-19 04:23:09 | 显示全部楼层 | 阅读模式
打印 上一主题 下一主题

主题 847|帖子 847|积分 2541

概述

       surging是一款开源的微服务引擎,包含了rpc服务管理,中心件,以及多种外部协议来解决各个行业的业务题目,在日益发展的今天,业务的需求也更加复杂,单一语言也未必能抗下所有,以是在多语言行业解决方案优势环境下,那么就需要多语言的协同研发,而对于协同研发环境下,统一配置的网关,多语言访问调用必然会涉及到需要数据缓存的题目,那么怎么做到跨网关跨语言缓存降级呢?那么将在此篇文章中进行讲解。
如何创建拦截器

继承IInterceptor ,创建拦截,如下代码所示
  1. public class LogProviderInterceptor : IInterceptor
  2.     {
  3.         public async Task Intercept(IInvocation invocation)
  4.         {
  5.             await invocation.Proceed();
  6.             var result = invocation.ReturnValue;
  7.         }
  8.     }
复制代码
服务引擎针对于IInterceptor 扩展了CacheInterceptor用来做缓存拦截,如以下代码所示
 
  1.   public class CacheProviderInterceptor : CacheInterceptor
  2.     {
  3.         public override async Task Intercept(ICacheInvocation invocation)
  4.         {
  5.         }
  6. }
复制代码
如何使用缓存拦截器

通过设置特性Metadatas.ServiceCacheIntercept配置缓存拦截,如以下代码所示
  1. [Metadatas.ServiceCacheIntercept(Metadatas.CachingMethod.Get, Key = "GetUser_{0}_{1}", L2Key = "GetUser_{0}_{1}",EnableL2Cache =true, CacheSectionType = "ddlCache", Mode = Metadatas.CacheTargetType.Redis, Time = 480)]
复制代码
在处置处罚业务的修改,删除方法时间,需要移除依赖的缓存,那么可以设置CorrespondingKeys,如以下代码所示
  1. [Metadatas.ServiceCacheIntercept(CachingMethod.Remove, "GetUser_id_{0}", "GetUserName_name_{0}", CacheSectionType = SectionType.ddlCache, Mode = CacheTargetType.Redis)]
复制代码
如何设置缓存Key

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排序依次生成。
  1. public class UserModel
  2.     {
  3.        [CacheKey(1)]
  4.         public int UserId { get; set; }
  5.         [CacheKey(2)]<br>        public string Name { get; set; }
  6.         public int Age { get; set; }
  7.     }
复制代码
创建拦截模块

通过以下代码,把拦截器注入到服务引擎中
  1. public class IntercepteModule : SystemModule
  2.     {
  3.         public override void Initialize(CPlatformContainer serviceProvider)
  4.         {
  5.             base.Initialize(serviceProvider);
  6.         }
  7.         /// <summary>
  8.         /// Inject dependent third-party components
  9.         /// </summary>
  10.         /// <param name="builder"></param>
  11.         protected override void RegisterBuilder(ContainerBuilderWrapper builder)
  12.         {
  13.             base.RegisterBuilder(builder);
  14.             builder.AddClientIntercepted(typeof(CacheProviderInterceptor),typeof(LogProviderInterceptor));
  15.         }
  16.     }
复制代码
 如何跨语言调用中开启缓存拦截降级

在surging 是调用分为二种
1.基于接口创建代理调用,可以作为同一语言的互相调用,性能上比第二种基于routepath要快,但是具有高耦合性
  1.   var userProxy = ServiceLocator.GetService<IServiceProxyFactory>().CreateProxy<IUserService>("User");
复制代码
 
2.基于routepath调用,可以作为跨语言调用,性能上比第一种基于接口创建代理要慢,但是具有低耦合性
  1.   Dictionary<string, object> model = new Dictionary<string, object>();
  2.   model.Add("name", name);
  3.   string path = "api/hello/say";
  4.    string result =await _serviceProxyProvider.Invoke<object>(model, path, null);
复制代码
而在服务调用下,由于业务模型参数在基于routepath调用环境,做不到模型参数解析,只能支持单一参数和无参数的缓存拦截调用,而基于接口创建代理调用是可以支持业务模型缓存调用的,在以下特征环境下就需要在Metadatas.ServiceCacheIntercept特性下开启EnableStageCache,代码如下
  1. [Metadatas.ServiceCacheIntercept(Metadatas.CachingMethod.Get, Key = "GetDictionary", L2Key = "GetDictionary", EnableL2Cache = true, CacheSectionType = "ddlCache", Mode = Metadatas.CacheTargetType.Redis, Time = 480, EnableStageCache = true)]      
复制代码
 
通过以上的代码,运行后,在注册中心注册的服务路由下可以看到拦截器元数据,如许在其它语言通过元数据可以构造服务消费者的缓存拦截降级。

 以下是基于二种调用的缓存效果存储redis中

如何处置处罚缓存K/V 中Value 过大

 
缓存中心件Redis是一种高性能的内存数据库,用于存储键值对的数据结构。当value的大小超过一定限定时,一样寻常超过10K就会影响查询的性能。这时间使用一二级缓存来解决,一级缓存用redis 存储标记,标记缓存是否失效,二级缓存用本地缓存存储,当标记失效不存在后,会远程调用服务,返回效果添加一级缓存标记,返回效果添加到二级缓存。
提示:大家可以按照自己的业务需求,研发缓存拦截,不一定非要使用CacheProviderInterceptor,按照CacheProviderInterceptor一二级缓存进行构建研发
总结

      社区版:https://github.com/fanliang11/surging,如果需要其它版本,请接洽作者。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

一给

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表