服务发现和注册


我们有了两个服务。服务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中看到刚刚注册的服务:

与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

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

  1. 分布式服务发现与注册中心 Consul 中文入门指南

    公众号关注 「奇妙的 Linux 世界」 设为「星标」,每天带你玩转 Linux ! 基础概念 什么是注册中心 随着微服务理论发展的成熟,越来越多互联网公司采用微服务架构来支持业务发展.各个微服务之间 ...

  2. C# net6微服务架构之服务注册与发现工具Consul的下载与安装(for windows)

    C# net6微服务架构之服务注册与发现工具Consul的下载与安装(for windows) 0.背景 1.Consul简介 2.Consul的主要功能 3.Consul下载与安装 4.Consul ...

  3. 微服务发现与注册之Eureka源码分析

    作者:陌北有棵树,Java人,架构师社区合伙人! [一]微服务之服务发现概述 关于微服务,近年来可谓是大火,业界也吹刮着一种实践微服务的风潮.本人有幸在去年参与到一个向微服务过渡的产品,再结合自己所学 ...

  4. 服务发现 注册中心 consul 的介绍、部署和使用

    什么是服务发现 微服务的框架体系中,服务发现是不能不提的一个模块.我相信了解或者熟悉微服务的童鞋应该都知道它的重要性.这里我只是简单的提一下,毕竟这不是我们的重点.我们看下面的一幅图片: 图中,客户端 ...

  5. Spring Cloud构建微服务架构:服务注册与发现(Eureka、Consul)【Dalston版】

    Spring Cloud简介 Spring Cloud是一个基于Spring Boot实现的云应用开发工具,它为基于JVM的云应用开发中涉及的配置管理.服务发现.断路器.智能路由.微代理.控制总线.全 ...

  6. 第一篇:SpringCloud 构建微服务系统之服务注册和发现(consul)

    版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/u010046908/article/details/85260629 今天我们要学习的是consul ...

  7. java spring cloud版b2b2c社交电商spring cloud分布式微服务:服务注册与发现(Eureka、Consul)...

    Spring Cloud简介 电子商务社交平台源码请加企鹅求求:一零三八七七四六二六.Spring Cloud是一个基于Spring Boot实现的云应用开发工具,它为基于JVM的云应用开发中涉及的配 ...

  8. java如何通过grpc连接etcd_grpc通过 etcd 实现服务发现与注册-源码分析

    介绍 下面介绍 jupiter-0.2.7 版本中 grpc 通过 etcd 实现服务发现与注册. 服务发现与注册的实现解析 服务注册 服务注册的流程图: etcd的服务注册代码模块在 jupiter ...

  9. 微服务系列:服务注册与发现的实现原理、及实现优劣势比较

    服务注册与发现的来源 首先,服务注册与发现是来自于微服务架构的产物. 在传统的服务架构中,服务的规模处于运维人员的可控范围内.当部署服务的多个节点时,一般使用静态配置的方式实现服务信息的设定.而在微服 ...

最新文章

  1. docker安装并运行elasticsearch
  2. js word 预览_微软补丁日:Word/DHCP/LNK远程代码执行漏洞预警
  3. 微软开源自动机器学习工具 – NNI安装与使用
  4. navicat工具把SQL Server数据库转换MySQL数据库
  5. 图像处理特征提取之(二):Haar特征
  6. stm32f103zet6定时器和pwm简单驱动步进电机
  7. outlook查看html,怎样察看IE/Outlook中HTML页面的源文件
  8. 用迅雷或者IDM下载下载百度网盘文件方法
  9. php 忽略 deprecated,php Deprecated 解决办法
  10. Opcode指令解析
  11. 方格取数(多线程dp,深搜)
  12. 应用Druid监控SQL语句的执行情况
  13. 僵尸进程是什么,如果产生一个僵尸进程,如何查找僵尸进程
  14. TEB轨迹优化算法-代码解析与参数建议
  15. CSS Day02学习
  16. 2014025640《大四实习》第*周学习总结
  17. 三电平NPC并网逆变器闭环控制仿真模型 带中点电位平衡
  18. mt6735 Universal Bin和non-Universal Bin的区别
  19. HTML5+CSS3+JQuery打造自定义视频播放器
  20. Django知识点笔记

热门文章

  1. Python的函数参数传递:传值?引用?
  2. js冒泡排序,简单的冒泡排序
  3. 前端学习(3312):redux的正确构建
  4. Taro+react开发(27)别加view
  5. [jQuery] jQuery的attr和prop方法有什么区别?
  6. 工作119:axios请求封装
  7. 前端学习(2585):前端怎么在响应头和请求头里面拿数据?
  8. 前端学习(2454):用户登录
  9. “约见”面试官系列之常见面试题之第五十六篇之typeof返回的数据类型(建议收藏)
  10. 前端学习(1645):前端系列实战课程之留言板功能实现