.Netcore 2.0 Ocelot Api網(wǎng)關教程(4)- 服務發(fā)現(xiàn)

本文介紹Ocelot中的服務發(fā)現(xiàn)(Service Discovery),Ocelot允許指定一個服務發(fā)現(xiàn)提供器,之后將從中尋找下游服務的host和port來進行請求路由。
關于服務發(fā)現(xiàn)的詳細介紹請點擊。
在Ocelot中使用了Consul作為服務發(fā)現(xiàn)的provider。

1、Consul下載安裝

官方下載頁選擇合適的平臺下載,解壓出一個二進制文件并保存到相應位置,并將路徑存入path中,本文以windows版本為例(其他平臺操作類似)。
打開 cmd/powershell 運行 consul agent -dev 輸出如下文本表示成功以dev方式啟動consul

==> Starting Consul agent...
==> Consul agent running!
           Version: 'v1.0.7'
           Node ID: '3fc1edca-b635-56cc-b767-01a942423f73'
         Node name: 'Weidaicheng-PC'
        Datacenter: 'dc1' (Segment: '<all>')
            Server: true (Bootstrap: false)
       Client Addr: [127.0.0.1] (HTTP: 8500, HTTPS: -1, DNS: 8600)
      Cluster Addr: 127.0.0.1 (LAN: 8301, WAN: 8302)
           Encrypt: Gossip: false, TLS-Outgoing: false, TLS-Incoming: false

==> Log data will now stream in as it occurs:

    2018/04/29 09:22:03 [DEBUG] agent: Using random ID "3fc1edca-b635-56cc-b767-01a942423f73" as node ID
    2018/04/29 09:22:03 [INFO] raft: Initial configuration (index=1): [{Suffrage:Voter ID:3fc1edca-b635-56cc-b767-01a942423f73 Address:127.0.0.1:8300}]
    2018/04/29 09:22:03 [INFO] raft: Node at 127.0.0.1:8300 [Follower] entering Follower state (Leader: "")
    2018/04/29 09:22:03 [INFO] serf: EventMemberJoin: Weidaicheng-PC.dc1 127.0.0.1
    2018/04/29 09:22:03 [INFO] serf: EventMemberJoin: Weidaicheng-PC 127.0.0.1
    2018/04/29 09:22:03 [INFO] consul: Adding LAN server Weidaicheng-PC (Addr: tcp/127.0.0.1:8300) (DC: dc1)
    2018/04/29 09:22:03 [INFO] consul: Handled member-join event for server "Weidaicheng-PC.dc1" in area "wan"
    2018/04/29 09:22:03 [INFO] agent: Started DNS server 127.0.0.1:8600 (udp)
    2018/04/29 09:22:03 [INFO] agent: Started DNS server 127.0.0.1:8600 (tcp)
    2018/04/29 09:22:03 [INFO] agent: Started HTTP server on 127.0.0.1:8500 (tcp)
    2018/04/29 09:22:03 [INFO] agent: started state syncer
    2018/04/29 09:22:03 [WARN] raft: Heartbeat timeout from "" reached, starting election
    2018/04/29 09:22:03 [INFO] raft: Node at 127.0.0.1:8300 [Candidate] entering Candidate state in term 2
    2018/04/29 09:22:03 [DEBUG] raft: Votes needed: 1
    2018/04/29 09:22:03 [DEBUG] raft: Vote granted from 3fc1edca-b635-56cc-b767-01a942423f73 in term 2. Tally: 1
    2018/04/29 09:22:03 [INFO] raft: Election won. Tally: 1
    2018/04/29 09:22:03 [INFO] raft: Node at 127.0.0.1:8300 [Leader] entering Leader state
    2018/04/29 09:22:03 [INFO] consul: cluster leadership acquired
    2018/04/29 09:22:03 [INFO] consul: New leader elected: Weidaicheng-PC
    2018/04/29 09:22:03 [DEBUG] consul: Skipping self join check for "Weidaicheng-PC" since the cluster is too small
    2018/04/29 09:22:03 [INFO] consul: member 'Weidaicheng-PC' joined, marking health alive
    2018/04/29 09:22:03 [DEBUG] agent: Skipping remote check "serfHealth" since it is managed automatically
    2018/04/29 09:22:03 [INFO] agent: Synced node info
    2018/04/29 09:22:03 [DEBUG] agent: Node info in sync
    2018/04/29 09:22:04 [DEBUG] agent: Skipping remote check "serfHealth" since it is managed automatically
    2018/04/29 09:22:04 [DEBUG] agent: Node info in sync

瀏覽器輸入http://localhost:8500可以看到UI后臺界面

Consul UI.png

或者打開另一個PowerShell輸入 consul members 輸出如下

Node            Address         Status  Type    Build  Protocol  DC   Segment
Weidaicheng-PC  127.0.0.1:8301  alive   server  1.0.7  2         dc1  <all>

