91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

.NET中負載均衡怎么使用

發布時間:2022-06-24 11:46:09 來源:億速云 閱讀:148 作者:iii 欄目:開發技術

本篇內容介紹了“.NET中負載均衡怎么使用”的有關知識,在實際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領大家學習一下如何處理這些情況吧!希望大家仔細閱讀,能夠學有所成!

一、簡介

負載均衡(Load Balance),簡稱 LB,就是將并發的用戶請求通過規則后平衡、分攤到多臺服務器上進行執行,以此達到壓力分攤、數據并行的效果。常見的算法也有許多隨機、輪詢、加權等,今天我們就使用 C# 來實現這幾種算法,并講解在實際項目中的使用。

二、應用場景

負載均衡算法在開發層面,使用場景其實并不多。通常在項目重構、轉型、上線大版本新功能等,為了避免上線出現 Bug 應用功能 100% 的掛掉。可以在程序中使用負載均衡,將部分 HTTP 流量,打入項目中新的功能模塊,然后進行監控,出現問題可以及時進行調整。

這樣 AB 測試的場景,也可以在運維或者網關等其他層面實現流量分配。但現實是大多數公司項目因為一些原因沒有這樣的支持,這時開發就可以在項目中使用代碼進行實現。

三、實際案例

有這樣一個需求,電商系統中,有一個預估運費的微服務(ShippingCharge )。此時上面領導來了需求,預估運費要改版,開發預估了一下改動不小。經過兩周的奮斗 ShippingCharge 需求終于開發測試好了,此時要上線,但是掐指一算,萬一有問題不就死翹翹了,而且還和錢相關。

此時負載均衡算法就派上用場了,我們可以讓 10% 的流量打入這次的改動,可以先進行監控,可以再全部切過來。實際項目中,使用的肯定是權重的,后面隨機、輪詢也簡單進行介紹一下其實現。

假設在改動 ShippingCharge 時,沒有修改舊的功能,是在 controller 下面,對 call business 層換成了這次需求的,這樣我們就可以使用負載均衡,讓 10% 的流量打入新的 business,其余的依然走老的 business。

四、算法實現

這里不會說的太精細,會將核心實現代碼做介紹,實際項目中使用需要自己進行一下結合,舉一反三哈

下面定義了一個 ServiceCenterModel 主要用作承載需要負載均衡的對象信息,可以是 call 下游的 url,也可以是程序內的某一算法標

4.1 隨機

隨機算法的先對來講,較為簡單一些,主要根據 Random 與 ServiceList 的數量結合實現。

如下:

/// <summary>
/// 隨機
/// </summary>
public class RandomAlgorithm
{
    /// <summary>
    /// Random Function
    /// </summary>
    private static readonly Random random = new Random();

    /// <summary>
    /// serviceList
    /// </summary>
    /// <param name="serviceList">service url set</param>
    /// <returns></returns>
    public static string Get(List<ServiceCenterModel> serviceList)
    {
        if (serviceList == null)
            return null;

        if (serviceList.Count == 1)
            return serviceList[0].Service;

        // 返回一個小于所指定最大值的非負隨機數
        int index = random.Next(serviceList.Count);

        string url = serviceList[index].Service;

        return url;
    }
}

模擬 10 次 http request,可以看到對OldBusiness、NewBusiness進行了隨機的返回

public static void Main(string[] args)
{
    // 模擬從配置中心讀取 Service 
    var serviceList = new List<ServiceCenterModel>()
    {
        new ServiceCenterModel { Service ="OldBusiness"},
        new ServiceCenterModel { Service ="NewBusiness"},
    };

    // 模擬 Http 請求次數
    for (int i = 0; i < 10; i++)
    {
        Console.WriteLine(RandomAlgorithm.Get(serviceList));
    }
}

.NET中負載均衡怎么使用

4.2 輪詢

輪詢的實現思路,將每次讀取 ServiceList 的 Index 放到靜態全局變量中,當到 ServiceList 最后一個時從0開始讀取。

如下:

/// <summary>
/// 輪詢
/// </summary>
public class PollingAlgorithm
{
    private static Dictionary<string, int> _serviceDic = new Dictionary<string, int>();
    private static SpinLock _spinLock = new SpinLock();

    /// <summary>
    /// Get URL From Service List
    /// </summary>
    /// <param name="serviceList">Service URL Set</param>
    /// <param name="serviceName">Service Name</param>
    /// <returns></returns>
    public static string Get(List<ServiceCenterModel> serviceList, string serviceName)
    {
        if (serviceList == null || string.IsNullOrEmpty(serviceName))
            return null;

        if (serviceList.Count == 1)
            return serviceList[0].Service;

        bool locked = false;
        _spinLock.Enter(ref locked);//獲取鎖
        int index = -1;
        if (!_serviceDic.ContainsKey(serviceName)) // Not Exist
            _serviceDic.TryAdd(serviceName, index);
        else
            _serviceDic.TryGetValue(serviceName, out index);
        string url = string.Empty;
        ++index;
        if (index > serviceList.Count - 1) //當前索引 > 最新服務最大索引
        {
            index = 0;
            url = serviceList[0].Service;
        }
        else
        {
            url = serviceList[index].Service;
        }
        _serviceDic[serviceName] = index;

        if (locked) //釋放鎖
            _spinLock.Exit();

        return url;
    }
}

模擬 10 次 http request,可以看到對OldBusiness、NewBusiness進行了輪詢返回

public static void Main(string[] args)
{
    // 模擬從配置中心讀取 Service 
    var serviceList = new List<ServiceCenterModel>()
    {
        new ServiceCenterModel { Service ="OldBusiness"},
        new ServiceCenterModel { Service ="NewBusiness"},
    };

    // 模擬 Http 請求次數
    for (int i = 0; i < 10; i++)
    {
        Console.WriteLine(PollingAlgorithm.Get(serviceList, "ShippingChargeBusiness"));
    }
}

.NET中負載均衡怎么使用

4.3 權重

權重的實現思路,將配置權重的 Service 按照數量放置在一個集合中,然后按照輪詢的方式進行讀取,需要注意的是這的 weight 只能配置大于 0 的整數。

如下:

/// <summary>
/// 權重
/// </summary>
public class WeightAlgorithm
{
    private static ConcurrentDictionary<string, WeightAlgorithmItem> _serviceDic = new ConcurrentDictionary<string, WeightAlgorithmItem>();
    private static SpinLock _spinLock = new SpinLock();

    public static string Get(List<ServiceCenterModel> serviceList, string serviceName)
    {
        if (serviceList == null)
            return null;

        if (serviceList.Count == 1)
            return serviceList[0].Service;

        bool locked = false;
        _spinLock.Enter(ref locked);//獲取鎖

        WeightAlgorithmItem weightAlgorithmItem = null;
        if (!_serviceDic.ContainsKey(serviceName))
        {
            weightAlgorithmItem = new WeightAlgorithmItem()
            {
                Index = -1,
                Urls = new List<string>()
            };
            BuildWeightAlgorithmItem(weightAlgorithmItem, serviceList);
            _serviceDic.TryAdd(serviceName, weightAlgorithmItem);
        }
        else
        {
            _serviceDic.TryGetValue(serviceName, out weightAlgorithmItem);
            weightAlgorithmItem.Urls.Clear();
            BuildWeightAlgorithmItem(weightAlgorithmItem, serviceList);
        }

        string url = string.Empty;
        ++weightAlgorithmItem.Index;
        if (weightAlgorithmItem.Index > weightAlgorithmItem.Urls.Count - 1) //當前索引 > 最新服務最大索引
        {
            weightAlgorithmItem.Index = 0;
            url = serviceList[0].Service;
        }
        else
        {
            url = weightAlgorithmItem.Urls[weightAlgorithmItem.Index];
        }
        _serviceDic[serviceName] = weightAlgorithmItem;

        if (locked) //釋放鎖
            _spinLock.Exit();

        return url;
    }

    private static void BuildWeightAlgorithmItem(WeightAlgorithmItem weightAlgorithmItem, List<ServiceCenterModel> serviceList)
    {
        serviceList.ForEach(service => //有幾個權重就加幾個實例
        {
            for (int i = 0; i < service.Weight; i++)
            {
                weightAlgorithmItem.Urls.Add(service.Service);
            }
        });
    }
}
public class WeightAlgorithmItem
{
    public List<string> Urls { get; set; }
    public int Index { get; set; }
}

模擬 10 次 http request,可以看到對 OldBusiness 返回了 9 次,NewBusiness 返回了一次

public static void Main(string[] args)
{
    // 模擬從配置中心讀取 Service 
    var serviceList = new List<ServiceCenterModel>()
    {
        new ServiceCenterModel { Service ="OldBusiness",Weight = 9 },
        new ServiceCenterModel { Service ="NewBusiness",Weight = 1 },
    };

    // 模擬 Http 請求次數
    for (int i = 0; i < 10; i++)
    {
        Console.WriteLine(WeightAlgorithm.Get(serviceList, "ShippingChargeBusiness"));
    }
}

.NET中負載均衡怎么使用

“.NET中負載均衡怎么使用”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業相關的知識可以關注億速云網站,小編將為大家輸出更多高質量的實用文章!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

西峡县| 衢州市| 通辽市| 东辽县| 枣强县| 建宁县| 乐业县| 灵武市| 长子县| 孙吴县| 富顺县| 元谋县| 田阳县| 孝昌县| 龙江县| 德化县| 浮山县| 泾川县| 广安市| 安远县| 墨江| 名山县| 绥化市| 永善县| 青州市| 凉山| 济南市| 子洲县| 盘山县| 东明县| 靖远县| 桦南县| 鹤壁市| 苍山县| 合山市| 合江县| 河源市| 天等县| 绥阳县| 德保县| 慈利县|