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=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跨平台或扫描二维码关注

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/327288.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

tar (child): .tgz\r:无法 open: 没有那个文件或目录

Linux下运行bash脚本显示“: /usr/bin/env: "bash\r": 没有那个文件或目录 程序员小熊 2017-12-18 14:45:45 18395 收藏 7 分类专栏&#xff1a; Linux 版权 用 ./ 运行bash脚本文件出现 报错信息 /usr/bin/env: "bash\r": 没有那个文件或目录 错误原…

Entity Framework Core 1.1 升级通告

Entity Framework Core&#xff08;EF Core&#xff09;是一个轻量级的&#xff0c;可扩展和实体框架的跨平台版本。今天&#xff0c;我们宣布 Entity Framewor Core 1.1 正式可用了。 EF Core 和 .NET Core 遵循相同的发行周期。每2个月不断的改进和每6个月的新功能发布。这是…

聊聊微服务架构及分布式事务解决方案

转载自 聊聊微服务架构及分布式事务解决方案 分布式事务场景如何设计系统架构及解决数据一致性问题&#xff0c;个人理解最终方案把握以下原则就可以了&#xff0c;那就是&#xff1a;大事务小事务&#xff08;原子事务&#xff09;异步&#xff08;消息通知&#xff09;&am…

使用熔断器设计模式保护软件

作为软件开发人员&#xff0c;我们的生活是快节奏的&#xff0c;我们采用的是敏捷软件开发方法&#xff0c;迭代式的开发我们软件功能&#xff0c;开发完成提交测试&#xff0c;通过了QA的测试后被部署到生产环境&#xff0c;然后可怕的事情在生产环境里发生了&#xff0c;生产…

hql投影查询之—— [Ljava.lang.Object; cannot be cast to cn.bdqn.guanMingSys.entity.Notice

最近在做项目中遇到一个简单的问题&#xff0c;但是解决了好久&#xff0c;问题就是投影查询。 先来看看出现的异常&#xff1a; java.lang.ClassCastException: [Ljava.lang.Object; cannot be cast to cn.bdqn.guanMingSys.entity.Notice at cn.bdqn.guanMingSys.dao.i…

架构师之路:从码农到架构师你差了哪些

转载自 架构师之路&#xff1a;从码农到架构师你差了哪些 Web应用&#xff0c;最常见的研发语言是Java和PHP。 后端服务&#xff0c;最常见的研发语言是Java和C/C。 大数据&#xff0c;最常见的研发语言是Java和Python。 可以说&#xff0c;Java是现阶段中国互联网公司中&…

Entity Framework Core 实现MySQL 的TimeStamp/RowVersion 并发控制

将通用的序列号生成器库 从SQL Server迁移到Mysql 遇到的一个问题&#xff0c;就是TimeStamp/RowVersion并发控制类型在非Microsoft SQL Server数据库中的实现。SQL Server timestamp 数据类型与时间和日期无关。SQL Server timestamp 是二进制数字&#xff0c;它表明数据库中数…

干货 | Tomcat 连接数与线程池详解

转载自 干货 | Tomcat 连接数与线程池详解 前言 在使用tomcat时&#xff0c;经常会遇到连接数、线程数之类的配置问题&#xff0c;要真正理解这些概念&#xff0c;必须先了解Tomcat的连接器&#xff08;Connector&#xff09;。 在前面的文章 详解Tomcat配置文件server.xml…

120项优化: 超级爬虫Hawk 2.0重磅发布!

沙漠君在历时半年&#xff0c;修改无数bug&#xff0c;更新一票新功能后&#xff0c;在今天隆重推出最新改进的超级爬虫Hawk 2.0! 啥&#xff1f;你不知道Hawk干吗用的&#xff1f; 这是采集数据的挖掘机&#xff0c;网络猎杀的重狙&#xff01;半年多以前&#xff0c;沙漠君写…

github创建一个新的tag

https://git-scm.com/book/en/v2/Git-Basics-Tagging

phone6s home键按不动了怎么办 苹果6s home键按不动解决方法

iphone6s home键按不动了怎么办 苹果6s home键按不动解决方法 作者&#xff1a;佚名 来源&#xff1a;绿茶软件园 2016-02-15 15:53:35 iphone6s home键按不动了怎么办&#xff1f;有iphone用户遇到home键按不动了的问题&#xff0c;下文小乐哥带来苹果6s home键按不动解决方法…

开源库Magicodes.ECharts使用教程

概要 Magicodes.ECharts是心莱团队基于百度EChart封装的开源的.NET类库&#xff0c;以便让用户更快更便捷的上手开发EChart图表。本篇主要讲解Magicodes.ECharts的相关使用。 注意&#xff1a;EChart图表插件是由百度提供的一套前端图表库&#xff0c;可以流畅运行在PC端和移动…

.NET Core 2.0版本预计于2017年春季发布

微软项目经理Immo Landwerth公布了即将推出的.NET Core 2.0版本的细节&#xff0c;该版本预计于2017年春季发布。这是.NET Core平台的一个重要发布&#xff0c;因为2.0版本对.NET Core的各项功能都有显著扩展。 言归正传&#xff0c;我们来看看即将发布的.NET Core 1.0版本。按…

我是一棵“树”

转载自 我是一棵“树” 我是一颗树&#xff0c;之前我们数据结构家族中的一个小朋友——“栈” 已经给你们介绍过的我们这个家族了&#xff08;我是一个“栈”&#xff09;。之所以叫栈为小朋友&#xff0c;是因为我和他的爸爸——数组是平辈的。 之所以存在我们这样一个家庭&…

pycharm前进、后退快捷键

https://blog.csdn.net/jamieblue1/article/details/89087064 pycharm前进、后退快捷键 jamieblue1 2019-04-08 13:45:17 13663 收藏 4 分类专栏&#xff1a; 其他 文章标签&#xff1a; python pycharm 版权 前进/回退到上一个操作的地方win&#xff1a; 后退 ctrlalt&l…

判断字符串相等能否用==

为什么呢&#xff1f; 是因为比较的是两个对象的内存地址&#xff0c;我们知道变量被创建的时候就相当于在内存中开辟空间&#xff0c;而案例中str和str1就是占用的两块不同的空间&#xff0c;所以他们的内存地址是不一致的&#xff0c;在用符号判断的时候就不相等了&#xff0…

数据库 wifi探针数据量太大了

https://www.cnblogs.com/showcase/p/11654045.html https://www.cnblogs.com/showcase/p/11654045.html 橱窗外的小孩 在完成任务的同时&#xff0c;还需要不断“复盘”&#xff0c;不论你多么的忙&#xff0c;都需要留下时间思考&#xff0c;可以思考哪些地方做的好&#x…

CoreCLR源码探索(一) Object是什么

.Net程序员们每天都在和Object在打交道如果你问一个.Net程序员什么是Object&#xff0c;他可能会信誓旦旦的告诉你"Object还不简单吗&#xff0c;就是所有类型的基类"这个答案是对的&#xff0c;但是不足以说明Object真正是什么 在这篇文章我们将会通过阅读CoreCLR的…