上一篇:
对 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()
- .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 修改为
编码(可以用 TXT 修改)。
- ANSI
配置好之后,就可以通过 Consul 后台:,查看添加的服务信息了:
服务注册好之后,需要进行发现才能进行服务之间的调用,最终需要知晓服务具体在哪台服务器上,也就是需要发现服务器的 IP,Consul 服务发现有两种方式:
使用 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
可以看到,一个服务被发现了(
),并且可以得到此服务所在的具体 IP(
- hwapp_web
)。
- 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,以便应用程序进行调用。
参考地址:
来源: