服务发现和注册


我们有了两个服务。服务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}/health
healthCheckInterval: 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/

我是服务的执政官-服务发现和注册工具consul简介的更多相关文章

  1. 玩转springcloud(三):服务的提供者与调用者(注册于发现)

    一.简介 上文我们实践了cloud的注册中心的单服务于多节点的搭建,房子造好了得有人来住不是,这篇我们实践下服务提供者于调用者的案例,也就是服务端和客户端的调用. 本文会设计三个module:注册中心 ...

  2. 使用docker+consul+nginx集成分布式的服务发现与注册架构

    一.环境说明: 1.一台虚拟机,该系统已经装好了docker: ip 192.168.10.224 虚拟网卡,与主机互通 操作系统rhel6 内核 2.6.32  64位 docker版本 1.7.1 ...

  3. springcloud之服务注册与发现(zookeeper注册中心)-Finchley.SR2版

    新年第一篇博文,接着和大家分享springcloud相关内容:本次主要内容是使用cloud结合zookeeper作为注册中心来搭建服务调用,前面几篇文章有涉及到另外的eureka作为注册中心,有兴趣的 ...

  4. 微服务的发现与注册--Eureka

    目录 服务提供者.服务消费者.服务发现组件三者之间的关系 Eureka 简介 Eureka Server Eureka Client 编写Eureka Server 将微服务注册到Eureka Ser ...

  5. 微服务SpringCloud之服务注册与发现

    在找.net core 微服务框架时发现了Steeltoe开源项目,它可以基于Spring Cloud实现.net core和.net  Framework的微服务.正好之前也有学习过SpringBo ...

  6. 服务发现和注册和Eureka

    一 Spring Cloud特点 # 约定优于配置 # 开箱即用,快速启动 # 适用于各种环境,可以部署在PC server或者 云环境 # 轻量级的组件 # 组件的支持很丰富,功能齐全 # 选型中立 ...

  7. SpringCloud微服务实战一:Spring Cloud Eureka 服务发现与注册中心(高可用实列为两个注册中心)

    微服务架构: 微服务架构的核心思想是,一个应用是由多个小的.相互独立的.微服务组成,这些服务运行在自己的进程中,开发和发布都没有依赖.不同服务通过一些轻量级交互机制来通信,例如 RPC.HTTP 等, ...

  8. 服务注册与发现【Eureka】- Eureka简介

    什么是服务治理 SpringCloud 封装了 Netflix 公司开发的 Eureka 模块来 实现服务治理. 在传统的rpc远程调用框架中,管理每个服务与服务之间依赖关系比较复杂,管理比较复杂,所 ...

  9. go微服务系列(二) - 服务注册/服务发现

    目录 1. 服务注册 1.1 代码演示 1.2 在go run的时候传入服务注册的参数 2. 服务发现均衡负载 2.1 均衡负载算法 2.2 服务发现均衡负载的演示 1. 服务注册 1.1 代码演示 ...

随机推荐

  1. html5 video

    先简要概述一下video标签: video:嵌入视频到页面中 1. 声明video标签 单个视频的时候使用src: <video src="http://v2v.cc/~j/theor ...

  2. javascript随笔20160808

    var jsondata=$.parseJSON(@ViewBag.x); //转换为Json数据 var fruits = ["Banana", "Orange&quo ...

  3. window对象的属性及事件。

    不同的运行环境有不同的“顶层对象”,而在浏览器的环境中,顶层对象就是window对象.window就是指当前的浏览器窗口. 例:var a = 1: window.a; //1 1.window对象的 ...

  4. CSS布局基础——BFC

    what's BFC? 第一次看到这个名词,我是拒绝的,css什么时候还有这个东西?于是迫不及待的google了一下,才发现原来它无时无刻不在我们的css当中,只不过它并不是一个属性,不需要我们平常使 ...

  5. 天津政府应急系统之GIS一张图(arcgis api for flex)讲解(五)地图切换以及图层显示模块

    config.xml文件的配置如下: <widget right="20" top="55" config="widgets/MapSwitch ...

  6. Google C++单元测试框架GoogleTest---AdvancedGuide(译文)上

    本文是gtest高级测试指南的译文,由于文章太长,分上下两部分. 一.简介 本文档将向您展示更多的断言,以及如何构造复杂的失败消息,传播致命的故障,重用和加速您的测试夹具,并在您的测试使用各种标志. ...

  7. iOS 设置状态栏的背景颜色

    设置状态栏的背景颜色 - (void)setStatusBarBackgroundColor:(UIColor *)color { UIView *statusBar = [[[UIApplicati ...

  8. ListView实现点击事件以及总结

    差点吓死我了,好不容易写的博客没有了,还好有自动保存功能,不然我真的是呜呜... ---恢复内容开始--- 开学一个月了,终于可以看见自己的作品雏形了. 从一个小白到现在半年了,觉得日子过得比较充实, ...

  9. Java Web解决解析乱码和响应乱码

    package cn.edu.aynu.rjxy.servlet; import java.io.IOException; import java.io.PrintWriter; import jav ...

  10. 转载文章-----Rational Rose2007(v7.0)下载地址、安装及激活详解教程(图)

    转载地址:http://www.cnblogs.com/leaven/p/3718361.html 最近需要画uml图,之前用的是Rose 2003版的,由于好久没进去了,结果发现原来的激活又失效了, ...