1. 程式人生 > >.NET Core 微服務架構 Steeltoe 使用(基於 Spring Cloud)

.NET Core 微服務架構 Steeltoe 使用(基於 Spring Cloud)

閱讀目錄:

  • 1. Spring Cloud Eureka 註冊服務及呼叫
  • 2. Spring Cloud Hystrix 斷路器
  • 3. Spring Cloud Hystrix 指標監控
  • 4. Spring Cloud Config 配置中心

現在主流的開發平臺是微服務架構,在眾多的微服務開源專案中,Spring Cloud 非常具有代表性,但實現平臺是基於 Java,那在 .NET Core 平臺下,如何相容實現 Spring Cloud 呢?答案就是 Steeltoe,或者你也可以自行實現,因為 Spring Cloud 各元件基本都是基於 REST HTTP 介面實現,你可以使用任何語言實現相容。

關於 Steeltoe 的官方介紹:

Steeltoe is an open source project that enables .NET developers to implement industry standard best practices when building resilient microservices for the cloud. The Steeltoe client libraries enable .NET Core and .NET Framework apps to easily leverage Netflix Eureka, Hystrix, Spring Cloud Config Server, and Cloud Foundry services.

這邊就不翻譯了,需要注意的幾點:

  • Netflix Eureka:服務註冊中心,實現服務註冊,以及服務發現呼叫。
  • Hystrix:斷路器,實現熔斷處理。
  • Spring Cloud Config Server:分散式配置中心,主要是讀取配置中心的資訊。
  • Cloud Foundry:開源 PaaS 雲平臺,Steeltoe 基本都執行在此平臺上,執行在其他平臺相容不好。

另外,Steeltoe 不僅支援 .NET Core,還支援 .NET Framework(具體 ASP.NET 4.x 版本)。

1. Spring Cloud Eureka 註冊服務及呼叫

首先,需要部署一個或多個 Spring Cloud Eureka 服務註冊中心,可以使用 Spring Boot 很方便進行實現,這邊就不說了。

建立一個 APS.NET Core 應用程式(2.0 版本),然後 Nuget 安裝程式包:

> install-package Pivotal.Discovery.ClientCore

appsettings.json配置檔案中,增加下面配置:

{
  "spring": {
    "application": {
      "name": "fortune-service"
    }
  },
  "eureka": {
    "client": {
      "serviceUrl": "http://192.168.1.32:8100/eureka/",
      "shouldFetchRegistry": true, //Enable or disable registering as a service
      "shouldRegisterWithEureka": true, //Enable or disable discovering services
      "validate_certificates": false
    },
    "instance": {
      //"hostName": "localhost",
      "port": 5000
    }
  }
}

這樣我們啟動 APS.NET Core 應用程式,就會將fortune-service服務註冊到 Eureka 中了。

EUREKA-CLIENT是用 Spring Boot 實現的一個服務,下面我們測試FORTUNE-SERVICE如何呼叫EUREKA-CLIENT

建立一個IEurekaClientService介面:

public interface IEurekaClientService
{
    Task<string> GetServices();
}

然後再建立IEurekaClientService介面的實現EurekaClientService

public class EurekaClientService : IEurekaClientService
{
    DiscoveryHttpClientHandler _handler;

    private const string GET_SERVICES_URL = "http://eureka-client/home";
    private ILogger<EurekaClientService> _logger;

    public EurekaClientService(IDiscoveryClient client, ILoggerFactory logFactory = null)
        :base(options)
    {
        _handler = new DiscoveryHttpClientHandler(client, logFactory?.CreateLogger<DiscoveryHttpClientHandler>());
        _logger = logFactory?.CreateLogger<EurekaClientService>();
    }

    public async Task<string> GetServices()
    {
        _logger?.LogInformation("GetServices");
        var client = GetClient();
        return await client.GetStringAsync(GET_SERVICES_URL);

    }

    private HttpClient GetClient()
    {
        var client = new HttpClient(_handler, false);
        return client;
    }
}

然後建立一個FortunesController

[Route("api")]
public class FortunesController : Controller
{
    private IEurekaClientService _eurekaClientService;
    private ILogger<FortunesController> _logger;
    public FortunesController(IEurekaClientService eurekaClientService, ILogger<FortunesController> logger)
    {
        _eurekaClientService = eurekaClientService;
        _logger = logger;
    }

