上一篇: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 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 服务注册与服务发现的更多相关文章

  1. SpringCloud+Consul 服务注册与服务发现

    SpringCloud+Consul 服务注册与服务发现 1. 服务注册: 在Spring.factories有一段: # Discovery Client Configuration org.spr ...

  2. consul服务注册与服务发现的巨坑

    最近使用consul作为项目的服务注册与服务发现的基础功能.在塔建集群使用中遇到一些坑,下面一个个的记录下来. consul集群多node consul集群的node也就是我们所说的consul实例. ...

  3. 【转】用 Consul 来做服务注册与服务发现

    原文:https://segmentfault.com/a/1190000018731395?utm_source=tag-newest ------------------------------- ...

  4. Go微服务框架go-kratos实战04:kratos中服务注册和服务发现的使用

    一.简介 关于服务注册和服务发现介绍,我前面的文章有介绍过 - 服务注册和发现的文章. 作为服务中心的软件有很多,比如 etcd,consul,nacos,zookeeper 等都可以作为服务中心. ...

  5. SpringCloud系列(一):Eureka 服务注册与服务发现

    上一篇,我们介绍了服务注册中心,光有服务注册中心没有用,我们得发服务注册上去,得从它那边获取服务.下面我们注册一个服务到服务注册中心上去. 我们创建一个 hello-service 的 spring ...

  6. SpringCloud之eureka服务注册和服务发现

    服务注册中心 :eureka-server 作用:服务注册中心提供服务注册功能 服务提供方:eureka-client 作用:注册服务到服务注册中心 服务注册中心 :eureka-server 创建 ...

  7. dubbo2.7.X版本带来的服务注册和服务调用方式改变

    参考地址:https://www.cnblogs.com/alisystemsoftware/p/13064620.html 注册中心数据结构格式改变(service:接口服务,application ...

  8. SpringCloud实战之初级入门(二)— 服务注册与服务调用

    目录 1.环境介绍 2.服务提供 2.1 创建工程 2.2 修改配置文件 2.3 修改启动文件 2.5 亲测注意事项 3.服务调用 3.1 创建工程 3.2 修改配置文件 3.3 修改启动文件 3.4 ...

  9. 微服务Consul系列之服务注册与服务发现

    在进行服务注册之前先确认集群是否建立,关于服务注册可以看上篇微服务Consul系列之集群搭建的介绍,两种注册方式:一种是注册HTTP API.另一种是通过配置文件定义,下面讲解的是基于后者配置文件定义 ...

随机推荐

  1. Syscan360会议胸牌破解揭秘

    Syscan360会议胸牌破解揭秘 背景 有幸参加今年11月份的上海Syscan360安全会议,会议期间有一个亮点就是360的独角兽团队设计了一款电子badge(胸牌)供参加人员进行破解尝试,类似于美 ...

  2. .NET Core的日志[5]:利用TraceSource写日志

    从微软推出第一个版本的.NET Framework的时候,就在“System.Diagnostics”命名空间中提供了Debug和Trace两个类帮助我们完成针对调试和跟踪信息的日志记录.在.NET ...

  3. 浅谈 LayoutInflater

    浅谈 LayoutInflater 版权声明:本文为博主原创文章,未经博主允许不得转载. 微博:厉圣杰 源码:AndroidDemo/View 文中如有纰漏,欢迎大家留言指出. 在 Android 的 ...

  4. 将DataTable中的某列转换成数组或者List

    string[] arrRate = dtRate.AsEnumerable().Select(d => d.Field<string>("arry")).ToA ...

  5. C# 数组的交集、差集、并集

    C# 数组的交集.差集.并集 工作中经常会用这方面的知识来检查那些字段是必须输入的,那些是禁止输入. using System; using System.Collections.Generic; u ...

  6. Python学习实践------正向最大匹配中文分词

    正向最大匹配分词: 1.加载词典文件到集合中,取词典文件中最大长度词的length 2.每次先在句子中按最大长度分割,然后判断分割的词是否存在字典中,存在则记录此词,调整起始点. 3.不存在则按最大长 ...

  7. Spring MVC类型转换器

    类型转换器引入 为什么页面上输入"12",可以赋值给Handler方法对应的参数?这是因为框架内部帮我们做了类型转换的工作.将String转换成int 但默认类型转换器并不是可以将 ...

  8. JAVA代码验证身份证信息

    java验证身份证信息代码 转自:http://www.blogjava.net/xylz/archive/2011/01/05/342330.html import java.util.Calend ...

  9. 让 asp.net 在 mac 上飞

    .NET 不跨平台一直饱受争议,虽然微软前端时间放出些消息,要支持.NET跨平台的发展,但是微软一直坚持着不主动.不拒绝.不负责的三不态度,仍然用一种软件帝国的心态,折腾着一些毫无新意的东西.微软想要 ...

  10. Ubuntu部署python3.5的开发和运行环境

    Ubuntu部署python3.5的开发和运行环境 1 概述 由于最近项目全部由python2.x转向 python3.x(使用目前最新的 python3.5.1) ,之前的云主机的的默认python ...