consul服务注册与发现应用实战

上一讲;讲到consul发现的模板形式,这一讲我们聊一聊比较基础的consul的服务注册与发现,并且使用bind代理给服务做负载均衡,这个功能也是后面要补充的redis + consul 或者mha + consul的一个基础,我们先看一下环境:

配置环境(还是那句话,在生产环境把server配置成3-5台,agent随意):

192.168.113.174       server
192.168.113.175       agent
192.168.113.176       agent
192.168.113.177       agent

1、启动master:

[[email protected] src]# consul agent -server -bootstrap-expect 1 -data-dir /tmp/consul  -bind 0.0.0.0 -client 0.0.0.0 -ui &

参数说明:

-server:集群启动为service

-bootstrap-expect:期待加入service节点的数量

-data-dir:数据目录

-node:节点名称,集群中每个节点名称需唯一

-bind:指定一个consul运行时的监听地址

-ui:启动时启动ui

2、为了便于测试,我们在三台agent上面安装nginx服务。

[[email protected] src]# curl http://192.168.113.176/health/
192.168.113.176
[[email protected] src]# curl http://192.168.113.175/health/
192.168.113.175
[[email protected] src]# curl http://192.168.113.177/health/
192.168.113.177

3、开始服务的注册:

Consul支持两种服务注册的方式,一种是通过Consul的服务注册HTTP API,由服务自身在启动后调用API注册自己,另外一种则是通过在配置文件中定义服务的方式进行注册。

Consul文档中建议使用后面一种方式来做服务 配置和服务注册。

4、我们以脚本的方式来注册,看一下脚本(每台都操作,一175为例):

[[email protected] confd_data]# ls
server.json
[[email protected] confd_data]# cat server.json 
{
  "service": {
    "name": "web",
    "tags": ["dev"],
    "address": "192.168.113.175",
    "port": 80,
    "checks": [
      {
        "http": "http://192.168.113.175/health/",
        "interval": "10s"
      }
    ]
  }
}

#-node的时候,175为web1,176为web2,177为web3

[[email protected] confd_data]# consul agent -data-dir /tmp/consul -node=web1 -bind=192.168.113.175 -config-dir=/confd_data/  &

#启动之后还是独立的个体,这个时候是还没有注册的server的,我们可以收工去注册添加到集群,当然这个集群建议开始就创建好,配置文件reload即可:

[[email protected] ~]# consul join 192.168.113.174
Successfully joined cluster by contacting 1 nodes.

5、配置完成后查看集群状态:

6、下面我们关闭web3的nginx然后再观察一下web UI的状态:

7、服务发现:

consul提供来服务发现接口,我们使用DNS解析的方式来查看一下,现在还解析道哪些服务:

[[email protected] src]# dig @127.0.0.1 -p 8600 web.service.consul SRV
; <<>> DiG 9.9.4-RedHat-9.9.4-61.el7 <<>> @127.0.0.1 -p 8600 web.service.consul SRV
; (1 server found)
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 61209
;; flags: qr aa rd; QUERY: 1, ANSWER: 2, AUTHORITY: 0, ADDITIONAL: 5
;; WARNING: recursion requested but not available
;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
;; QUESTION SECTION:
;web.service.consul.            IN      SRV
;; ANSWER SECTION:
web.service.consul.     0       IN      SRV     1 1 80 web2.node.dc1.consul.
web.service.consul.     0       IN      SRV     1 1 80 web1.node.dc1.consul.
;; ADDITIONAL SECTION:
web2.node.dc1.consul.   0       IN      A       192.168.113.176
web2.node.dc1.consul.   0       IN      TXT     "consul-network-segment="
web1.node.dc1.consul.   0       IN      A       192.168.113.175
web1.node.dc1.consul.   0       IN      TXT     "consul-network-segment="

8、开启web3的nginx再做测试:

[[email protected] src]# dig @127.0.0.1 -p 8600 web.service.consul SRV
; <<>> DiG 9.9.4-RedHat-9.9.4-61.el7 <<>> @127.0.0.1 -p 8600 web.service.consul SRV
; (1 server found)
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 12981
;; flags: qr aa rd; QUERY: 1, ANSWER: 3, AUTHORITY: 0, ADDITIONAL: 7
;; WARNING: recursion requested but not available
;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
;; QUESTION SECTION:
;web.service.consul.            IN      SRV
;; ANSWER SECTION:
web.service.consul.     0       IN      SRV     1 1 80 web1.node.dc1.consul.
web.service.consul.     0       IN      SRV     1 1 80 web3.node.dc1.consul.
web.service.consul.     0       IN      SRV     1 1 80 web2.node.dc1.consul.
;; ADDITIONAL SECTION:
web1.node.dc1.consul.   0       IN      A       192.168.113.175
web1.node.dc1.consul.   0       IN      TXT     "consul-network-segment="
web3.node.dc1.consul.   0       IN      A       192.168.113.177
web3.node.dc1.consul.   0       IN      TXT     "consul-network-segment="
web2.node.dc1.consul.   0       IN      A       192.168.113.176
web2.node.dc1.consul.   0       IN      TXT     "consul-network-segment="

9、域名解析问题:

我们看到consul的域名跳转来,如何在线上使用呢, 有三个方案:

1. 原内网dns服务器,做域名转发,consul后缀的,都转到consul server上(我们线上是采用这个)
2. dns全部跳到consul DNS服务器上,非consul后缀的,使用 recursors 属性跳转到原DNS服务器上
3. dnsmaq 转: server=/consul/10.16.X.X#8600 解析consul后缀的

10、构建bind域名解析:

[[email protected] src]# yum install bind -y

配置name服务做解析:

[[email protected] src]# cat /etc/named.conf 
options {
  listen-on port 53 { 192.168.113.174; };
  listen-on-v6 port 53 { ::1; };
  directory       "/var/named";
  dump-file       "/var/named/data/cache_dump.db";
  statistics-file "/var/named/data/named_stats.txt";
  memstatistics-file "/var/named/data/named_mem_stats.txt";
  allow-query     { any; };
  recursion yes;
  dnssec-enable no;
  dnssec-validation no;
  /* Path to ISC DLV key */
  bindkeys-file "/etc/named.iscdlv.key";
  managed-keys-directory "/var/named/dynamic";
};
include "/etc/named/consul.conf";
[[email protected] src]# cat /etc/named/consul.conf 
zone "consul" IN {
  type forward;
  forward only;
  forwarders { 192.168.113.174 port 8600; };
};

11、再次测试一下解析:

[[email protected] confd_data]# dig @192.168.113.174 -p 8600 web.service.consul A
; <<>> DiG 9.9.4-RedHat-9.9.4-61.el7 <<>> @192.168.113.174 -p 8600 web.service.consul A
; (1 server found)
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 57750
;; flags: qr aa rd; QUERY: 1, ANSWER: 3, AUTHORITY: 0, ADDITIONAL: 1
;; WARNING: recursion requested but not available
;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
;; QUESTION SECTION:
;web.service.consul.            IN      A
;; ANSWER SECTION:
web.service.consul.     0       IN      A       192.168.113.177
web.service.consul.     0       IN      A       192.168.113.176
web.service.consul.     0       IN      A       192.168.113.175

#测试一下bind域名转发:

[[email protected] confdata]# dig @192.168.113.174 -p 53 web.service.consul A
; <<>> DiG 9.9.4-RedHat-9.9.4-61.el7 <<>> @192.168.113.174 -p 53 web.service.consul A
; (1 server found)
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 6024
;; flags: qr rd ra; QUERY: 1, ANSWER: 3, AUTHORITY: 0, ADDITIONAL: 1
;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
;; QUESTION SECTION:
;web.service.consul.            IN      A
;; ANSWER SECTION:
web.service.consul.     0       IN      A       192.168.113.177
web.service.consul.     0       IN      A       192.168.113.176
web.service.consul.     0       IN      A       192.168.113.175

12、然后修改域名解析到192.168.113.174:

[[email protected] confdata]# cat /etc/resolv.conf 
# Generated by NetworkManager
nameserver 192.168.113.174

13、访问一下这个域名看一下:

[[email protected] confdata]# curl web.service.consul/health/
192.168.113.175

各台ping测试:

[[email protected] ~]# ping web.service.consul
PING web.service.consul (192.168.113.177) 56(84) bytes of data.
64 bytes from mha (192.168.113.177): icmp_seq=1 ttl=64 time=1.34 ms

[[email protected] confdata]# ping web.service.consul
PING web.service.consul (192.168.113.175) 56(84) bytes of data.
64 bytes from slave (192.168.113.175): icmp_seq=1 ttl=64 time=0.524 ms
64 bytes from slave (192.168.113.175): icmp_seq=2 ttl=64 time=0.343 ms

总结:到处我们做的服务注册与发现已经完成,看到网络上很多概念自己有点蒙,所以就实现了一把这个东西,后面有时间我们在更新redis+哨兵+consul无缝迁移的时候,会用到类似的东西,当然应用场景是很多的,在微服务器架构下我们如何注册并发现一个启动的服务器,做代理,是一个问题。总之consul非常强大。

原文地址:http://blog.51cto.com/xiaoluoge/2134126

时间: 2024-10-18 10:00:49

consul服务注册与发现应用实战的相关文章

分布式服务注册和发现consul 简要介绍

Consul是HashiCorp公司推出的开源工具,用于实现分布式系统的服务发现与配置.与其他分布式服务注册与发现的方案,Consul的方案更"一站式",内置了服务注册与发现框 架.分布一致性协议实现.健康检查.Key/Value存储.多数据中心方案,不再需要依赖其他工具(比如ZooKeeper等).使用起来也较 为简单.Consul用Golang实现,因此具有天然可移植性(支持Linux.windows和Mac OS X):安装包仅包含一个可执行文件,方便部署,与Docker等轻量级

