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=398940public 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 vagrant@10.9.10.173:~/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,以便应用程序进行调用。
参考地址:
使用 Consul 实现分布式服务注册和发现
Consul 入门 03 - 注册服务
相关文章:
使用C# 和Consul进行分布式系统协调
Consul入门
原文地址: http://www.cnblogs.com/xishuai/p/services-registery-and-discovery-by-consul.html
.NET社区新闻,深度好文,微信中搜索dotNET跨平台或扫描二维码关注