语法糖之

作者: 编程应用  发布:2019-09-26

因为驰念到自己上边笔者将写session cookies 等 操作类 ,与cache具有共性。 所以都统一承袭了IHttpStorageObject abstract class来保函数风格的联合 ,然而又为了调用方便,抽象中又选取了单例来简化调用。

1. APIGateway是什么  

APIGateway 即API网关,全体央求首先会经过这么些网关,然后达到后端服务,有一点点类似于Facade格局。API网关作为系统接口对外的统一出口,能够减去调用方对劳务完结的感知。

未曾API网关时的结系统构如下图:由图能够观望,在尚未API网关作为联合出口的景况下,要求调用方本人组合各样服务,而且轻巧让调用方感知后端各个劳动的留存。

图片 1

参预API网关时的系统结构如下图:由图能够看出,在到场了API网关之后,通过网关揭破接口给调用方,调用方能够在不感知后端服务的气象下调用服务,并且通过集合的接口,后端服务接口的变迁不会潜濡默化调用方,后端服务转变能够通过网关的改造,对外仍旧保持一致的风骨。

图片 2

使用格局很简单:

2. APIGateway的作用

APIGateway的关键功能有:

1.联结对外接口:      当客商需求集成分歧产品也许服务中间的效应,调用区别服务提供的才干。利用APIGateway能够让客商在不感知服务边缘的情事下,利用联合的接口组装服务。        对于集团里面差别的劳动,提供的接口大概在作风上设有必然的歧异,通过APIGateway能够统一这种反差。 当内部服务修改时,能够由此APIGateway实行适配,无需调用方进行调度        收缩对外暴光服务可以追加系统安全性。

2.统一鉴权:        通过APIGateway对走访举行联合鉴权,没有须要各样应用单独对调用方举行鉴权,应用可以小心职业。

3.服务登记与授权:        能够垄断(monopoly)调用方能够应用和不能利用的劳动。

4.劳动限流:        通过APIGateway可以对调用方调用各种接口的天天调用及总调用次数限制

5.全链路追踪:        通过APIGateway提供的并世无两诉求Id,监察和控制调用流程,以及调用的响应时间。

图片 3

using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Web;using System.Web.Caching;using System.Collections;using System.Linq.Expressions;namespace SyntacticSugar{    /// <summary>    /// ** 描述:缓存操作类    /// ** 创始时间:2015-6-9    /// ** 修改时间:-    /// ** 作者:sunkaixuan    /// ** 使用说明:http://www.cnblogs.com/sunkaixuan/p/4563462.html    /// </summary>    /// <typeparam name="K">键</typeparam>    /// <typeparam name="V">值</typeparam>    public class CacheManager<V> : IHttpStorageObject<V>    {        #region 全局变量        private static CacheManager<V> _instance = null;        private static readonly object _instanceLock = new object();        #endregion        #region 构造函数        private CacheManager() { }        #endregion        #region  属性        /// <summary>                 ///根据key获取value             /// </summary>                 /// <value></value>              public override V this[string key]        {            get { return HttpRuntime.Cache[CreateKey]; }        }        #endregion        #region 公共函数        /// <summary>                 /// key是否存在               /// </summary>                 /// <param name="key">key</param>                 /// <returns> /// 存在<c>true</c> 不存在<c>false</c>.        /// /// </returns>                 public override bool ContainsKey(string key)        {            return HttpRuntime.Cache[CreateKey] != null;        }        /// <summary>                 /// 获取缓存值                 /// </summary>                 /// <param name="key">key</param>                 /// <returns></returns>                 public override V Get(string key)        {            return HttpRuntime.Cache.Get(CreateKey;        }        /// <summary>                 /// 获取实例                /// </summary>                 /// <returns></returns>                 public static CacheManager<V> GetInstance()        {            if (_instance == null)                lock (_instanceLock)                    if (_instance == null)                        _instance = new CacheManager<V>();            return _instance;        }        /// <summary>                 /// 插入缓存                /// </summary>                 /// <param name="key"> key</param>                 /// <param name="value">value</param>                  public override void Add(string key, V value)        {            Add(key, value, Minutes*20);        }        /// <summary>                 /// 插入缓存                /// </summary>                 /// <param name="key"> key</param>                 /// <param name="value">value</param>                 /// <param name="cacheDurationInSeconds">过期时间单位秒</param>                 public  void Add(string key, V value, int cacheDurationInSeconds)        {            Add(key, value, cacheDurationInSeconds, CacheItemPriority.Default);        }        /// <summary>                 /// 插入缓存.                 /// </summary>                 /// <param name="key">key</param>                 /// <param name="value">value</param>                 /// <param name="cacheDurationInSeconds">过期时间单位秒</param>                 /// <param name="priority">缓存项属性</param>                 public void Add(string key, V value, int cacheDurationInSeconds, CacheItemPriority priority)        {            string keyString = CreateKey;            HttpRuntime.Cache.Insert(keyString, value, null, DateTime.Now.AddSeconds(cacheDurationInSeconds), Cache.NoSlidingExpiration, priority, null);        }        /// <summary>                 /// 插入缓存.                 /// </summary>                 /// <param name="key">key</param>                 /// <param name="value">value</param>                 /// <param name="cacheDurationInSeconds">过期时间单位秒</param>                 /// <param name="priority">缓存项属性</param>                 public  void Add(string key, V value, int cacheDurationInSeconds, CacheDependency dependency, CacheItemPriority priority)        {            string keyString = CreateKey;            HttpRuntime.Cache.Insert(keyString, value, dependency, DateTime.Now.AddSeconds(cacheDurationInSeconds), Cache.NoSlidingExpiration, priority, null);        }        /// <summary>                 /// 删除缓存                 /// </summary>                 /// <param name="key">key</param>                 public override void Remove(string key)        {            HttpRuntime.Cache.Remove(CreateKey;        }        /// <summary>        /// 清除所有缓存        /// </summary>        public override void RemoveAll()        {            System.Web.Caching.Cache cache = HttpRuntime.Cache;            IDictionaryEnumerator CacheEnum = cache.GetEnumerator();            ArrayList al = new ArrayList();            while (CacheEnum.MoveNext            {                al.Add(CacheEnum.Key);            }            foreach (string key in al)            {                cache.Remove;            }        }        /// <summary>        /// 清除所有包含关键字的缓存        /// </summary>        /// <param name="removeKey">关键字</param>        public override void RemoveAll(Func<string, bool> removeExpression)        {            System.Web.Caching.Cache _cache = HttpRuntime.Cache;            var allKeyList = GetAllKey();            var delKeyList = allKeyList.Where(removeExpression).ToList();            foreach (var key in delKeyList)            {                Remove;            }        }        /// <summary>        /// 获取所有缓存key        /// </summary>        /// <returns></returns>        public override IEnumerable<string> GetAllKey()        {            IDictionaryEnumerator CacheEnum = HttpRuntime.Cache.GetEnumerator();            while (CacheEnum.MoveNext            {                yield return CacheEnum.Key.ToString();            }        }        #endregion        #region 私有函数        /// <summary>                 ///创建KEY           /// </summary>                 /// <param name="key">Key</param>                 /// <returns></returns>                 private string CreateKey(string key)        {            return "http_cache_"+key.ToString();        }        #endregion    }}

3.开源API网关框架

现阶段关键的开源API网关框架有:spring zuul 和kong

  1. spring zuul

        Zuul是Netflix出品的二个基于JVM路由和服务端的载荷均衡器。它的关键功能有:认证、压力测验、金丝雀测量检验、动态路由、负载削减、安全、静态响应管理和积极/主动调换管理。spring zuul 是spring Cloud的零件,能够和spring cloud的顺序零部件结合使用。

        springCloud的欧洲经济共同体建立满含:Zuul、Ribbon、EureKa、Fein、Hystrix等。个中Zuul就是多个像样APIGateway的组建,Ribbon是近似于Nginx的代理服务器,Eureka用于注册和意识服务,Hystrix可以看成任何架构的断路服务,用于服务降级。Fein能够看作贰个Rest服务的提供者,能够供内部服务中间交互调用。

  1. kong

        Kong 是贰个现有 的 api gateway 的消除方案,它在 nginx 上实行了费用。

        api gateway 的落到实处情势有许多样,比方说 JVM 上可以用基于NIO 的框架譬如Netty,Vertx,Spring Reactor,JOSS Undertow。未来二个比较流程的从未有过依据 JVM 的正是 NodeJs。其余的还大概有 Nginx Plus。

        接下去,将对spring zuul的行使和零部件做轻巧的牵线。

  

using System;namespace SyntacticSugar{    public abstract class IHttpStorageObject<V>    {        public int Minutes = 60;        public int Hour = 60 * 60;        public int Day = 60 * 60 * 24;        public System.Web.HttpContext context = System.Web.HttpContext.Current;        public abstract void Add(string key, V value);        public abstract bool ContainsKey(string key);        public abstract V Get(string key);        public abstract global::System.Collections.Generic.IEnumerable<string> GetAllKey();        public abstract void Remove(string key);        public abstract void RemoveAll();        public abstract void RemoveAll(Func<string, bool> removeExpression);        public abstract V this[string key] { get; }    }}

  

本文由金沙澳门官网送注册58发布于编程应用,转载请注明出处:语法糖之

关键词:

上一篇:语法糖之Cookies操作类
下一篇:没有了