Spring Cloud Consul 实现服务注册和发现

Spring Cloud 是一个基于 Spring Boot 实现的云应用开发工具,它为基于 JVM 的云应用开发中涉及的配置管理.服务发现.断路器.智能路由.微代理.控制总线.全局锁.决策竞选.分布式会话和集群状态管理等操作提供了一种简单的开发方式.通过 Spring Boot 风格进行再封装屏蔽掉了复杂的配置和实现原理,最终给开发者留出了一套简单易懂.易部署和易维护的分布式系统开发工具包. Spring Cloud 包含了多个子项目(针对分布式系统中涉及的多个不同开源产品),比如:Sprin

基于 Consul 实现 MagicOnion(GRpc) 服务注册与发现

0.简介 0.1 什么是 Consul Consul是HashiCorp公司推出的开源工具,用于实现分布式系统的服务发现与配置. 这里所谓的服务,不仅仅包括常用的 Api 这些服务,也包括软件开发过程当中所需要的诸如 Rpc.Redis.Mysql 等需要调用的资源. 简而言之 Consul 就是根据 Key/Value 存储了一套所有服务的 IP/Port 集合,当你 Grpc 客户端需要请求某种服务的时候,具体的 IP 与端口不需要你自己来进行指定,而是通过与 Consul Agent 通信

.Net Core 商城微服务项目系列(二):使用Ocelot + Consul构建具备服务注册和发现功能的网关

1.服务注册 在上一篇的鉴权和登录服务中分别通过NuGet引用Consul这个包,同时新增AppBuilderExtensions类: public static class AppBuilderExtensions { public static IApplicationBuilder RegisterConsul(this IApplicationBuilder app,IApplicationLifetime lifetime,ServiceEntity serviceEntity) {

Spring Cloud Alibaba 实战 之 Nacos 服务注册和发现

服务注册与发现,服务发现主要用于实现各个微服务实例的自动化注册与发现,是微服务治理的核心,学习 Spring Cloud Alibaba,首先要了解框架中的服务注册和发现组件——Nacos. 一.Spring Cloud 服务注册和发现组件 1.Spring Cloud Eureka 闭源风波 在Spring Cloud的子项目中,Spring Cloud Netflix提供了Eureka来实现服务的发现功能,Eureka的服务发现包含两大组件: 服务端发现组件(EurekaServer)和客户

服务注册与发现

服务注册与发现 1.什么是服务注册与发现 微服务将传统的"巨石"应用拆分成一个一个的组件应用,每个组件应用提供特定的服务,可以是一个,也可以是多个,并且组件所含服务应该是可以动态扩展的,随着时间推移.系统进化,可任意拆分.合并. 组件化应用和颗粒化的服务,遍布在系统的各个角落,由不同的项目成员进行维护,微服务的核心是化整为零.各司其职,这就要求开发人员不得操作其业务或服务范围以外的数据模型等资源,只能通过接口的访问,使用某一服务. 由于服务的跨度很大(公司很大的情况下).数量很多(数以

初见微服务之服务注册与发现

什么是服务注册与发现 微服务将传统的"巨石"应用拆分成一个一个的组件应用,每个组件应用提供特定的服务,可以是一个,也可以是多个,并且组件所含服务应该是可以动态扩展的,随着时间推移.系统进化,可任意拆分.合并. 组件化应用和颗粒化的服务,遍布在系统的各个角落,由不同的项目成员进行维护,微服务的核心是化整为零.各司其职,这就要求开发人员不得操作其业务或服务范围以外的数据模型等资源,只能通过接口的访问,使用某一服务. 由于服务的跨度很大(公司很大的情况下).数量很多(数以百计甚至更多),为保

CAP理论以及服务注册与发现

CAP理论是分布式架构中重要理论 一致性(Consistency) (所有节点在同一时间具有相同的数据)可用性(Availability) (保证每个请求不管成功或者失败都有响应)分隔容忍(Partition tolerance) (系统中任意信息的丢失或失败不会影响系统的继续运作) 关于P的理解,我觉得是在整个系统中某个部分,挂掉了,或者宕机了,并不影响整个系统的运作或者说使用,而可用性是,某个系统的某个节点挂了,但是并不影响系统的接受或者发出请求,CAP 不可能都取,只能取其中2个 原因是如

聊聊微服务的服务注册与发现

摘要: 一个好的服务注册发现中间件,应该是能完整地满足服务开发和治理的基础功能,然后才是性能和高可用.如果没有想清楚前面的功能,再高的可用性和性能都是浮云.最后,安全也同样重要.下面将从 服务注册.服务发现.容灾和高可用三个大方面来回答这些问题的主流做法. 引言 聊起微服务的服务注册与发现,很多人立马就会脱口而出 zk.etcd.consul.eureka 这些组件,进而聊到 CAP 如何取舍,性能如何,高可用和容灾是怎么实现的. 在这之前,站在组件使用者的角度,我想先问这么几个问题: 注册的