    // GET: api/services
    [HttpGet("services")]
    public async Task<IActionResult> GetServices()
    {
        _logger?.LogInformation("api/services");
        return Ok(await _eurekaClientService.GetServices());
    }
}

最後在Startup.cs中,新增如下配置:

public class Startup
{
    public Startup(IConfiguration configuration)
    {
        Configuration = configuration;
    }

    public IConfiguration Configuration { get; private set; }

    // This method gets called by the runtime. Use this method to add services to the container.
    public void ConfigureServices(IServiceCollection services)
    {
        // 載入服務註冊配置
        services.AddDiscoveryClient(Configuration);

        // Add framework services.
        services.AddMvc();
    }

    // This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
    public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory, IApplicationLifetime lifetime)
    {
        app.UseStaticFiles();

        app.UseMvc();

        // 啟動服務註冊
        app.UseDiscoveryClient();
    }
}

然後重新啟動服務,執行命令:

$ curl http://192.168.1.3:5000/api/services
Services(get all by DiscoveryClient): [eureka-client, fortune-service]%

可以看到,呼叫是成功的,實際呼叫的是EUREKA-CLIENT服務的介面,獲取的是 Eureka 註冊中心,所有的註冊服務資訊。

2. Spring Cloud Hystrix 斷路器

Spring Cloud Hystrix 的實現,需要我們對上面的專案進行改造下。

IEurekaClientService增加一個GetServicesWithHystrix介面:

public interface IEurekaClientService
{
    Task<string> GetServices();

    Task<string> GetServicesWithHystrix();
}

然後對其進行實現:

public class EurekaClientService : HystrixCommand<string>, IEurekaClientService
{
    DiscoveryHttpClientHandler _handler;

    private const string GET_SERVICES_URL = "http://eureka-client/home";
    private ILogger<EurekaClientService> _logger;

    public EurekaClientService(IHystrixCommandOptions options, IDiscoveryClient client, ILoggerFactory logFactory = null)
        :base(options)
    {
        _handler = new DiscoveryHttpClientHandler(client, logFactory?.CreateLogger<DiscoveryHttpClientHandler>());
        IsFallbackUserDefined = true;
        _logger = logFactory?.CreateLogger<EurekaClientService>();
    }

    public async Task<string> GetServices()
    {
        _logger?.LogInformation("GetServices");
        var client = GetClient();
        return await client.GetStringAsync(GET_SERVICES_URL);

    }

    public async Task<string> GetServicesWithHystrix()
    {
        _logger?.LogInformation("GetServices");
        var result = await ExecuteAsync();
        _logger?.LogInformation("GetServices returning: " + result);
        return result;
    }

    protected override async Task<string> RunAsync()
    {
        _logger?.LogInformation("RunAsync");
        var client = GetClient();
        var result = await client.GetStringAsync(GET_SERVICES_URL);
        _logger?.LogInformation("RunAsync returning: " + result);
        return result;
    }

    protected override async Task<string> RunFallbackAsync()
    {
        _logger?.LogInformation("RunFallbackAsync");
        return await Task.FromResult("This is a error(服務斷開,稍後重試)!");
    }

    private HttpClient GetClient()
    {
        var client = new HttpClient(_handler, false);
        return client;
    }
}

然後還需要在Startup.cs中添加註入:

public void ConfigureServices(IServiceCollection services)
{
    // Register FortuneService Hystrix command
    services.AddHystrixCommand<IEurekaClientService, EurekaClientService>("eureka-client", Configuration);
}

然後重啟服務,執行命令:

$ curl http://192.168.1.3:5000/api/services/hystrix
Services(get all by DiscoveryClient): [eureka-client, fortune-service]%

Hystrix 斷路器的作用,體現在呼叫服務出現問題不能訪問,這邊可以進行熔斷處理,我們把eureka-client服務停掉,然後再進行訪問測試:

$ curl http://192.168.1.3:5000/api/services/hystrix
This is a error(服務斷開,稍後重試)!%

可以看到,Hystrix 起到了作用。

3. Spring Cloud Hystrix 指標監控

在實際應用中,我們需要對 Hystrix 斷路器進行監控,比如熔斷請求有多少等等,Spring Cloud 中的實現有 Turbine 進行收集,資料展示的話使用 Hystrix Dashboard。

這邊需要我們先建立一個 Hystrix Dashboard 專案,我使用的 Spring Boot 進行實現,這邊就不敘述了。

