我是服务的执政官-服务发现和注册工具consul简介

服务发现和注册


我们有了两个服务。服务A的IP地址是192.168.0.1,端口9001,服务B的IP地址192.168.0.2,端口9002。我们的客户端需要调用服务A和服务B,我们只需要在配置文件中写上服务A和服务B的IP地址即可。

此时,服务A的服务器负载有点高,我们需要临时增加服务A的实例,IP192.168.0.3,端口9001。但是我们的客户端要怎么才能调用新的实例?

常规来说,我们可以有以下几种方法:

  • 网络代理方式
    如果是http方式通信的服务,可以增加一个nginx做反向代理,转发到两个服务A的实例上。
    如果是RPC服务则可以增加一个LVS或HAProxy或者ESB之类的网络代理,客户端配置网络代理地址。
    服务B我们再来一套一样的配置,这时候又来了服务C、服务D、服务E...,好吧我们好还要再多维护同样多的网络代理。此外,所有的服务调用服务调用都必须经过网络代理,我们还必须保证代理的高可用。最后,陷入运维灾难。

  • DNS方式
    给服务A配置一个域名,然后通过配置两个A记录分别指向两个服务A的实例,客户端只要配置服务A的域名即可。
    这种方式也存在问题,首先DNS没有办法管理端口,我们的端口还是只能写在每个客户端的配置文件中。此外DNS轮询负载均衡能力太弱,可能会导致客户端负载的不均衡。

现在有了服务发现和注册机制,我们可以更合理的解决这个问题。

服务发现和注册,参考字面意思很容易理解,其核心部分可以理解为一个服务注册表。服务启动时,将自己的信息注册到注册表中。注册表需要每一定时间访问下已经注册的服务,将没有响应的服务从注册表中删除。最终让客户端拿到正常运行的服务地址。

此时,我们的服务注册表必须具备分布式、高可用、强一致性等特点。

目前,业界开源的服务发现和注册产品有很多,比较流行的主要有:ZooKeeper,Etcd,Consul,Eureka等。

下面介绍下今天的主角,Consul

Consul


Consul是一个服务发现和注册的工具,其具有分布式、高扩展性能特点。

Consul主要包含如下功能:

  • 服务发现: 支持 http 和 dns 两种协议的服务注册和发现方式。
  • 监控检查: 支持多种方式的健康检查。
  • Key/Value存储: 支持通过HTTP API实现分布式KV数据存储。
  • 多数据中心支持:支持任意数量数据中心。

官网图

上图是官网提供的一个事例系统图,图中的Server是consul服务端高可用集群,Client是consul客户端。consul客户端不保存数据,客户端将接收到的请求转发给响应的Server端。Server之间通过局域网或广域网通信实现数据一致性。每个Server或Client都是一个consul agent。Consul集群间使用了GOSSIP协议通信和raft一致性算法。

使用Consul也非常简单,基本可以做到开箱即用。

下载应用后可以通过简单的脚本启动服务端和客户端:

$ consul
usage: consul [--version] [--help] <command> [<args>]Available commands are:
agent          Runs a Consul agent
configtest     Validate config file
event          Fire a new event
exec           Executes a command on Consul nodes
force-leave    Forces a member of the cluster to enter the "left" state
info           Provides debugging information for operators
join           Tell Consul agent to join cluster
keygen         Generates a new encryption key
keyring        Manages gossip layer encryption keys
kv             Interact with the key-value store
leave          Gracefully leaves the Consul cluster and shuts down
lock           Execute a command holding a lock
maint          Controls node or service maintenance mode
members        Lists the members of a Consul cluster
monitor        Stream logs from a Consul agent
operator       Provides cluster-level tools for Consul operators
reload         Triggers the agent to reload configuration files
rtt            Estimates network round trip time between nodes
version        Prints the Consul version
watch          Watch for changes in Consul

运行consul agent 加上相关的参数,就可以启动一个consul server 或者 client。

接着,我们可以通过http api注册服务,向/v1/catalog/register发送PUT动作的JSON报文:

