asp.net core系列 61 Ocelot 構建服務發現簡單示例

一.概述

  Ocelot容許指定服務發現提供程序,如Consul或Eureka。 這二箇中間件是用來實現:服務治理或秒服務發現,服務發現查找Ocelot正在轉發請求的下游服務的主機和端口。目前Ocelot僅在GlobalConfiguration部分支持配置服務發現功能,這意味着相同的服務發現提供程序將用於爲ReRoute級別指定ServiceName的全部ReRoutes。這裏介紹下服務發現的二箇中間件:Consul與Eureka。html

  

  1. Consul介紹java

    Consul服務發現是用GO語言的開源框架,是一個分佈式, 高可用,數據中心感知的解決方案,用於跨任何運行時平臺和公共雲或私有云鏈接。Consul是服務發現和配置工具。主要功能包括:linux

    (1) 服務發現 - Consul使用簡單的服務來註冊本身,並經過DNS或HTTP接口發現其餘服務。還能夠註冊外部服務,好比SaaS提供者。git

    (2) 運行情況檢查 -運行情況檢查使Consul可以快速向操做員發出有關羣集中任何問題的警報, 與服務發現的集成可防止將流量路由到不健康的主機,並啓用服務級別的斷路器。github

    (3) Key/Value存儲 - 靈活的Key/Value存儲能夠存儲動態配置,功能標記,協調,領導者選舉等。簡單的HTTP API使其易於在任何地方使用。web

    (4) 多數據中心 - Consul能夠識別數據中心,而且能夠支持任意數量的區域而無需複雜的配置。json

    (5) 服務分段 - Consul 鏈接經過自動TLS加密和基於身份的受權實現安全的服務到服務通訊。centos

    使用consul示例:http://www.javashuo.com/article/p-wkcpqatg-dc.htmlapi

 

  2. Eureka介紹安全

    Eureka服務發現是用java語言的開源框架,最新版本爲19.9 (有報道後面2.0版本不開源)。是一種基於REST的服務,主要用於AWS雲,用於定位服務,以實現中間層服務器的負載平衡和故障轉移。

    使用Eureka示例:Service Discovery Demo With Eureka

    示例介紹:https://www.c-sharpcorner.com/article/building-api-gateway-using-ocelot-in-asp-net-core-service-discoveryeureka/

 

二.演示項目介紹

  本篇重點了解Consul的使用,下面參考開源項目Github , 本篇在部署上 對比 參考示例 有些小改動,項目使用了Ocelot + IdentityServer4 + Consul中間件。

 

  說明:

  (1) 用到的軟件包括:centos系統,  iis,  fiddler。其中centos系統用於作Consul服務註冊,iis作webapi的宿主承載,fiddler用於客戶端模擬測試。

  (2) 演示中 IdentityServer4服務認證和ApiGateway網關項目由vs2017 來作宿主承載,但也能夠用iis承載。

項目名稱

Ip和端口

說明

ApiGateway

http://localhost:38039

 

網關項目。統一訪問入口點,在生產環境下ip要在廣域網,供第三方客戶端訪問。

作好網關路由配置,將自動轉發。

IdentityServer4

http://127.0.0.1:8021

Is4令牌服務。ip是在局域網, 經過web api來調用令牌

Service A/B

http://127.0.0.1:8010 (A)

http://127.0.0.1:8011 (B)

服務項目。ip是在局域網,由網關轉發進來訪問。

Consul 搭建

http://172.168.18.201:8500

服務發現。在linux中啓動Consul服務,默認是8500端口,用於監聽服務的健康狀態。

在linux中須要拼通服務ip及port, 反之同樣。可telnet命令。

配置服務註冊文件

fiddler客戶端模擬

 

調用服務A獲取IS4令牌,經過該令牌訪問服務A受保護的接口

   

. web api服務   

  參考開源項目,Service A和Service B服務項目相關配置都同樣,以Service A爲例: 

  1.項目中有三個api接口

    (1) 一個必需要診斷接口api/Health 

    (1) 一個必需要的獲取令牌接口api/Session

    (3) 一個業務測試接口api/Values。 由於業務接口是受保護的,因此該接口加了[Authorize],須要令牌來訪問

    [Authorize]
    [Route("api/[controller]")]
    [ApiController]
    public class ValuesController : ControllerBase
    {
        // GET api/values
        [HttpGet]
        public ActionResult<IEnumerable<string>> Get()
        {
            return new[] { "value1", "value2" };
        }
    }

  2. 在啓動時,加了受權中間件,採用JwtBearer方案。設置了受信任的is4服務基地址,以及Audience保護的資源。

     services.AddAuthentication("Bearer")
                .AddJwtBearer("Bearer", options =>
                {
                    options.Authority = "http://127.0.0.1:8021";
                    options.RequireHttpsMetadata = false;
                    options.Audience = "ServiceB";
                });

  

四. ApiGateway項目

  1. 在網關項目中,配置ocelot文件

   {
  "ReRoutes": [
    {
      "DownstreamPathTemplate": "/api/{everything}",
      "DownstreamScheme": "http",
      //客戶端經過/ServiceA來訪問ServiceA的服務
      "UpstreamPathTemplate": "/ServiceA/{everything}",
      "UpstreamHttpMethod": [ "GET", "POST", "DELETE", "PUT" ],
      //服務發現Consul用到
      "ServiceName": "ServiceA",
      "LoadBalancerOptions": {
        "Type": "LeastConnection"
      }
    },
    {
      "DownstreamPathTemplate": "/api/{everything}",
      "DownstreamScheme": "http",
      "UpstreamPathTemplate": "/ServiceB/{everything}",
      "UpstreamHttpMethod": [ "GET", "POST", "DELETE", "PUT" ],
      "ServiceName": "ServiceB",
      "LoadBalancerOptions": {
        "Type": "LeastConnection"
      }
    }
  ],
  "GlobalConfiguration": {
    //配置Consul的信息
    "ServiceDiscoveryProvider": {
      "Host": "172.168.18.201",
      "Port": 8500,
      "Type": "Consul"
    }
  }
}

   2.啓動時添加網關中間件

    public static void Main(string[] args)
        {
            new WebHostBuilder()
                .UseKestrel()
                .UseContentRoot(Directory.GetCurrentDirectory())
                .ConfigureAppConfiguration((hostingContext, config) =>
                {
                    config
                        .SetBasePath(hostingContext.HostingEnvironment.ContentRootPath)
                        .AddJsonFile("appsettings.json", true, true)
                        .AddJsonFile($"appsettings.{hostingContext.HostingEnvironment.EnvironmentName}.json", true, true)
                        .AddJsonFile("ocelot.json")
                        .AddEnvironmentVariables();
                })
                .ConfigureServices(services =>
                {
                    services.AddOcelot().AddConsul();
                })
                .ConfigureLogging((hostingContext, logging) =>
                {
                    //add your logging
                })
                .UseIISIntegration()
                .Configure(app =>
                {
                    app.UseOcelot().Wait();
                })
                .Build()
                .Run();
        }

 

五. IdentityServer令牌服務

  參考開源IdentityServer項目代碼,在令牌服務中,使用AddDeveloperSigningCredential來添加臨時證書,在生產環境下,可使用AddSigningCredential來添加證書。客戶端基於用戶名和密碼的方式來獲取令牌GrantTypes.ResourceOwnerPassword。

 

六 Consul搭建

  1. consul安裝

    --下載安裝包
        [root@hsr opt]# wget https://releases.hashicorp.com/consul/1.4.4/consul_1.4.4_linux_amd64.zip
    --將conusl命令移到bin目錄下,方便啓動
        [root@hsr opt]# mv consul /usr/local/bin/
    --測試安裝是否成功,ok
    [root@hsr ~]# consul
    Usage: consul [--version] [--help] <command> [<args>]

  2.添加服務註冊放到/usr/etc/

  3. 啓動客戶端agent 測試

  consul agent -dev -data-dir=/usr/etc  -config-dir=/usr/etc/consul.json -client 172.168.18.201

    啓動成功後,會每隔10秒檢查一次服務的健康狀態,以下所示:

           -dev開發模式,啓動該參數配置下,不會有任何持久化操做,即不會有任何數據寫入到磁盤

           -config-file 指定服務註冊文件

           -client指定當前ip,默認是127.0.0.1

           -data-dir指定agent儲存狀態的數據目錄

  4.關閉201防火牆, 在win系統上訪問服務發現管理界面以下:

    systemctl stop firewalld.service

  

七.fiddler測試

  1. 測試開始步驟:

    (1) 兩個服務ServerA/ServerB發佈到iis上。

    (2) 在vs2017中啓動ApiGateway網關項目和IS4項目。

    (3) 在linux系統中啓動consul(現只是監聽服務是否健康)
  2.測試ServerA服務

    (1)經過用戶名和密碼,獲取要訪問ServerA服務的令牌

    (2) 獲取受保護的api接口,將拿到的令牌加到headers中去請求

    (3) 請求http://localhost:38039/serviceA/values數據接口成功,以下所示:

 

 

  參考文獻

    服務發現

      參考項目示例

相關文章
相關標籤/搜索