至此,Consul安裝完成

2、代碼修改

繼續(xù)使用上一篇的項目,在WebApiA和WebApiB中分別新建一個api控制器 CounterController 代碼如下

//WebApiA
using Microsoft.AspNetCore.Mvc;

namespace WebApiA.Controllers
{
    [Produces("application/json")]
    [Route("api/[controller]/[action]")]
    public class CounterController : Controller
    {
        private static int _count = 0;

        [HttpGet]
        public string Count()
        {
            return $"Count {++_count} from WebapiA";
        }
    }
}
//WebApiB
using Microsoft.AspNetCore.Mvc;

namespace WebApiB.Controllers
{
    [Produces("application/json")]
    [Route("api/[controller]/[action]")]
    public class CounterController : Controller
    {
        private static int _count = 0;

        [HttpGet]
        public string Count()
        {
            return $"Count {++_count} from WebapiB";
        }
    }
}

修改OcelotGetway項目中的配置文件 configuration.json
ReRoutes 節(jié)點中添加

{
      "DownstreamPathTemplate": "/api/Counter/Count",
      "DownstreamScheme": "http",
      "UpstreamPathTemplate": "/count",
      "UpstreamHttpMethod": [ "Get" ],
      "ServiceName": "Count",
      "LoadBalancer": "RoundRobin",
      "UseServiceDiscovery": true
}

其中,ServiceName指定服務發(fā)現(xiàn)的服務名稱,在之后Consul中注冊服務的時候會用到,LoadBalancer指定使用的負載均衡模式(目前Ocelot僅支持時間片輪詢(RoundRobin)和最少連接(LeastConnection)模式),UseServiceDiscovery標志使用服務發(fā)現(xiàn)。
注:如果不指定負載均衡,將不使用負載均衡,本文中使用時間片輪詢?yōu)槔?br> 然后再根節(jié)點添加全局配置

"GlobalConfiguration": {
    "ServiceDiscoveryProvider": {
      "Host": "localhost",
      "Port": 8500
    }
  }

指定服務發(fā)現(xiàn)提供器的位置。目前Ocelot只支持共用一個provider。

3、注冊服務

在consul所在的目錄下創(chuàng)建文件夾 consul.d,文件夾位置及文件夾名稱可以隨意,進入consul.d文件夾中創(chuàng)建兩個json文件 Count_1.jsonCount_2.json,分別添加如下文本

{
    "service": {
        "id": "count1",
        "name": "Count",
        "tags": ["dev"],
        "address": "localhost",
        "port": 5001
    }
}
{
    "service": {
        "id": "count2",
        "name": "Count",
        "tags": ["dev"],
        "address": "localhost",
        "port": 5002
    }
}

以第一個為例,注冊一個服務id為count1,服務名稱為Count,和之前配置中使用的相同,還有地址和端口。
使用 Ctrl+C 關閉正在運行的consul,然后輸入 consul agent -dev -config-dir=C:/consul_1.0.7/consul.d 其中 C:/consul_1.0.7/consul.d 是本機的配置文件路徑。
可以看到如下輸出

==> Starting Consul agent...
==> Consul agent running!
           Version: 'v1.0.7'
           Node ID: '91af5002-a1d6-409e-e36b-f7a081f84d24'
         Node name: 'Weidaicheng-PC'
        Datacenter: 'dc1' (Segment: '<all>')
            Server: true (Bootstrap: false)
       Client Addr: [127.0.0.1] (HTTP: 8500, HTTPS: -1, DNS: 8600)
      Cluster Addr: 127.0.0.1 (LAN: 8301, WAN: 8302)
           Encrypt: Gossip: false, TLS-Outgoing: false, TLS-Incoming: false