{"Datacenter": "dc1",   "Node": "foobar",      "Address": "192.168.10.10",  "Service": {             //注册的服务信息"ID": "redis1","Service": "redis","Tags": ["primary","v1"],"Address": "127.0.0.1","Port": 8000},"Check": {              //注册健康检查"Node": "foobar","CheckID": "service:redis1","Name": "Redis health check","Notes": "Script based health check","Status": "passing","ServiceID": "redis1"}
}

注册后,我们可以在consul自带的WEB UI中看到刚刚注册的服务:

73868-20161202165958881-843055478.png

与Spring Cloud集成


如果你的服务正好使用spring boot构建,不妨试试Spring Cloud Consul。

Spring Cloud Consul通过几个简单的注解,就可以集成诸多consul功能,让你更方便的治理你的服务。

@SpringBootApplication
@EnableDiscoveryClient   //只要添加这个注解即可向配置号的consul注册服务
@RestController
public class Application { @RequestMapping("/")public String home() {return "Hello world";}public static void main(String[] args) {new SpringApplicationBuilder(Application.class).web(true).run(args);} 
}

同时我们可以配合spring boot actuator来注册监控检查:

spring:cloud:consul:discovery:healthCheckPath: ${management.contextPath}/healthhealthCheckInterval: 15s

Spring Cloud支持 Feign 或者 Spring RestTemplate 通过服务发现来调用服务,也可以使用org.springframework.cloud.client.discovery.DiscoveryClient:

@Autowired //注入一个DiscoveryClient
private DiscoveryClient discoveryClient;public String serviceUrl() {List<ServiceInstance> list = discoveryClient.getInstances("STORES");if (list != null && list.size() > 0 ) {return list.get(0).getUri();}return null;
}

consul除了可以用作服务治理的工具,还可以利用其KV存储能力,实现分布式服务配置或分布式锁等功能。各位感兴趣的童鞋可以去consul官网,学习更多的内容。

最后,都看到这了,就顺手点个赞吧~~~

参考资料:
https://www.nginx.com/blog/service-discovery-in-a-microservices-architecture/
https://highops.com/insights/service-discovery-6-questions-to-4-experts/
https://www.consul.io/
http://cloud.spring.io/spring-cloud-consul/

转载于:https://www.cnblogs.com/lazio10000/p/6126754.html

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

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

相关文章

什么linux系统是中文的,什么是Linux系统

Linux系统是一种类似Unix的开源和社区开发的操作系统&#xff0c;适用于计算机&#xff0c;服务器&#xff0c;大型机&#xff0c;移动设备和嵌入式设备&#xff0c;已成为最广泛支持的操作系统之一&#xff0c;接下来在文章中将为大家详细介绍什么是Linux【推荐课程&#xff1…

IEnumerable.EachTSource(FuncTSource, TSource predicate) 逐个更改列表成员的值

/// <summary> /// 逐个对象执行predicate并获得返回值 /// </summary> /// <typeparam name"TSource"></typeparam> /// <param name"source"></param> /// <param name"…

王嘉廉佳话

叶 烨 王嘉廉创办冠群电脑&#xff0c;打入幸福100家&#xff0c;成为雅虎杨致远之前北美华人首富。王嘉廉八岁时随父母从上海移民美国&#xff0c;年青时就读皇后学院数学系&#xff0c;有时为二毛五午歺费发愁&#xff0c;但他从没打算打工靠苦力挣钱。 王嘉廉功课一般&#…

SQLServer XML操作

declare x xml,y xmlset x<item><title>姓名 </title></item> select x.query(/item/title)select x.query(/item/title).value(/,nvarchar(100))select D.x.value(./title[1],nvarchar(100)) from x.nodes(/*) as D(x);查询结果&#xff1a; <tit…

0037 Java学习笔记-多线程-同步代码块、同步方法、同步锁

什么是同步 在上一篇0036 Java学习笔记-多线程-创建线程的三种方式示例代码中&#xff0c;实现Runnable创建多条线程&#xff0c;输出中的结果中会有错误&#xff0c;比如一张票卖了两次&#xff0c;有的票没卖的情况&#xff0c;因为线程对象被多条线程访问&#xff0c;一条线…

我的.Net+SQLServer更新设计

一、备份 备份程序、数据库&#xff08;非常重要&#xff09; 二、更新程序 发布Web/Winform程序&#xff0c;将发布文件夹中需要更新的文件发布到服务器上&#xff0c;这里配置文件如果有修改应该单 独修改&#xff0c;否则不应更新配置文件。 三、更新数据库架构 可以通过VS2…

numpy将所有数据变为0和1_Numpy库学习

之前照着《利用python进行数据分析》学过一边&#xff0c;代码也跟着敲了&#xff0c;但是如果不用的话&#xff0c;印象不深&#xff0c;忘的特别快。所以&#xff0c;现在再过一遍&#xff0c;并且记录一下&#xff0c;加深印象。一、创建numpy中的多维数组对象ndarry的创建。…

win8.1 linux系统,电脑显示win8.1linux系统失效的原因及解决办法!

电脑蓝屏每次代码都不一样&#xff0c;有的是epoll或者workflow代码有的是错误码&#xff0c;会将错误进行查找&#xff0c;电脑蓝屏错误有些可以修复&#xff0c;也有错误修复不了的&#xff0c;出现蓝屏&#xff0c;最可能的原因是segmentationfault&#xff0c;出现的原因是…

js 保留两位小数(四舍五入)

toFixed() 方法可把 Number 四舍五入为指定小数位数的数字。 intA.toFixed(2)

数据丢失情况下应急之顶级数据恢复服务提供商列表

在当今的数字世界中&#xff0c;数据存储设备在我们的职业和个人生活中发挥着非常重要的作用。 无论是硬盘驱动器上的重要专业文档、USB 闪存驱动器上的医疗数据还是外部硬盘驱动器上的照片和视频&#xff0c;我们都将重要信息存储在一个或另一个数据存储设备上。我们认为数据…

jsencrypt加密同一值返回不同密文_密码学原语如何应用?解析密文同态性的妙用...

免责声明&#xff1a;本文旨在传递更多市场信息&#xff0c;不构成任何投资建议。文章仅代表作者观点&#xff0c;不代表火星财经官方立场。小编&#xff1a;记得关注哦来源&#xff1a;微众银行区块链隐私数据在密文形式下是否依旧可以加减乘除&#xff1f;其背后的同态性原理…

c语言函数大全 chm,【oeasy丨c语言丨函数】C语言库函数使用大全CHM版

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼函数名: arc功 能: 画一弧线用 法: void far arc(int x, int y, int stangle, int endangle, int radius);程序例:#include #include #include #include int main(void){/* request auto detection */int gdriver DETECT, gmode, …

VS.NET 编译出来的DLL,XML注释(Sumarry 注释)输出

项目属性——生成——输出中选中xml文档文件——生成即可

小红帽怎样装图形化界面_纯技术篇:U盘装系统,不再多花冤枉钱

U盘装系统&#xff0c;顾名思义就是用U盘安装电脑的操作系统。这里小编用现在最常见的大白菜装机软件来开始教程。1、使用大白菜装机版制作大白菜U盘启动盘之前&#xff0c;需要准备一个存储空间大于2G的U盘。2、下载并且安装好大白菜装机版&#xff0c;打开安装好的大白菜装机…

c#语言中的变量名,在C#中创建动态变量名

如果你坚持使用当前的设计(CSV字典),你可以使用ExpandoObject类来获得你想要的东西,创建一个简单的工厂类&#xff1a;public static class ObjectFactory{public static dynamic CreateInstance(Dictionary objectFromFile){dynamic instance new ExpandoObject();var instan…

c++11 lambda

为什么需要lambda函数匿名函数是许多编程语言都支持的概念&#xff0c;有函数体&#xff0c;没有函数名。1958年&#xff0c;lisp首先采用匿名函数&#xff0c;匿名函数最常用的是作为回调函数的值。正因为有这样的需求&#xff0c;c引入了lambda 函数&#xff0c;你可以在你的…

Axure SVN共享 Commit Failed (details Follow) 问题解决

1.先全部获新&#xff0c;再签入。2.重新连接共享获新到另一个文件夹&#xff0c;重新修改签入即可。