【NoSQL】Consul中服務註冊的兩種方式

一句話

用agent更優雅,適合agent遍佈每個應用機的情況。用catalog更直接,操作更方便

前言

今天遇到寫一個服務啓動自注冊的邏輯時產生了一點糾結,可以使用agent對象的register方法進行註冊,也可以使用catalogregister方法進行註冊。那麼,兩種方式有什麼區別呢?

agent對象

new 一個consulClient對象,應當是作爲一個軟consul agent

  • 對API URL對應的節點的屬性沒有要求. 其可以是server身份也可以是純agent身份
  • 數據要經過沖突確認後,再存入catalog中
  • 反註冊時只可以反註冊自身的節點(主機)上的服務,註冊時可以註冊其他主機上的服務

catalog

connect to consul database

  • 連接的節點應當是server節點
  • 操作後數據立馬生效
  • 反註冊對所有節點生效

用途

  • 編寫反註冊節點的服務應使用catalog的方法
  • 使用agent方法反註冊服務時,需要指定一個serviceID參數,該ID是的唯一維度是node也就是主機唯一的。因此從catalog進行反註冊時最好是提供主機名和服務ID,當然也可以是IP和服務ID,服務名和服務ID的結合我沒有嘗試過。

    案例

    實現反註冊節點的邏輯

    用途:刪除已經失效的主機信息,用於取消報警觸發

// 根據IP刪除節點
func (c *ConsulHelper) DropNodeByIP(ip string) error {
    // STEP1: 查找IP在Consul中對應的NodeName
    nodeName, err := c.FindNodeNameByIP(ip)
    if err != nil {
        return err
    }
    p.Infof("Find node %s by ip %s success, ", nodeName, ip)
    // STEP2: 調用DropNode刪除節點
    err = c.DropNode(nodeName)
    if err != nil {
        p.Errorf("Drop Node by ip: %s failed, %+v", ip, err)
        return err
    }
    return nil
}

func (c *ConsulHelper) DropNode(nodeName string) error {
    var bom = consul.CatalogDeregistration{
        Node:       nodeName,
        Datacenter: common.CONF.Consul.DataCenter,
    }
    _, err := c.API.Catalog().Deregister(&bom, nil)
    return err
}

func (c *ConsulHelper) DropSelfNode() error {
    return c.DropNode(c.hostUniqueName)
}

實現反註冊服務的邏輯

用途:服務啓動時向consul註冊自身,服務正常關閉時將自身從consul中反註冊

```c#
/// <summary>
/// 反註冊服務(使用catalog實現)
/// </summary>
/// <param name="nodeIP"></param>
/// <param name="serviceID"></param>
/// <returns></returns>
public WriteResult DeregisterService(string nodeIP, string serviceID)
{
this.logger.LogDebug($"Now start DeregisterService in {nodeIP}, service:{serviceID}");
var x = new CatalogDeregistration { Datacenter = "dc1", Address = nodeIP, ServiceID= serviceID };
return this.consul.Catalog.Deregister(x).Result;
}
/// <summary>
/// 註冊服務(使用Agent實現)
/// </summary>
/// <param name="serviceRegistration"></param>
public void RegisterService(AgentServiceRegistration serviceRegistration)
{
this.logger.LogDebug("Now do service register");
this.consul.Agent.ServiceRegister(serviceRegistration);
}
/// <summary>
/// 反註冊本機上的服務(使用Agent實現)
/// </summary>
/// <param name="serviceID">本機唯一的服務ID</param>
public void DeregisterSelfNodeService(string serviceID)
{
this.logger.LogDebug("Now do service deregister");
this.consul.Agent.ServiceDeregister(serviceID);
}

    private void OnStarted(IConsulService consulService)
    {
        var exposedHTTPURL = this.Configuration["Kestrel:EndPoints:Http:Url"];
        var stringPort = exposedHTTPURL.Split(":")[^1];
        consulService.RegisterSelfProject(int.Parse(stringPort));
    }

    private void OnStopped(IConsulService consulService)
    {
        var exposedHTTPURL = this.Configuration["Kestrel:EndPoints:Http:Url"];
        var stringPort = exposedHTTPURL.Split(":")[^1];
        consulService.DeregisterSelfProject(int.Parse(stringPort));
    }

輸出:

```bash
    2020/04/23 17:59:26 [WARN] agent: Node name "PsyDuck.local" will not be discoverable via DNS due to invalid characters. Valid characters include all alpha-numerics and dashes.
    2020/04/23 17:59:26 [INFO] raft: Restored from snapshot 13-163854-1558515302742
    2020/04/23 17:59:26 [INFO] raft: Initial configuration (index=1): [{Suffrage:Voter ID:e15ef033-ec5c-f2c5-4679-43fdfa69f508 Address:10.100.100.1:8300}]
    2020/04/23 17:59:26 [INFO] raft: Node at 127.0.0.1:8300 [Follower] entering Follower state (Leader: "")
    2020/04/23 17:59:26 [INFO] serf: EventMemberJoin: PsyDuck.local.dc1 127.0.0.1
    2020/04/23 17:59:26 [WARN] serf: Failed to re-join any previously known node
    2020/04/23 17:59:26 [INFO] serf: EventMemberJoin: PsyDuck.local 127.0.0.1
    2020/04/23 17:59:26 [WARN] serf: Failed to re-join any previously known node
    2020/04/23 17:59:26 [INFO] consul: Adding LAN server PsyDuck.local (Addr: tcp/127.0.0.1:8300) (DC: dc1)
    2020/04/23 17:59:26 [INFO] consul: Handled member-join event for server "PsyDuck.local.dc1" in area "wan"
    2020/04/23 17:59:26 [INFO] agent: Started DNS server 0.0.0.0:8600 (tcp)
    2020/04/23 17:59:26 [INFO] agent: Started DNS server 0.0.0.0:8600 (udp)
    2020/04/23 17:59:26 [INFO] agent: Started HTTP server on [::]:8500 (tcp)
    2020/04/23 17:59:26 [INFO] agent: started state syncer
    2020/04/23 17:59:33 [ERR] agent: failed to sync remote state: No cluster leader
    2020/04/23 17:59:35 [WARN] raft: Heartbeat timeout from "" reached, starting election
    2020/04/23 17:59:35 [INFO] raft: Node at 127.0.0.1:8300 [Candidate] entering Candidate state in term 14
    2020/04/23 17:59:35 [INFO] raft: Election won. Tally: 1
    2020/04/23 17:59:35 [INFO] raft: Node at 127.0.0.1:8300 [Leader] entering Leader state
    2020/04/23 17:59:35 [INFO] consul: cluster leadership acquired
    2020/04/23 17:59:35 [INFO] consul: New leader elected: PsyDuck.local
    2020/04/23 17:59:35 [INFO] consul: member 'PsyDuck.local' joined, marking health alive
    2020/04/23 17:59:36 [INFO] agent: Synced node info
==> Failed to check for updates: Get https://checkpoint-api.hashicorp.com/v1/check/consul?arch=amd64&os=darwin&signature=01a8a19a-0919-6b96-8aa1-eaf5f977a351&version=1.4.2: net/http: request canceled while waiting for connection (Client.Timeout exceeded while awaiting headers)
    2020/04/23 18:00:05 [WARN] agent: Service name "監控系統" will not be discoverable via DNS due to invalid characters. Valid characters include all alpha-numerics and dashes.
    2020/04/23 18:00:05 [INFO] agent: Synced service "監控系統@127.0.0.1:5007"
    2020/04/23 18:00:29 [INFO] agent: Deregistered service "監控系統@127.0.0.1:5007"
    2020/04/23 18:02:06 [INFO] agent: Synced service "[email protected]:5007"
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章