• 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 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,以便应用程序进行调用。

  • 相关阅读:
    ubuntu16.04安装ibus中文输入法
    apt --fix-broken install
    fuelgauge
    make flash FLASH_CONFIG=jtag_full
    使用android ndk编译boost动态库
    RK3288的gpio设置
    RK3288 GPIO 输出问题
    HDU-2586-裸LCA入门-tarjan离线
    uva-11324-SCC+dp
    HDU-2767-tarjan/Kosaraju求scc
  • 原文地址:https://www.cnblogs.com/chenliyang/p/6543838.html
Copyright © 2020-2023  润新知