API网关组件Ocelot,AOP组件ASPectCore轻便使用

介绍:

基本介绍:

安装:

下载地址:

运行:

consul agent -dev

澳门葡京备用网址 1

来得这些分界面表达已经开启成功。

页面显示:

下一场访问8500端口就足以见见页面:

澳门葡京备用网址 2

命令:

consul members:输出当前劳动的新闻,展现的保有配置节点。

install-package Consul:在vs项目中安装Consul

熔断、降级:

介绍:

AspectCore是.NET标准的依靠AOP的跨平台框架【github解释】。主要协理:对上边拦截器,注重注入集成,Web应用程序,数据证实等的基本支撑。

劳动连接:

开启consul服务之后须求把现成的门类延续集群到consul服务,那时候须要在项目中注册服务(在startup.cs文件下的Configure方法):

澳门葡京备用网址 3澳门葡京备用网址 4

 String ip = Configuration["ip"];//部署到不同服务器的时候不能写成127.0.0.1或者0.0.0.0,因为这是让服务消费者调用的地址            int port = int.Parse(Configuration["port"]);//获取服务端口            var client = new ConsulClient(ConfigurationOverview); //回调获取            var result = client.Agent.ServiceRegister(new AgentServiceRegistration()            {                ID = "ServerNameFirst" + Guid.NewGuid(),//服务编号保证不重复                Name = "MsgServer",//服务的名称                Address = ip,//服务ip地址                Port = port,//服务端口                Check = new AgentServiceCheck //健康检查                {                    DeregisterCriticalServiceAfter = TimeSpan.FromSeconds(5),//服务启动多久后反注册                    Interval = TimeSpan.FromSeconds(10),//健康检查时间间隔,或者称为心跳间隔(定时检查服务是否健康)                    HTTP = $"http://{ip}:{port}/api/Health",//健康检查地址                    Timeout = TimeSpan.FromSeconds(5)//服务的注册时间                }            });

View Code

将来在增加3个回调方法:

回调方法是代表的consul服务的地方配置。

 private static void ConfigurationOverview(ConsulClientConfiguration obj)        {            //consul的地址            obj.Address = new Uri("http://127.0.0.1:8500");            //数据中心命名            obj.Datacenter = "dc1";        }

服务到那里已经是安排达成。可是大家怎么撤除服务哪。当然是有主意的拉。通过api大家能够清楚瑟维斯Deregister方法是收回服务的不二等秘书技。那么大家应当怎么写哪:

首先我们要去打听一下IApplicationLifetime接口:允许消费者在优雅关机时期实施清理专门的职业

ApplicationStarted:当应用程序主机已通通运营并就要等待时接触

ApplicationStopping:当应用程序主机实践美貌关机时触发。请求或者还在运营中。关闭将堵住此事件变成

ApplicationStopped:当应用程序主机实施关机时触发。全体请求应该在那一点到位。关机将截留此事件造成。

好了,作者的意大利语确实倒霉,这个正是机动翻译的意趣。可是也能让大家了解大概的意味。知道有其一东西大家就足以兑现效益了完整代码:

澳门葡京备用网址 5澳门葡京备用网址 6

        public void Configure(IApplicationBuilder app, IHostingEnvironment env, IApplicationLifetime lifetime)        {            if (env.IsDevelopment            {                app.UseDeveloperExceptionPage();            }            app.UseMvc();            String ip = Configuration["ip"];//部署到不同服务器的时候不能写成127.0.0.1或者0.0.0.0,因为这是让服务消费者调用的地址            int port = int.Parse(Configuration["port"]);//获取服务端口            var client = new ConsulClient(ConfigurationOverview); //回调获取            string serverId = "ServerNameFirst" + Guid.NewGuid();            var result = client.Agent.ServiceRegister(new AgentServiceRegistration()            {                ID = serverId,//服务编号保证不重复                Name = "MsgServer",//服务的名称                Address = ip,//服务ip地址                Port = port,//服务端口                Check = new AgentServiceCheck //健康检查                {                    DeregisterCriticalServiceAfter = TimeSpan.FromSeconds(5),//服务启动多久后反注册                    Interval = TimeSpan.FromSeconds(10),//健康检查时间间隔,或者称为心跳间隔(定时检查服务是否健康)                    HTTP = $"http://{ip}:{port}/api/Health",//健康检查地址                    Timeout = TimeSpan.FromSeconds(5)//服务的注册时间                }            });            lifetime.ApplicationStopping.Register =>            {                Console.WriteLine("注销方法");                client.Agent.ServiceDeregister.Wait();//服务停止时取消注册            });        }

View Code

运行效果截图:

澳门葡京备用网址 7

熔断:熔断正是大家常说的“保险丝”,意为当服务出现某个场景时,切断服务,从而防范应用程序不断地常识推行恐怕会倒闭的操作导致系统的“雪崩”,可能大量的过期等待导致系统卡死等意况,许多地方也将其产生“过载爱惜”。

Ocelot是一个.NET
API网关。该项目针对的是使用.NET运营微服务/面向服务架构的人口,他们需求一个合并的输入进去他们的系统。不过,它能够拍卖任何说HTTP并在ASP.NET
Core协助的任何平台上运转的其余事物。

选拔实例:

率先安装dll:

Install-Package AspectCore.Core

引用完dll就足以采取了,大家来成立基本的拍卖类:ErrorCommandAttribute

介绍就不说了,理论自身也清楚的不多,直接上代码:

澳门葡京备用网址 8澳门葡京备用网址 9

 class ErrorCommandAttribute : AbstractInterceptorAttribute
    {
        string _mess;
        public ErrorCommandAttribute(string methon)
        {
            _mess = methon;
        }
        /// <summary>
        /// 每个被拦截的方法中执行
        /// </summary>
        /// <param name="context"></param>
        /// <param name="next"></param>
        /// <returns></returns>
        public override async Task Invoke(AspectContext context, AspectDelegate next)
        {
            try
            {
                Console.WriteLine("AddAsync方法开始前");
                await next(context); // 执行被拦截的方法
            }
            catch (Exception)
            {
                Console.WriteLine("AddAsync方法出错");
                try
                {
                    //Type[] mytypes = Assembly.GetExecutingAssembly().GetTypes();
                    Type type= typeof(User);//user 是类
                    var methom = Activator.CreateInstance(type);//反射创建类
                    MethodInfo methodinfo = type.GetMethod(_mess);//获取方法 _mess参数是自定义字符串为方法名称
                    methodinfo.Invoke(methom, null);//运行方法
                }
                catch (Exception ex)
                {

                    throw;
                }
                throw;
            }
            finally
            {
                Console.WriteLine("AddAsync方法结束");
            }
        }
    }

View Code

只简轻巧单介绍下方法的款式:Invoke

该办法是后续AbstractInterceptorAttribute类之后必须完成得类;

下一场try:是在格局试行以前实践;全部大家在检查测试方法初始在此以前要想做一些操作能够写在此地

catch:唯有在检查评定的法子出现非常才会实行;那里是检查实验方法出万分了,需要做的操作,

finally:都会试行

大家再来看一下措施类:user

澳门葡京备用网址 10澳门葡京备用网址 11

 public class User
    {
        [ErrorCommand("Error1")]
        public virtual async Task<int> AddAsync()
        {
            Console.WriteLine("开始方法:AddAsync");
            throw new Exception("出错了");
            return 0;
        }
        public async Task<int> Error1()
        {
            Console.WriteLine("开始方法:Error1");
            return 1;
        }
    }

View Code

很显眼我们写的风味类只要求在供给检查实验的法子方面加性子就好了。那Ritter别注意正是,必要加性情的办法必须是虚方法,也正是必须加virtual 修饰。否则不会被调用。

终极看一下怎么样运用方法:

澳门葡京备用网址 12澳门葡京备用网址 13

static void Main(string[] args)
        {
            Console.WriteLine("开始程序");
            //User user = new User();
            //user.AddAsync();
            ProxyGeneratorBuilder proxyGeneratorBuilder = new ProxyGeneratorBuilder();
            using (IProxyGenerator proxyGenerator = proxyGeneratorBuilder.Build())
            {
                User p = proxyGenerator.CreateClassProxy<User>();
                p.AddAsync();
            }

            Console.ReadLine();
        }

View Code

与常规的施用类措施看出来了:我们new
User类的时候不是价值观的法子,必须选择组件的CreateClassProxy方法;

客户端:

简短介绍三个得到服务具备地点,然后打印并从当中大4挑选三人作品张开呼吁并打字与印刷:

澳门葡京备用网址 14澳门葡京备用网址 15

       static List<string> Urls = new List<string>();        static void Main(string[] args)        {            Console.WriteLine("开始输出当前所有服务地址");            Catalog_Nodes().GetAwaiter().GetResult();            //Console.WriteLine(HelloConsul().GetAwaiter().GetResult;            Console.WriteLine("开始随机请求一个地址服务地址");            int index = new Random().Next(Urls.Count);            string url = Urls[index];            string param = "";//这里是开始位置            param += "{";            param += "\"" + "id" + "\":\"" + 5 + "\",";            param = param.TrimEnd(',');            param += "}";            Console.WriteLine("请求的随机地址:" + url);            string result = HttpClientHelpClass.PostResponse(url, param, out string statusCode);            Console.WriteLine("返回状态:" + statusCode);            Console.WriteLine("返回结果:" + result);            Console.ReadLine();        }        public static async Task Catalog_Nodes()        {            var client = new ConsulClient();            var nodeList = await client.Agent.Services();            var url = nodeList.Response.Values;            foreach (var item in url)            {                string Address = item.Address;                int port = item.Port;                string name = item.Service;                Console.WriteLine($"地址:{Address}:{port},name:{name}");                Urls.Add($"http://{Address}:{port}/api/Test");            }        }

View Code

降职:降级的目标就是当某些服务提供者发生故障的时候,向调用方重回一个代表响应恐怕不当响应。

Ocelot是1组按一定顺序的中间件,Ocelot垄断(monopoly)HttpRequest对象进入由其配置钦点的景况,直到它到达请求生成器中间件,在该中间件中开创HttpRequestMessage对象,该目标用于向下游服务发出请求。提议呼吁的中间件是Ocelot管道中的最终1件事。它不叫下3个中间件。来自下游服务的响应存储在种种请求成效域存款和储蓄库中,并在伸手再次回到到Ocelot管道时进行回复。有1件中间件将HttpResponseMessage映射到HttpResponse对象上,并赶回给客户端。这基本上是与其余一些成效。

API网关组件Ocelot,AOP组件ASPectCore轻便使用。2018-06-23:

三种章节:

微服务类别小说首要介绍微服务所使用到的某个才具和壹部分技巧示范:

  • 微服务——微服务的介绍和目录
  • 微服务——服务意识在windows下轻易利用
  • 微服务——微服务故障管理库
  • 微服务——动态代理AspectCore的采取
  • 微服务——网关Ocelot+Consul落成集群轮询

介绍:

POLLY是三个.NET回弹和瞬态故障管理库,它同意开拓人士以流畅和线程安全的格局表明诸如重试、断路器、超时、隔板隔开和回退等布置。github官方解释嘿嘿。

Polly以.NET Standard
1.1(覆盖范围:.NET
Framework 4.5-4.6.1,.NET Core 1.0,Mono,Xamarin,UWP,WP8.1 +)

            .NET Standard
2.0+(覆盖范围:.NET
Framework 四.陆.壹, .NET Core 二.0+以及新兴的Mono,Xamarin和UWP目的)

Ocelot只好用于.NET
Core,并且近来儿早上就创设到netstandard二.0。全体下面 我们使用.NET Core
2.一做示范。

修改拦截器方法:

阻碍方法从钦赐项目扩大为公家措施,自定义类型,那样就足以独自提收取来,不用每一种体系写多个类,能够自行获取到花色,然后能够重复使用:

 public override async Task Invoke(AspectContext context, AspectDelegate next)
        {
            try
            {
                Console.WriteLine("AddAsync方法开始前");
                await next(context); // 执行被拦截的方法
            }
            catch (Exception)
            {
                Console.WriteLine("AddAsync方法出错");
                //重复调用示例
                ProxyGeneratorBuilder proxyGeneratorBuilder = new ProxyGeneratorBuilder();
                using (IProxyGenerator proxyGenerator = proxyGeneratorBuilder.Build())
                {
                    var baseClass = context.Proxy;
                    foreach (var item in baseClass.GetType().GetMethods())
                    {
                        if (item.Name.ToString() == _mess)
                        {
                            MethodInfo methodinfo = baseClass.GetType().GetMethod(_mess);
                            methodinfo.Invoke(baseClass, null);
                        }
                    }
                }

                throw;
            }
            finally
            {
                Console.WriteLine("AddAsync方法结束");
            }
        }

 

安装:

率先当然是创办三个调控台项目,然后通过NuGet安装:

Install-Package Polly

澳门葡京备用网址 16

并发上述分界面就印证你早已安装了前卫的本子到您的体系;

始建一个宗旨示例:

首先大家创制1个.NET Core
2.一空项目。

本来大家依然要先引用的拉, Nuget 命令行: Install-Package
Ocelot

布署:增加贰个json文件落到实处最中央的配置:

{
    "ReRoutes": [],
    "GlobalConfiguration": {
        "BaseUrl": "urladdress"
    }
}

此处最重大的是BaseUrl。Ocelot要求理解它正在运维的U君越L,以便推行标题查找和替换以及某个管理配置。当设置这么些U昂科拉L时,它应当是客户端将看到的Ocelot运转的外部U智跑L。

下一场我们将刚刚的配置文件参加到ASP.NET Core Configuration:Program.cs

澳门葡京备用网址 17澳门葡京备用网址 18

 public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
            WebHost.CreateDefaultBuilder(args)
                   .ConfigureAppConfiguration((hostingContext, builder) =>
                   {
                       builder
                       .SetBasePath(hostingContext.HostingEnvironment.ContentRootPath)
                       .AddJsonFile("ocelot.json");
                   })
                .UseStartup<Startup>();

View Code

终极在丰裕服务以及安装中间件:Startup.cs

澳门葡京备用网址 19澳门葡京备用网址 20

 public void ConfigureServices(IServiceCollection services)
        {
            services.AddOcelot();//添加ocelot服务
        }

        // This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
        public void Configure(IApplicationBuilder app, IHostingEnvironment env)
        {
            if (env.IsDevelopment())
            {
                app.UseDeveloperExceptionPage();
            }
            app.UseOcelot().Wait();//设置所有的Ocelot中间件
            app.Run(async (context) =>
            {
                await context.Response.WriteAsync("Hello World!");
            });
        }
    }

View Code

 那些便是基本的所需编制程序代码。

数以万计目录:

微服务类别小说首要介绍微服务所使用到的一些手艺和部分才能示范:

  • 微服务——微服务的牵线和目录
  • 微服务——【Consul】服务意识在windows下轻松利用(一)
  • 微服务——【polly】微服务故障管理库(二)
  • 微服务——动态代理AspectCore的使用(3) 
  • 微服务——网关Ocelot+Consul落成集群轮询(肆)

计策介绍:

polly通过法定介绍大家能够知道有四种恢复生机攻略,先不管会不会,先列出来再说哈哈:

   
重试计策(Retry):大多故障是短暂的,并且在短距离赛跑的推移后只怕会自己改正。允许大家做的是能够自动配置重试机制

 
  断路器(Circuit-breaker):当贰个系统严重挣扎时,赶快失败优于让用户/呼叫者等待。 说白了正是应有先行直接再次来到战败,而不是直接让用户等待。爱抚故障系统免受过载能够帮忙恢复。

 
  超时(Timeout):超时战术针对的内置条件是超过一定的等候时间,想要获得成功的结果是不也许的,保险调用者不必等待超时。

 

    隔板隔开分离(Bulkhead
Isolation):隔板隔开分离针对的放置条件是当进程出现故障时,八个倒闭一向在主机中对能源(比方线程/
CPU)一贯侵吞。下游系统故障也或者引致上游战败。那四个高风险都将招致深重的结局。都说一粒老鼠子屎搅浑1锅粥,而波利则将受管制的操作限制在稳住的能源池中,免别的能源受其影响。

 

   
缓存(Cache):正是有的伸手,会把数据缓存起来,然后在持续一段时间内,直接从缓存中取。

 

   
回退(Fallback):操作依旧会倒闭,也正是说当发生那样的职业时大家计划做哪些。也正是说定义失利重返操作。大家在选取时正是所说的降级。

 

澳门葡京备用网址 ,    攻略包装(PolicyWrap):差别的故障必要分歧的政策 弹性意味着使用组合。

安插文件的详细分析:

Ocelot的显要职能是吸收HTTP请求并将它们转载到下游服务。近来以另三个http请求的花样现身。Ocelot描述了将一个请求作为ReRoute路由到另二个呼吁。为了在Ocelot中赚取任何职业,您要求在布署中设置ReRoute。

共谋那里大家补充一下刚刚写的json文件的五个根节点:ReRoutes和GlobalConfiguration。

   
ReRoutes:是3个数组,个中的每七个要素代表了贰个路由,大家能够针对每二个路由实行上述功效配置,告诉Ocelot怎样管理上游请求的目的。

 
  GlobalConfiguration:全局配置,可以恰到好处的节约配置,比方baseurl节点,服务意识配置。

这么咱们就落到实处了经过配备文件能够落成对Ocelot的职能布局:路由、服务汇聚、服务意识、认证、鉴权、限流、熔断、缓存、Header头传递等。

布署3个示范:上边这么些布局音讯正是将用户的央求/ProductService/1 转载到 localhost:8001/api/Test/壹

澳门葡京备用网址 21澳门葡京备用网址 22

{
  "ReRoutes": [
    {
      "DownstreamPathTemplate": "/api/Test/{postId}",
      "DownstreamScheme": "http",
      "DownstreamHostAndPorts": [
        {
          "Host": "127.0.0.1",
          "Port": 8001
        }
      ],
      "UpstreamPathTemplate": "/ProductService/{postId}",
      "UpstreamHttpMethod": [ "Get", "Delete" ]
    }
  ],
  "GlobalConfiguration": {
   // "BaseUrl": "http://127.0.0.1:8887/"
  }
}

View Code

  • 唐斯treamPathTemplate:下游方位url路线
  • 唐斯treamScheme:下游服务http
    schema
  • 唐斯treamHostAndPorts:下游服务的地点,借使选用LoadBalancer的话那里能够填多项
  • UpstreamPathTemplate: 上游也正是用户输入的呼吁Url模板
  • UpstreamHttpMethod: 上游请求http方法,可应用数组:Get
    ,Delete等

好了这么就兑现了1个基本的Ocelot网关的转向示例。

上边让大家来看一下职能啊:

先是大家运转起来webapi项目揭露在800一端口。然后访问地址是:

笔者们见到的结果是:

澳门葡京备用网址 23

下一场大家运维大家的网关服务;发表在端口888八下,依照上述配置大家得以见到方位地址为:

然后同样的央求结果是:

澳门葡京备用网址 24

那样大家就落到实处利用统一网关来访问不一样的地址,以便我们未来完结微服务的散发计划,固然是还是不是三个接口,可是大家给上游访问还是提供八个接口,大家内部贯彻访问该访问拾分接口。

关于具体怎发布也可参看那篇小说:

行使手续:

polly一般分为三步举行:

  • 概念规则: 定义你要拍卖的 错误卓殊/重临结果

  • 概念管理方式 : 重试,熔断,回退

  • 执行

概念规则: 
  

.Handle<ExceptionType>():限定条件的单个异常Policy;

.Handle<ExceptionType>(ex => ex.Number == 10):具有条件的单个异常类型。

.Handle<HttpRequestException>()
.Or<OperationCanceledException>():多个异常类型,当然他也可以变成具有条件的多个异常类型,类似于单个操作。

概念再次来到结果的规格:

.HandleResult<HttpResponseMessage>(r => r.StatusCode == HttpStatusCode.NotFound):用条件处理返回值,处理单个返回值。

.HandleResult<HttpResponseMessage>(r => r.StatusCode == HttpStatusCode.InternalServerError)
.OrResult<HttpResponseMessage>(r => r.StatusCode == HttpStatusCode.BadGateway):处理多个返回值。

 钦点计谋(重试):

.Retry():重试一次。

.Retry(3):重试三次,修改数值即可定义自己想使用的次数。

.Retry(3, (exception, retryCount) =>
    {
        // do something 
    }):重试多次,在每次重试都执行一个操作,参数为:当前异常和重试计数。

.Retry(3, (exception, retryCount, context) =>
    {
        // do something 
    }):重试多次,在每次重试都执行一个操作,参数为:当前异常,重试计数和上下文

.RetryForever():永远重试直到成功,同时也也有重试的相同扩展,可以写参数。

.WaitAndRetry(new[]
  {
    TimeSpan.FromSeconds(1),
    TimeSpan.FromSeconds(2),
    TimeSpan.FromSeconds(3)
  }):等待并重试,就是在每个重试的时候需要等待指定的执行时间,同样有相同扩展,可以在每个重试调用一个操作。

.WaitAndRetryForever(retryAttempt => 
 TimeSpan.FromSeconds(Math.Pow(2, retryAttempt))
    ):等待和重试永远(直到成功)

  钦定计策(熔断):

.CircuitBreaker(2, TimeSpan.FromMinutes(1)):在指定数量的连续异常之后中断开。这里就不做过多解释了。

 内定战略(降级):回退

.Fallback<UserAvatar>(UserAvatar.Blank):如果执行错误,则提供替代值,就是出现错误,定义一个返回值给他

.Fallback<UserAvatar>(() => UserAvatar.GetRandomAvatar()) :定义一个方法给他,该方法代替提供值。

执行: 

.Execute(() => DoSomething()):执行一项方法

执行通过任意上下文数据的操作:

var policy = Policy
    .Handle<SomeExceptionType>()
    .Retry(3, (exception, retryCount, context) =>
    {
        var methodThatRaisedException = context["methodName"];
        Log(exception, methodThatRaisedException);
    });

policy.Execute(
    () => DoSomething(),
    new Dictionary<string, object>() {{ "methodName", "some method" }}
);

路由小知识:

UpstreamHost=>”UpstreamHost”: “baidu.com”:上游主机

   
此功效允许你基于上游主机实行ReRoutes。这通过查阅客户端选用的主机头来办事,然后将其作为我们用来识别ReRoute的新闻的1某个。那样便是彰显了唯有在主机头值为baidu.com时才会同盟。

Priority=> “Priority”: 0:优先级

   
此意义设置访问路由的优先级,若是在同1个路由下有四个路由,会基于优先级相称优先级最高的,0是最低的。

Dynamic Routing:动态路由

   
那个关键是为着服务意识而落成的,在这种方式下,Ocelot将运用上游路线的第二个支行来查找服务开采提供商的下游服务。官方网址给出的大概配置效益:

澳门葡京备用网址 25澳门葡京备用网址 26

{
    "ReRoutes": [],
    "Aggregates": [],
    "GlobalConfiguration": {
        "RequestIdKey": null,
        "ServiceDiscoveryProvider": {
            "Host": "localhost",
            "Port": 8510,
            "Type": null,
            "Token": null,
            "ConfigurationKey": null
        },
        "RateLimitOptions": {
            "ClientIdHeader": "ClientId",
            "QuotaExceededMessage": null,
            "RateLimitCounterPrefix": "ocelot",
            "DisableRateLimitHeaders": false,
            "HttpStatusCode": 429
        },
        "QoSOptions": {
            "ExceptionsAllowedBeforeBreaking": 0,
            "DurationOfBreak": 0,
            "TimeoutValue": 0
        },
        "BaseUrl": null,
            "LoadBalancerOptions": {
            "Type": "LeastConnection",
            "Key": null,
            "Expiry": 0
        },
        "DownstreamScheme": "http",
        "HttpHandlerOptions": {
            "AllowAutoRedirect": false,
            "UseCookieContainer": false,
            "UseTracing": false
        }
    }
}

View Code

 使用示例:

降职的施用代码:

澳门葡京备用网址 27澳门葡京备用网址 28

 #region 降级
        public static void Downgrade()
        {
            //降级处理程序
            ISyncPolicy policy = Policy.Handle<ArgumentException>()
            .Fallback(() =>
            {
                Console.WriteLine("降级给的返回值结果");
            });
            //运行程序
            policy.Execute(() =>
            {
                Console.WriteLine("任务开始");

                throw new ArgumentException("降级任务出错,马上要降级了");

                Console.WriteLine("任务结束");
            });
        }
        #endregion

View Code

运转结果:

澳门葡京备用网址 29

重试机制的代码:

阴差阳错后再一次3遍。

澳门葡京备用网址 30澳门葡京备用网址 31

 #region 重试机制
        public static void Retry()
        {
            //配置重试次数
            ISyncPolicy policy = Policy.Handle<Exception>().Retry(3);

            try
            {
                policy.Execute(() =>
                {
                    Console.WriteLine("任务开始");
                    if (DateTime.Now.Second % 10 != 0)
                    {
                        throw new Exception("任务出错了,开始重试");
                    }
                    Console.WriteLine("任务结束");
                });
            }
            catch (Exception ex)
            {
                Console.WriteLine("异常结果 : " + ex.Message);
            }
        }
        #endregion

View Code

运维结果:

澳门葡京备用网址 32

 熔断机制代码:

但出现谬误总是三次后,等待20秒后举办

澳门葡京备用网址 33澳门葡京备用网址 34

 #region 熔断机制
        public static void Fusing()
        {

            Action<Exception, TimeSpan> onBreak = (exception, timespan) =>
            {
                Console.WriteLine("1");
            };
            Action onReset = () =>
            {
                Console.WriteLine("2");
            };
            ISyncPolicy policy = Policy.Handle<Exception>().CircuitBreaker(3, TimeSpan.FromSeconds(20), onBreak, onReset);
            while (true)
            {
                try
                {

                    policy.Execute(() =>
                        {
                            Console.WriteLine("任务开始");

                            throw new Exception("出错了");

                            Console.WriteLine("任务结束");
                        });

                }
                catch (Exception ex)
                {
                    Console.WriteLine("---------------异常结果-------------- : " + ex.Message + "时间:" + DateTime.Now);
                }
                System.Threading.Thread.Sleep(5000);
            }
        }
        #endregion

View Code

运转结果:

澳门葡京备用网址 35

错落示例(重试+降级)代码:

阴差阳错重试三回后第陆次实行降职管理:重如若warp方法来贯彻的,越发表明warp方法是:最外侧(在左手)到最中间(左侧)的国策。也正是说从右向左实践情势;

澳门葡京备用网址 36澳门葡京备用网址 37

 #region 重试+降级
        public static void RetryDowngrade()
        {
            try
            {
                //降级处理程序
                ISyncPolicy policy = Policy.Handle<Exception>()
                .Fallback(() =>
                {
                    Console.WriteLine("降级成功");
                });
                //配置重试次数
                ISyncPolicy policy2 = Policy.Handle<Exception>().Retry(3, (exception, retryCount, context) =>
                             {
                                 Console.WriteLine(retryCount);

                             });
                //合并
                ISyncPolicy mainPolicy = Policy.Wrap(policy, policy2);
                mainPolicy.Execute(() =>
                {
                    Console.WriteLine("任务开始");

                    throw new Exception("出错了");

                    Console.WriteLine("任务结束");
                });
            }
            catch (Exception ex)
            {

                Console.WriteLine("异常结果 : " + ex.Message);
            }
        }
        #endregion

View Code

运作结果:

澳门葡京备用网址 38

 源码下载:PollyConsole.rar

Ocelot兑现多少个端口的轮询:

如上落成的那么些有如何用啊,单独发表了接口,然后使用别的二个接口去复制他呢?别急,那只是中间的一在那之中坚使用,以后咱们有了大旨步骤,大家改壹改,完毕webapi宣布五个接口,8001,800二.然后还动用网关地址访问,能够循环的拜会到800一端口和800二端口。

聊起来轻巧,做起来也简要,大家只须求在大家地点的布署上修修改改一下就能够:

澳门葡京备用网址 39澳门葡京备用网址 40

{
  "ReRoutes": [
    {
      "DownstreamPathTemplate": "/api/Test/{postId}",
      "DownstreamScheme": "http",
      "DownstreamHostAndPorts": [
        {
          "Host": "127.0.0.1",
          "Port": 8001
        },
        {
          "Host": "127.0.0.1",
          "Port": 8002
        }
      ],
      "UpstreamPathTemplate": "/ProductService/{postId}",
      "UpstreamHttpMethod": [ "Get" ],
      "LoadBalancerOptions": {
        "Type": "RoundRobin"
      }
    }
  ],
  "GlobalConfiguration": {
    // "BaseUrl": "http://127.0.0.1:8887/"
  }
}

View Code

起步八个端口:

澳门葡京备用网址 41

双重请求网关两遍结果:

澳门葡京备用网址 42

连串目录

微服务连串小说重要介绍微服务所使用到的壹部分技巧和壹部分才能示范:

  • 微服务——微服务的介绍和目录
  • 微服务——【Consul】服务意识在windows下轻便利用(1)
  • 微服务——【polly】微服务故障管理库(贰)
  • 微服务——动态代理AspectCore的应用(三) 
  • 微服务——网关Ocelot+Consul完结集群轮询(肆)

Ocelot+ Consul:

落成目的:运转服务意识然后模拟集群公布作用,落成发布端口800壹,800二后,运行服务意识,然后配置Ocelot网关。完毕访问统一接口能够轮询访问800一,8002,800壹,8002,…这样。然后能够在丰盛800叁,继续平整。

福如东海上述对象大家不要求该大家的示范代码,只要求修改配置json文件就可以:

澳门葡京备用网址 43澳门葡京备用网址 44

{
  "ReRoutes": [
    {
      "DownstreamPathTemplate": "/api/Test/{postId}",
      "DownstreamScheme": "http",
      "UpstreamPathTemplate": "/Product123Service/{postId}",
      "UpstreamHttpMethod": [ "Get" ],
      "ServiceName": "ProductService",
      "LoadBalancerOptions": {
        "Type": "RoundRobin"
      },
      "UseServiceDiscovery": true
    }
  ],
  "GlobalConfiguration": {
    // "BaseUrl": "http://127.0.0.1:8887/"
    "ServiceDiscoveryProvider": {
      "Host": "localhost",
      "Port": 8500,
      "Type": "PollConsul",
      "PollingInterval": 100
    }
  }
}

View Code

那几个正是大家的服务职能:

Ocelot允许你钦点服务意识提供程序,并应用它来查找Ocelot正在将请求转载给下游服务的主机和端口。目前,那仅在GlobalConfiguration部分中受扶助,那象征将为富有的ReRoute使用同样的服务意识提供程序,以便在ReRoute品级钦定瑟维斯Name。

  • ServiceName:consul的劳务名称
  • LoadBalancerOptions:使用的算法,近年来有三种Round罗布in(轮询形式)和LeastConnection(最小连接)
  • UseServiceDiscovery:是还是不是启用服务意识成效 true:为运维
  • ServiceDiscoveryProvider:配置服务意识的局地配置
  • Host:主机地址
  • Port:端口
  • PollingInterval:轮询的间隔时间,以微秒为单位。并报告Ocelot多长期能够向Consul调用劳动配置的改造

想要掌握越来越多能够访问Ocelot官方网址:

层层目录:

微服务类别小说重要介绍微服务所使用到的部分本领和有个别才具演示:

  • 微服务——微服务的牵线和目录
  • 微服务——【Consul】服务意识在windows下轻便利用(壹)
  • 微服务——【polly】微服务故障管理库(2)
  • 微服务——动态代理AspectCore的施用(叁) 
  • 微服务——网关Ocelot+Consul实现集群轮询(四)

相关文章

发表评论

电子邮件地址不会被公开。 必填项已用*标注

*
*
Website