==> Log data will now stream in as it occurs:

    2018/04/29 09:41:38 [DEBUG] agent: Using random ID "91af5002-a1d6-409e-e36b-f7a081f84d24" as node ID
    2018/04/29 09:41:38 [INFO] raft: Initial configuration (index=1): [{Suffrage:Voter ID:91af5002-a1d6-409e-e36b-f7a081f84d24 Address:127.0.0.1:8300}]
    2018/04/29 09:41:38 [INFO] raft: Node at 127.0.0.1:8300 [Follower] entering Follower state (Leader: "")
    2018/04/29 09:41:38 [INFO] serf: EventMemberJoin: Weidaicheng-PC.dc1 127.0.0.1
    2018/04/29 09:41:38 [INFO] serf: EventMemberJoin: Weidaicheng-PC 127.0.0.1
    2018/04/29 09:41:38 [INFO] consul: Adding LAN server Weidaicheng-PC (Addr: tcp/127.0.0.1:8300) (DC: dc1)
    2018/04/29 09:41:38 [INFO] consul: Handled member-join event for server "Weidaicheng-PC.dc1" in area "wan"
    2018/04/29 09:41:38 [INFO] agent: Started DNS server 127.0.0.1:8600 (udp)
    2018/04/29 09:41:38 [INFO] agent: Started DNS server 127.0.0.1:8600 (tcp)
    2018/04/29 09:41:38 [INFO] agent: Started HTTP server on 127.0.0.1:8500 (tcp)
    2018/04/29 09:41:38 [INFO] agent: started state syncer
    2018/04/29 09:41:38 [WARN] raft: Heartbeat timeout from "" reached, starting election
    2018/04/29 09:41:38 [INFO] raft: Node at 127.0.0.1:8300 [Candidate] entering Candidate state in term 2
    2018/04/29 09:41:38 [DEBUG] raft: Votes needed: 1
    2018/04/29 09:41:38 [DEBUG] raft: Vote granted from 91af5002-a1d6-409e-e36b-f7a081f84d24 in term 2. Tally: 1
    2018/04/29 09:41:38 [INFO] raft: Election won. Tally: 1
    2018/04/29 09:41:38 [INFO] raft: Node at 127.0.0.1:8300 [Leader] entering Leader state
    2018/04/29 09:41:38 [INFO] consul: cluster leadership acquired
    2018/04/29 09:41:38 [INFO] consul: New leader elected: Weidaicheng-PC
    2018/04/29 09:41:38 [DEBUG] consul: Skipping self join check for "Weidaicheng-PC" since the cluster is too small
    2018/04/29 09:41:38 [INFO] consul: member 'Weidaicheng-PC' joined, marking health alive
    2018/04/29 09:41:39 [DEBUG] agent: Skipping remote check "serfHealth" since it is managed automatically
    2018/04/29 09:41:39 [INFO] agent: Synced service "count1"
    2018/04/29 09:41:39 [INFO] agent: Synced service "count2"
    2018/04/29 09:41:39 [DEBUG] agent: Node info in sync
    2018/04/29 09:41:39 [DEBUG] agent: Service "count1" in sync
    2018/04/29 09:41:39 [DEBUG] agent: Service "count2" in sync
    2018/04/29 09:41:39 [DEBUG] agent: Node info in sync
    2018/04/29 09:41:39 [DEBUG] agent: Skipping remote check "serfHealth" since it is managed automatically
    2018/04/29 09:41:39 [DEBUG] agent: Service "count1" in sync
    2018/04/29 09:41:39 [DEBUG] agent: Service "count2" in sync
    2018/04/29 09:41:39 [DEBUG] agent: Node info in sync

在倒數(shù)第三行和倒數(shù)第二行可以看到count1和count2的兩個服務注冊成功,使用postman/瀏覽器請求一下http://localhost:8500/v1/catalog/service/count
可以看到注冊的兩個Count服務的信息

[
    {
        "ID": "91af5002-a1d6-409e-e36b-f7a081f84d24",
        "Node": "Weidaicheng-PC",
        "Address": "127.0.0.1",
        "Datacenter": "dc1",
        "TaggedAddresses": {
            "lan": "127.0.0.1",
            "wan": "127.0.0.1"
        },
        "NodeMeta": {
            "consul-network-segment": ""
        },
        "ServiceID": "count1",
        "ServiceName": "Count",
        "ServiceTags": [
            "dev"
        ],
        "ServiceAddress": "localhost",
        "ServiceMeta": {},
        "ServicePort": 5001,
        "ServiceEnableTagOverride": false,
        "CreateIndex": 6,
        "ModifyIndex": 6
    },
    {
        "ID": "91af5002-a1d6-409e-e36b-f7a081f84d24",
        "Node": "Weidaicheng-PC",
        "Address": "127.0.0.1",
        "Datacenter": "dc1",
        "TaggedAddresses": {
            "lan": "127.0.0.1",
            "wan": "127.0.0.1"
        },
        "NodeMeta": {
            "consul-network-segment": ""
        },
        "ServiceID": "count2",
        "ServiceName": "Count",
        "ServiceTags": [
            "dev"
        ],
        "ServiceAddress": "localhost",
        "ServiceMeta": {},
        "ServicePort": 5002,
        "ServiceEnableTagOverride": false,
        "CreateIndex": 7,
        "ModifyIndex": 7
    }
]

4、運行與結果查看

分別運行WebApiA、WebApiB、OcelotGatway三個項目,多次請求http://localhost:5000/Count,效果圖如下

count.gif

可以看到,多次請求依次訪問A、B、A......正是時間片輪詢的負載均衡模式。

源碼下載

完,下一篇介紹認證和授權

參考鏈接

https://blog.csdn.net/mr_seaturtle_/article/details/77618403
http://ocelot.readthedocs.io/en/latest/features/servicediscovery.html
https://www.consul.io/intro/getting-started/install.html

最后編輯于
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容