Example #1
0
        /// <summary>
        /// 根据服务名返回IP地址
        /// </summary>
        /// <param name="serviceName"></param>
        /// <param name="flowControlCfgKey"></param>
        /// <param name="clientIp"></param>
        /// <returns></returns>
        public async Task <IPEndPoint> GetFlowControlEndPointByServicePath(string serviceName, ServiceConfigureInfo configure, IPEndPoint clientIp)
        {
            //根据服务返回健康地址
            var healthNode = await _registerCenter.GetServieByName(serviceName);

            if (healthNode != null && healthNode.Any())
            {
                if (configure != null)
                {
                    //更新健康节点和缓存同步
                    configure.ReflushConfigureEndPoint(healthNode);
                    //若配置流控,则进行熔断和限流检测
                    var point = await _breaker.CheckCircuitByEndPoint(configure, clientIp);

                    if (point != null)
                    {
                        //将有效地址的熔断数据清空
                        configure.CleanBreakTimes();
                        return(point);
                    }
                }
                else
                {
                    //如果当前服务并未配置流控,则直接负载均衡返回节点
                    return(_endPointConfigure.GetServieByLoadBalane(healthNode, clientIp, LoadBalanceType.IPHash));
                }
            }
            else
            {
                //删除所有地址并同步
                if (configure != null)
                {
                    configure.RemoveAllNode();
                }
                _logger.LogError($"没有找到健康的服务节点:{serviceName}");
            }
            return(null);
        }