上一篇: "Mac OS、Ubuntu 安裝及使用 Consul" 1. 服務註冊 對 Consul 進行服務註冊之前,需要先部署一個服務站點,我們可以使用 ASP.NET Core 創建 Web 應用程式,並且部署到 Ubuntu 伺服器上。 ASP.NET Core Hell World 應用程 ...
上一篇:Mac OS、Ubuntu 安裝及使用 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,查看添加的服務信息了:
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}]
返回的是一個 JSON 信息,你可以手動在瀏覽器輸入http://localhost:8500/v1/catalog/service/hwapp_web
查詢,地址中最後的hwapp_web
是服務的名稱。
Consul 基本服務發現就是上面兩種,當然,你也可以基於它們,寫針對不同語言和平臺的 SDK,以便應用程式進行調用。
參考地址: