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,一经查实,立即删除!

相关文章

Java Base64 编码解码方案总结

转载自 Java Base64 编码解码方案总结 Base64是一种能将任意Binary资料用64种字元组合成字串的方法&#xff0c;而这个Binary资料和字串资料彼此之间是可以互相转换的&#xff0c;十分方便。在实际应用上&#xff0c;Base64除了能将Binary资料可视化之外&#xff0c;也常用来…

babel基本使用

babel 转码器es6->es5 第一步 安装babel工具&#xff0c;使用命令,查看版本号 npm install --global babel-clibabel --version第二步 配置文件 .babelrc&#xff08;后缀名固定&#xff09; {"presets": ["es2015"],"plugins": [] }第…

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…

2014年JAVA省赛B组---第四题---大衍数列

【答案】&#xff1a; i % 2 0 public class TEST { // 奇偶数判断&#xff1a;x % 2 0public static void main(String[] args) {for (int i 1; i < 100; i) {if (i % 2 0) // 填空System.out.println(i * i / 2);elseSystem.out.println((i * i - 1) / 2);}}}

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

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

好的句子

"大概每个人都会遇到一个不能在一起的人&#xff0c;放手舍不得&#xff0c;坚持又太累&#xff0c;这样的爱而不得最是煎熬。" 你要去做一个懂事的大人&#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是现阶段中国互联网公司中&…

2014蓝桥杯-B-省赛-五-圆周率

【答案】&#xff1a;4 / (x - 1)) public class TEST {public static void main(String[] args) {double x 111;for (int n 10000; n > 0; n--) {int i 2 * n 1; //把i变为奇数x 2 (i * i / x);}// x21/xSystem.out.println(String.format("%.4f", 4 /…

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

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

mvc.net分页查询案例——PagedList

在.net中&#xff0c;除了人手动写分页类之外&#xff0c;微软还提供了官方的分页&#xff0c;分页工具类包括PagedList和PagerExtension&#xff0c;先来看看PagedList类里面是怎么写的&#xff1a; PagedList using System; using System.Collections.Generic; using Syste…

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

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

cnpm install无反应

cnpm install无反应 推荐使用国内镜像来安装&#xff0c;所以我们先设置 cnpm&#xff1a; npm install -g cnpm --registryhttps://registry.npm.taobao.org 如果安装失败&#xff0c;可以使用npm cache clean清理缓存&#xff0c;然后再重新安装。

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

Java 编程中关于异常处理的 10 个最佳实践

转载自 Java 编程中关于异常处理的 10 个最佳实践 异常处理是Java 开发中的一个重要部分。它是关乎每个应用的一个非功能性需求&#xff0c;是为了处理任何错误状况&#xff0c;比如资源不可访问&#xff0c;非法输入&#xff0c;空输入等等。Java提供了几个异常处理特性&…

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端和移动…