我們需要再對上面的專案進行改造,在Startup.cs中新增配置,以啟動 Hystrix 指標監控。

public class Startup
{
    public void ConfigureServices(IServiceCollection services)
    {
        // Add Hystrix metrics stream to enable monitoring 
        services.AddHystrixMetricsStream(Configuration);
    }

    // This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
    public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory, IApplicationLifetime lifetime)
    {
        // Startup Hystrix metrics stream
        app.UseHystrixMetricsStream();
    }
}

另外,還需要配置下Fortune-Teller-Service.csproj

<ItemGroup Condition="'$(BUILD)' == 'LOCAL'">
    <PackageReference Include="Steeltoe.CircuitBreaker.Hystrix.MetricsStreamCore" Version="2.0.0" />
    <PackageReference Include="RabbitMQ.Client" Version="5.0.1" />
  </ItemGroup>

<ItemGroup Condition="'$(BUILD)' == ''">
  <PackageReference Include="Steeltoe.CircuitBreaker.Hystrix.MetricsEventsCore" Version="2.0.0" />
  <PackageReference Include="System.Threading.ThreadPool" Version="4.3.0" />
</ItemGroup>

然後重啟專案,然後瀏覽器開啟:http://192.168.1.3:5000/hystrix/hystrix.stream

會看到不斷實時重新整理的 Hystrix 指標監控資料了,但顯示並不友好,我們還需要在儀表盤中顯示。

然後點選 Monitor Stream 按鈕,就可以看到 Hystrix 圖形化監控了(多次請求http://192.168.1.3:5000/api/services/hystrix,以便測試):

另外,ASP.NET 4.x 版本配置的話,訪問http://192.168.1.3:5000/hystrix/hystrix.stream會報 404 錯誤,原因是 ASP.NET 4.x 版本暫不支援 Cloud Foundry 以外的平臺,詳情參見

4. Spring Cloud Config 配置中心

需要注意的是,這邊只測試 Steeltoe 讀取配置中心資料,需要先開發一個 Spring Cloud Config Server 配置中心服務,這邊就不敘述了。

info:
  profile: dev
  name: xishuai7
  password: '{cipher}AQAc+v42S+FW7H5DiATfeeHY887KLwmeBq+cbXYslcQTtEBNL9a5FKbeF1qDpwrscWtGThPsbb0QFUMb03FN6yZBP2ujF29J8Fvm89igasxA7F67ohJgUku5ni9qOsMNqm5juexCTGJvzPkyinymGFYz55MUqrySZQPbRxoQU9tcfbOv9AH4xR/3DPe5krqjo3kk5pK6QWpH37rBgQZLmM7TWooyPiRkuc5Wn/1z6rQIzH5rCLqv4C8J16MAwgU1W+KTrHd4t8hIDAQG9vwkL9SYAvlz38HMKL9utu2g4c9jhAJE/H0mePlp+LDrWSgnC+R+nyH91niaUlwv3wsehP0maYCgEsTJn/3vsNouk5VCy4IGGZbkPubuJM6hE8RP0r4='

注:對password進行了加密處理。

建立一個 APS.NET Core 應用程式(2.0 版本),然後 Nuget 安裝程式包:

> install-package Steeltoe.Extensions.Configuration.ConfigServerCore

appsettings.json配置檔案中,增加下面配置:

{
  "spring": {
    "application": {
      "name": "xishuai-config" //配置檔名稱
    },
    "cloud": {
      "config": {
        "uri": "http://manager1:8180", //指向配置中心地址
        "env": "dev" //配置中心profile
      }
    }
  }
}

然後建立一個ConfigServerData模型:

public class ConfigServerData
{
    public Info Info { get; set; }
}

public class Info
{
    public string Profile { get; set; }
    public string Name { get; set; }
    public string Password { get; set; }
}

增加HomeController訪問:

public class HomeController : Controller
{
    private IOptionsSnapshot<ConfigServerData> IConfigServerData { get; set; }

    private IConfigurationRoot Config { get; set; }

    public HomeController(IConfigurationRoot config, IOptionsSnapshot<ConfigServerData> configServerData)
    {
        if (configServerData != null)
            IConfigServerData = configServerData;

        Config = config;
    }

    public IActionResult Error()
    {
        return View();
    }

    public ConfigServerData ConfigServer()
    {
        var data = IConfigServerData.Value;
        return data;
    }

    public IActionResult Reload()
    {
        if (Config != null)
        {
            Config.Reload();
        }

        return View();
    }
}

Startup.cs中增加配置:

public class Startup
{
    public Startup(IHostingEnvironment env)
    {
        var builder = new ConfigurationBuilder()
            .SetBasePath(env.ContentRootPath)
            .AddJsonFile("appsettings.json", optional: false, reloadOnChange: true)
            .AddJsonFile($"appsettings.{env.EnvironmentName}.json", optional: true)
            .AddEnvironmentVariables()
            .AddConfigServer(env);
        Configuration = builder.Build();
    }

    public IConfiguration Configuration { get; set; }

    // This method gets called by the runtime. Use this method to add services to the container.
    public void ConfigureServices(IServiceCollection services)
    {
        services.AddOptions();

        // Optional:  Adds IConfiguration and IConfigurationRoot to service container
        services.AddConfiguration(Configuration);

        // Adds the configuration data POCO configured with data returned from the Spring Cloud Config Server
        services.Configure<ConfigServerData>(Configuration);
    }
}

啟動專案,然後執行命令:

$ curl http://192.168.1.3:5000/home/ConfigServer
{"info":{"profile":"dev","name":"xishuai7","password":"xishuai123"}}

當配置中心資料更新了,可以訪問http://192.168.1.3:5000/home/Reload進行重新整理配置。

參考資料:

相關推薦

.NET Core 服務架構 Steeltoe 使用基於 Spring Cloud

閱讀目錄: 1. Spring Cloud Eureka 註冊服務及呼叫 2. Spring Cloud Hystrix 斷路器 3. Spring Cloud Hystrix 指標監控 4. Spring Cloud Config 配置中心 現在主流的開發平臺是微服務架構,在眾多的微服務開源專案中,Sp

ASP.NET Core服務 on K8SJessetalk第一章:詳解基本物件及服務發現持續更新

課程連結:http://video.jessetalk.cn/course/explore 良心課程,大家一起來學習哈! 任務1:課程介紹 任務2:Labels and Selectors 所有資源物件(包括Pod, Service, Namespace, Volume)都可以打

服務架構框架選擇:Spring Cloud 和 Dubbo對比

知乎轉載 樓層1: 從專案的背景來看,Dubbo 國內用的公司挺多,國內影響力大,Spring Cloud 自然在國外影響力較大,所以這個來看不分伯仲了,畢竟都有大公司在使用。 從社群的活躍度來看,可以看下各自的Github託管專案來區分。Dubbo ·

高並發、高可用、服務架構選型Dubbo與Spring Cloud【純幹貨,必收藏】!

service paas 裏的 輸出 bfd urb 周期 抽象 trac 一.Dubbo Dubbo,是阿裏巴巴服務化治理的核心框架,並被廣泛應用於阿裏巴巴集團的各成員站點(阿裏巴巴現在使用架構為HSF)。 於2012-10-24最後版本2.5.3成為最後一版本,由當當

.NET Core服務基於Consul實現服務治理

shell pla code tst 分層 編輯 set req \n 上一篇發布之後,這一篇把上一篇沒有弄到的東西補一下,也算是給各位前來詢問的朋友的一些回復吧。一、Consul服務註冊之配置文件方式1.1 重溫Consul實驗集群  這裏我們有三個Consul Serv

.NET Core服務基於Steeltoe使用Eureka實現服務註冊與發現

一、關於Steeltoe與Spring Cloud    Steeltoe is an open source project that enables .NET developers to implement industry standard best practices when b

.NET Core服務基於Steeltoe整合Zuul實現統一API閘道器

一、關於Spring Cloud Zuul   API Gateway(API GW / API 閘道器),顧名思義,是出現在系統邊界上的一個面向API的、序列集中式的強管控服務,這裡的邊界是企業IT系統的邊界。   Zuul 是Netflix 提供的一個開源元件,致力於在雲平臺上提供動態路由,監

.NET Core服務基於Steeltoe使用Hystrix熔斷保護與監控

一、關於Spring Cloud Hystrix      在微服務架構中,我們將系統拆分為很多個服務,各個服務之間通過註冊與訂閱的方式相互依賴,由於各個服務都是在各自的程序中執行,就有可能由於網路原因或者服務自身的問題導致呼叫故障或延遲,隨著服務的積壓,可能會導致服務崩潰。為了解決這一系列的問題

.NET Core服務基於Steeltoe使用Spring Cloud Config統一管理配置

一、關於Spring Cloud Config   在分散式系統中,每一個功能模組都能拆分成一個獨立的服務,一次請求的完成,可能會呼叫很多個服務協調來完成,為了方便服務配置檔案統一管理,更易於部署、維護,所以就需要分散式配置中心元件了,在Spring Cloud中,就有這麼一個分散式配置中心元件 —

.NET Core服務基於Steeltoe使用Zipkin實現分散式追蹤

一、關於Spring Cloud Sleuth與Zipkin   在 SpringCloud 之中提供的 Sleuth 技術可以實現微服務的呼叫跟蹤,也就是說它可以自動的形成一個呼叫連線線,通過這個連線線使得開發者可以輕鬆的找到所有微服務間關係,同時也可以獲取微服務所耗費的時間, 這樣就可以進行微服

.NET Core服務基於Jenkins+Docker實現持續部署Part 1

一、CI, CD 與Jenkins   網際網路軟體的開發和釋出,已經形成了一套標準流程,最重要的組成部分就是持續整合(Continuous integration,簡稱 CI) => 持續整合指的是,頻繁地(一天多次)將程式碼整合到主幹。   它的好處主要有兩個: 快速發現錯

.NET Core服務基於MassTransit實現資料最終一致性Part 2

一、案例結構與說明   在上一篇中,我們瞭解了MassTransit這個開源元件的基本用法,這一篇我們結合一個小案例來了解在ASP.NET Core中如何藉助MassTransit+Quartz.Net來實現資料的最終一致性。當然,實現資料的最終一致性有很多方案,這裡只是舉一種我所學到的比較簡單易於學習

.NET Core服務基於MassTransit實現資料最終一致性Part 1

一、預備知識:資料一致性   關於資料一致性的文章,園子裡已經有很多了,如果你還不瞭解,那麼可以通過以下的幾篇文章去快速地瞭解瞭解,有個感性認識即可。   必須要了解的點:ACID、CAP、BASE、強一致性、弱一致性、最終一致性。      CAP理論由加州大學伯克利分校的計算機

.NET Core服務基於IdentityServer建立授權與驗證服務

上一篇我們基於IdentityServer4建立了一個AuthorizationServer,並且繼承了QuickStartUI,能夠成功獲取Token了。這一篇我們瞭解下如何整合API Service和MVC Web Application。 一、整合API Service 1.1 新增ASP.NE

.NET Core服務基於Ocelot實現API閘道器服務

一、負載均衡與請求快取 1.1 負載均衡   為了驗證負載均衡,這裡我們配置了兩個Consul Client節點,其中ClientService分別部署於這兩個節點內(192.168.80.70與192.168.80.71)。   為了更好的展示API Repsonse來自哪個節點,我們更改一下

基於.NET CORE服務框架 -Api網關服務管理

adding ise -name efault margin where table inf border 1、前言 經過10多天的努力,surging 網關已經有了大致的雛形,後面還會持續更新完善,請大家持續關註研發的動態 最近也更新了surging新的版本 更新內容:

基於.NET CORE服務框架 -淺析如何使用surging

ner 合並 strong 異步消息 zookeepe per runtime tro container 1、前言 surging受到大家這麽強烈的關註,我感到非常意外,比如有同僚在公司的分享會上分享surging, 還有在博客拿其它的RPC框架,微服務做對比

基於.NET CORE服務框架 -談談surging 的messagepack、protobuffer、json.net 序列化

ces type posit rep factor bsp 技術分享 https 我們 1、前言 surging內部使用的是高性能RPC遠程服務調用,如果用json.net序列化肯定性能上達不到最優,所以後面擴展了protobuf,messagepack序列化組件

.NET Core服務基於Consul實現服務治理

請求轉發 1.0 asp.net AC port prefix 我們 tle nan 一、Consul基礎介紹   Consul是HashiCorp公司推出的開源工具,用於實現分布式系統的服務發現與配置。與其他分布式服務註冊與發現的方案,比如 Airbnb的Smart

7學習筆記 ASP.NET CORE服務 Micro-Service ---- 利用Polly+AOP+依賴註入封裝的降級框架

tostring methods summary bstr 判斷 KS foreach public tde 創建簡單的熔斷降級框架 要達到的目標是: 參與降級的方法參數要一樣,當HelloAsync執行出錯的時候執行HelloFallBackAsync方法。 pu