zoukankan      html  css  js  c++  java
  • ketchup服务治理

    ketcup  git地址:https://github.com/simple-gr/ketchup

    服务治理是什么

      企业为了确保事情顺利完成而实施的过程,包括最佳实践、架构原则、治理规程、规律以及其他决定性的因素。

      我理解的就是服务治理就是一颗药,用来治疗服务之间存在的各种疑难杂症从而能让他正常的运行起来。

     治理的策略

     负载均衡

      为了提高可用性、降低延迟,同一个服务可能会部署多个实例,负载均衡就是为了在服务的多个实例之间进行分配负载,已达到优化资源使用、最大化吞吐率,同时避免过载。

    限流

      服务的流量可能是动态的,如果流量增加,超过服务承载范围,就会影响用户掩。通过限制服务能使用的资源,当监控到流量超过设定的阈值时,服务拒绝处理新的用户请求。当系统压力过大时,对系统的非核心业务进行限流,避免因压力过大导致整个系统奔溃。

    容错

      生产环境中的每个微服务并不是具有百分百的可靠。服务之间跨网络调用,增加了调用失败的可能性。因此,如何保证微服务系统的可靠性,也变得更为复杂和困难。所以,微服务系统在设计之初就需要考虑容错机制,当系统负载过高时,可以确保核心业务不被破坏,以及当某个服务出错时,把影响范围降低到最小,避免整个系统不可用。

    配置 

      服务在运行过程中,需要和其他服务协作,同时他也会依赖基础设施或其他服务完成某项业务功能。在这个过程中,就需要多样化的配置信息。源码中硬编码配置信息,虽然实现成本低,但是这种方式不仅缺乏灵活性,而且容易造成信息泄露。因此,较好的方式是将配置与代码分离。采用独立于代码的外部机制存储配置信息。

    ketchup 中的实现

      当有rpc请求时,负载均衡策略决定那个子通道即grpc服务器将接收请求。(当前实现的负载算法有随机数与轮询算法)

      使用方式是在配置文件中直接设置:

      

    "Consul": {
        "ConnectionString": "192.168.180.55:8500",
        "IsHealthCheck": true,
        "Strategy":"Random" //负载策略 Random(随机算法),Polling(轮询算法)
      }

        容错限流配置需要在属性上面设置

       Service 声明为服务类型

      HystrixCommand 设置限流 容错,超时等机制

        [Service(Name = "grpc.domain.RpcTest")]
        public class HelloService : RpcTest.RpcTestBase
        {       
            [HystrixCommand(MethodName = nameof(SayHello), ExcuteTimeoutInMilliseconds = 3000)]
            public override async Task<HelloReponse> SayHello(HelloRequest request, ServerCallContext context)
            {           
                var result = await _cache.GetAsync<string>("a");
    
                return new HelloReponse()
                {
                    Code = 1,
                    Msg = "hello simple",
                    Result = JsonConvert.SerializeObject(result)
                };
            }        
        }

      HystrixCommand 可配置治理功能  

        public class HystrixCommandAttribute : Attribute
        {
            public string MethodName { get; set; }
    
            /// <summary>
            /// 执行超时时间
            /// </summary>
            public int ExcuteTimeoutInMilliseconds { get; set; } = 10000;
    
            /// <summary>
            /// 最大信号量
            /// </summary>
            public int MaxRequests { get; set; } = 0;
    
            /// <summary>
            /// 最大信号量的限定时间
            /// 默认1s
            /// </summary>
            public int MaxRequestsTime { get; set; } = 1000;
    
            /// <summary>
            /// 至少多少请求失败,熔断器才发挥起作用
            /// </summary>
            public int BreakerRequestCircuitBreaker { get; set; } = 10;
    
            /// <summary>
            /// 是否开启服务降级
            /// </summary>
            public bool EnableServiceDegradation { get; set; }
    
            /// <summary>
            /// 降级缓存类型
            /// </summary>
            public CacheModel Cache { get; set; } = CacheModel.Memory;
    
            /// <summary>
            /// 降级缓存时间
            /// 单位 秒
            /// </summary>
            public int ServiceDegradationTimeSpan { get; set; } = 10;
        }

     写在最后 

    QQ群:592407137 期待大家一起研究,学习~~

    开源不易,如果喜欢,请给予一个Start 给予支持。谢谢!

  • 相关阅读:
    冰思《L.M》
    Delphi 基本语法与操作《转》
    ADO实现单条记录的刷新《转》
    js正则限制input框输入的常用代码《转》
    Delphi 获取汉字的拼音首字母《转》
    baby one more time
    邮件/域名/DNS相关知识
    Visual Studio 2005 正式版(RTM) BT下载地址
    经典爱情十句话
    Asp中使用存储过程代码收集
  • 原文地址:https://www.cnblogs.com/alangur/p/12965908.html
Copyright © 2011-2022 走看看