1. 程式人生 > >Steeltoe之Service Discovery篇

Steeltoe之Service Discovery篇

在前文一窺Spring Cloud Eureka中,已經構建了基於Eureka的服務端與客戶端,可用於實現服務註冊與發現功能。而藉助Steeltoe的類庫,可以在.NET生態系統中使用Spring Cloud的現有模組。

Package

對於ASP.NET Core,使用Steeltoe.Discovery.ClientCore類庫。

對於Console/ASP.NET 4.x,使用Steeltoe.Discovery.EurekaBase類庫。

服務發現

先建立一個ASP.NET Core專案,其可以找到已在Eureka的服務端註冊的服務,並利用這些服務完成所需功能。

appsettings.json

首先設定Eureka服務端地址,並確定當前應用程式能夠發現服務但本身不會被註冊為服務。

{
  "eureka": {
    "client": {
      "serviceUrl": "http://localhost:8765/eureka/",
      "shouldFetchRegistry": true,
      "shouldRegisterWithEureka": false
    }
  }
}

Startup.cs

加入DiscoveryClient服務並使用它。

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

public IConfiguration Configuration { get; }

public void ConfigureServices(IServiceCollection services)
{
    services.AddDiscoveryClient(Configuration);

    services.AddMvc();
}

public void Configure(IApplicationBuilder app, ...)
{
    app.UseMvc();

    app.UseDiscoveryClient();
}

Controller

從已註冊的Eureka客戶端,即之前建立的Spring Cloud服務中獲取資料。

public class HomeController : Controller
{
    DiscoveryHttpClientHandler _handler;

    public HomeController(IDiscoveryClient client)
    {
        _handler = new DiscoveryHttpClientHandler(client);
    }
    public IActionResult Index()
    {
        var client = new HttpClient(_handler, false);
        var result = client.GetStringAsync("http://SPRINGCLOUD-EUREKA-CLIENT/hello").Result;

        ViewData["message"] = result;
        return View();
    }
}

該服務的地址是它用於註冊的application name。

啟動ASP.NET Core應用程式,可以看到頁面顯示了來自Spring Cloud服務的資料。

服務註冊

再建立一個ASP.NET Core API專案,並將其註冊到Eureka的服務端。

appsettings.json

該應用程式不需要發現服務,但需要在Eureka服務端上註冊服務。這裡可以看到比上一專案更多的配置,因為它需要提供應用名稱,埠號及主機名稱。

{
  "eureka": {
    "client": {
      "serviceUrl": "http://localhost:8765/eureka/",
      "shouldFetchRegistry": false,
      "shouldRegisterWithEureka": true
    },
    "instance": {
      "appName": "NET-API",
      "port": 5000,
      "hostName": "localhost"
    }
  }
}

Startup.cs

與上一專案同樣的配置。

Controller

建立一個簡單的API方法。

[Route("api/[controller]")]
[ApiController]
public class ValuesController : ControllerBase
{
    // GET api/values
    [HttpGet]
    public ActionResult<string> Get()
    {
        return "Hello World NET-API!";
    }
}

啟動服務

可以在Eureka服務端中看到新註冊的服務。

呼叫服務

將上一個專案中所呼叫API的地址改成新服務的。

public IActionResult Index()
{
    var client = new HttpClient(_handler, false);
    var result = client.GetStringAsync("http://NET-API/api/values").Result;

    ViewData["message"] = result;
    return View();
}

啟動後,可以看到所顯示的值已發生變化,因為其是從新的服務中取得的。