API網關與服務發現


Ocelot

Ocelot是一個用.NET Core實現並且開源的API網關,它功能強大,包括了:路由、請求聚合、服務發現、認證、鑒權、限流熔斷、並內置了負載均衡器與Service Fabric、Butterfly Tracing集成。

API網關—— 它是系統的暴露在外部的一個訪問入口。這個有點像代理訪問的家伙,就像一個公司的門衛承擔着尋址、限制進入、安全檢查、位置引導、等等功能。

依賴包

  • using Ocelot.DependencyInjection;
  • using Ocelot.Middleware;

Consul

在Ocelot已經支持簡單的負載功能,也就是當下游服務存在多個結點的時候,Ocelot能夠承擔起負載均衡的作用。但是它不提供健康檢查,服務的注冊也只能通過手動在配置文件里面添加完成。這不夠靈活並且在一定程度下會有風險。這個時候我們就可以用Consul來做服務發現,它能與Ocelot完美結合。

它是一個一個分布式的,高度可用的系統,
而且開發使用都很簡便。它提供了一個功能齊全的控制平面,主要特點是:服務發現、健康檢查、鍵值存儲、安全服務通信、多數據中心。

安裝

1.官網地址https://www.consul.io/

2.添加到環境變量

image

執行consul看是否安裝成功

image

執行consul agent啟動可能會遇到的問題

image

解決方法

  • 配置地址consul agent -dev -bind 192.168.199.112

image

Polly

  • Install-Package Polly
using Polly;

using System;
using System.Net;
using System.Net.Http;
using System.Threading;

namespace PollyDemo.Console
{
    class Program
    {

        static void Main(string[] args)
        {

            //Policy
            //    // 1. 指定要處理什么異常
            //    .Handle<HttpRequestException>()
            //    //    或者指定需要處理什么樣的錯誤返回
            //    .OrResult<HttpResponseMessage>(r => r.StatusCode == HttpStatusCode.BadGateway)
            //    // 2. 指定重試次數和重試策略
            //    .Retry(5, (exception, retryCount, context) =>
            //    {
            //        System.Console.WriteLine($"開始第 {retryCount} 次重試:");
            //    })
            //    // 3. 執行具體任務
            //    .Execute(ExecuteMockRequest);


            try
            {
                Policy.Handle<DivideByZeroException>()
                   .Retry(5, (ex, count) =>
                   {
                       System.Console.WriteLine("執行失敗! 重試次數 {0}", count);
                       System.Console.WriteLine("異常來自 {0}", ex.GetType().Name);
                   }).Execute(() =>
                   {
                       Compute();
                   });
            }
            catch (Exception ex)
            {

                System.Console.WriteLine("重試失敗:"+ex.InnerException);
            }
           


            System.Console.WriteLine("程序結束,按任意鍵退出。");
            System.Console.ReadKey();
        }

        static HttpResponseMessage ExecuteMockRequest()
        {
            // 模擬網絡請求
            System.Console.WriteLine("正在執行網絡請求...");
            Thread.Sleep(3000);
            // 模擬網絡錯誤
            return new HttpResponseMessage(HttpStatusCode.BadGateway);
        }


        static int Compute()
        {
            System.Console.WriteLine("正在執行Compute()...");
            Thread.Sleep(3000);
            int a = 0;
            return 1 / a;
        }
    }
}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM