天天看點

Consul 服務注冊與服務發現

1. 服務注冊

對 Consul 進行服務注冊之前,需要先部署一個服務站點,我們可以使用 ASP.NET Core 建立 Web 應用程式,并且部署到 Ubuntu 伺服器上。

ASP.NET Core Hell World 應用程式示例代碼,隻需要三個檔案,

Startup.cs

代碼:

public class Startup
{
    // This method gets called by the runtime. Use this method to add services to the container.
    // For more information on how to configure your application, visit http://go.microsoft.com/fwlink/?LinkID=398940
    public void ConfigureServices(IServiceCollection services)
    {
    }

    // 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)
    {
        loggerFactory.AddConsole();

        if (env.IsDevelopment())
        {
            app.UseDeveloperExceptionPage();
        }

        app.Run(async (context) =>
        {
            await context.Response.WriteAsync("Hello World!");
        });
    }
}      

Program.cs

public class Program
{
    public static void Main(string[] args)
    {
        var host = new WebHostBuilder()
            .UseKestrel()
            .UseContentRoot(Directory.GetCurrentDirectory())
            .UseStartup<Startup>()
            .UseUrls("http://*:5000")
            .Build();

        host.Run();
    }
}      

project.json

配置:

{
  "dependencies": {
    "Microsoft.NETCore.App": {
      "version": "1.0.1"
    },
    "Microsoft.AspNetCore.Diagnostics": "1.0.0",
    "Microsoft.AspNetCore.Server.Kestrel": "1.0.1",
    "Microsoft.Extensions.Logging.Console": "1.0.0"
  },
  
  "frameworks": {
    "netcoreapp1.0": {
      "imports": [
        "dotnet5.6",
        "portable-net45+win8"
      ]
    }
  },

  "runtimes": {
    "ubuntu.14.04-x64": {},
    "osx.10.11-x64": {},
    "win8-x64": {}
  },

  "buildOptions": {
    "emitEntryPoint": true,
    "preserveCompilationContext": true
  },

  "runtimeOptions": {
    "configProperties": {
      "System.GC.Server": true
    }
  }
}      

将這三個檔案,使用指令傳輸到 Ubuntu 伺服器,如下:

$ scp -r ~/documents/hwapp_web [email protected]:~/hwapp_web      

傳輸好之後,使用

dotnet *

指令程式包還原、建構、啟動站點。

然後,在 Ubuntu 伺服器建立一個

consul.d

檔案目錄:

$ sudo mkdir /etc/consul.d      

配置 Consul 初始化的時候,

-config-dir

需要指向上面建立的目錄:

consul agent -data-dir /tmp/consul -node=consul-client-1 -bind=10.9.10.173 -dc=dc1 -config-dir=/etc/consul.d      

Consul 會加載

/etc/consul.d

目錄下所有

*.josn

配置檔案,比如我們在此目錄下,建立這樣一個

hwapp_web.json

配置檔案(針對

hwapp_web

服務):

{
  "service": {
    "name": "hwapp_web",
    "tags": ["master"],
    "address": "10.9.10.173",
    "port": 5000,
    "checks": [
      {
        "http": "http://10.9.10.173:5000/health",
        "interval": "10s"
      }
    ]
  }
}      

http://10.9.10.173:5000/health

是健康檢查的路徑,上面我們建立的

hwapp_web

項目并沒有實作,為防止報錯,你可以改為

http://10.9.10.173:5000

另外,如果在配置 Consul 的時候,出現了下面錯誤:

==> Error decoding '/etc/consul.d/hwapp_web.json': invalid character '' looking for beginning of value      

錯誤的原因是檔案編碼問題,需要将 Encoding 修改為

ANSI

編碼(可以用 TXT 修改)。

配置好之後,就可以通過 Consul 背景:http://localhost:8500,檢視添加的服務資訊了:

Consul 服務注冊與服務發現

2. 服務發現

服務注冊好之後,需要進行發現才能進行服務之間的調用,最終需要知曉服務具體在哪台伺服器上,也就是需要發現伺服器的 IP,Consul 服務發現有兩種方式:

  • DNS API
  • HTTP API

2.1 DNS API

使用 DNS API 方式進行服務發現,需要知道服務 DNS 的具體名稱,預設情況下,所有注冊服務的 DNS 名稱為

ServerName.service.consul

,這個命名空間也可以進行手動配置。

使用下面指令進行服務發現:

$ dig @127.0.0.1 -p 8600 hwapp_web.service.consul

; <<>> DiG 9.8.3-P1 <<>> @127.0.0.1 -p 8600 hwapp_web.service.consul
; (1 server found)
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 12340
;; flags: qr aa rd; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 0
;; WARNING: recursion requested but not available

;; QUESTION SECTION:
;hwapp_web.service.consul.  IN  A

;; ANSWER SECTION:
hwapp_web.service.consul. 0 IN  A   10.9.10.173

;; Query time: 4 msec
;; SERVER: 127.0.0.1#8600(127.0.0.1)
;; WHEN: Fri Dec 30 15:30:22 2016
;; MSG SIZE  rcvd: 58      

可以看到,一個服務被發現了(

hwapp_web

),并且可以得到此服務所在的具體 IP(

10.9.10.173

)。

包含更詳細資訊的服務發現指令(包含服務端口):

$ dig @127.0.0.1 -p 8600 hwapp_web.service.consul SRV

; <<>> DiG 9.8.3-P1 <<>> @127.0.0.1 -p 8600 hwapp_web.service.consul SRV
; (1 server found)
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 3174
;; flags: qr aa rd; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1
;; WARNING: recursion requested but not available

;; QUESTION SECTION:
;hwapp_web.service.consul.  IN  SRV

;; ANSWER SECTION:
hwapp_web.service.consul. 0 IN  SRV 1 1 5000 consul-worker-1.node.dc1.consul.

;; ADDITIONAL SECTION:
consul-worker-1.node.dc1.consul. 0 IN   A   10.9.10.173

;; Query time: 2 msec
;; SERVER: 127.0.0.1#8600(127.0.0.1)
;; WHEN: Fri Dec 30 15:33:59 2016
;; MSG SIZE  rcvd: 103      

可以看到,

hwapp_web

服務的端口為

5000

2.1 HTTP API

HTTP API 進行服務發現,非常簡單,執行下面指令,就可以了:

$ curl http://localhost:8500/v1/catalog/service/hwapp_web
[{"Node":"consul-worker-1","Address":"10.9.10.173","TaggedAddresses":{"lan":"10.9.10.173","wan":"10.9.10.173"},"ServiceID":"hwapp_web","ServiceName":"hwapp_web","ServiceTags":["master"],"ServiceAddress":"10.9.10.173","ServicePort":5000,"ServiceEnableTagOverride":false,"CreateIndex":1361,"ModifyIndex":1361}]      

繼續閱讀