1. 服務註冊html
對 Consul 進行服務註冊以前,須要先部署一個服務站點,咱們可使用 ASP.NET Core 建立 Web 應用程序,而且部署到 Ubuntu 服務器上。node
ASP.NET Core Hell World 應用程序示例代碼,只須要三個文件,Startup.cs
代碼:web
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
代碼:json
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
配置:ubuntu
{ "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 vagrant@10.9.10.173:~/hwapp_web
傳輸好以後,使用dotnet *
命令程序包還原、構建、啓動站點。服務器
而後,在 Ubuntu 服務器建立一個consul.d
文件目錄:app
$ sudo mkdir /etc/consul.d
配置 Consul 初始化的時候,-config-dir
須要指向上面建立的目錄:dom
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
服務):curl
{ "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,查看添加的服務信息了:
服務註冊好以後,須要進行發現才能進行服務之間的調用,最終須要知曉服務具體在哪臺服務器上,也就是須要發現服務器的 IP,Consul 服務發現有兩種方式:
DNS API
HTTP 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
。
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}]
返回的是一個 JSON 信息,你能夠手動在瀏覽器輸入http://localhost:8500/v1/catalog/service/hwapp_web
查詢,地址中最後的hwapp_web
是服務的名稱。
Consul 基本服務發現就是上面兩種,固然,你也能夠基於它們,寫針對不一樣語言和平臺的 SDK,以便應用程序進行調用。