python使用consul进行服务注册和发现
一、安装启动consul
1.通过docker快速安装
#获取docker镜像
docker pull consul
2.启动consul
然后就可以启动集群了,这里启动4个Consul Agent,3个Server(会选举出一个leader),1个Client

#启动第1个Server节点,集群要求要有3个Server,将容器8500端口映射到主机8900端口,同时开启管理界面
docker run -d --name=consul1 -p 8900:8500 -e CONSUL_BIND_INTERFACE=eth0 consul agent --server=true --bootstrap-expect=3 --client=0.0.0.0 -ui #启动第2个Server节点,并加入集群
docker run -d --name=consul2 -e CONSUL_BIND_INTERFACE=eth0 consul agent --server=true --client=0.0.0.0 --join 172.17.0.2 #启动第3个Server节点,并加入集群
docker run -d --name=consul3 -e CONSUL_BIND_INTERFACE=eth0 consul agent --server=true --client=0.0.0.0 --join 172.17.0.2 #启动第4个Client节点,并加入集群
docker run -d --name=consul4 -e CONSUL_BIND_INTERFACE=eth0 consul agent --server=false --client=0.0.0.0 --join 172.17.0.2

第1个启动容器的IP一般是172.17.0.2,后边启动的几个容器IP会排着来:172.17.0.3、172.17.0.4、172.17.0.5。
这些Consul节点在Docker的容器内是互通的,他们通过桥接的模式通信。但是如果主机要访问容器内的网络,需要做端口映射。在启动第一个容器时,将Consul的8500端口映射到了主机的8900端口,这样就可以方便的通过主机的浏览器查看集群信息。
二、python服务注册

#pip install python-consul
import consul class Consul(object):
def __init__(self, host, port):
'''初始化,连接consul服务器'''
self._consul = consul.Consul(host, port) def RegisterService(self, name, host, port, tags=None):
tags = tags or []
# 注册服务
self._consul.agent.service.register(
name,
name,
host,
port,
tags,
# 健康检查ip端口,检查时间:5,超时时间:30,注销时间:30s
check=consul.Check().tcp(host, port, "5s", "30s", "30s")) def GetService(self, name):
services = self._consul.agent.services()
service = services.get(name)
if not service:
return None, None
addr = "{0}:{1}".format(service['Address'], service['Port'])
return service, addr if __name__ == '__main__':
host="10.0.0.11" #consul服务器的ip
port="" #consul服务器对外的端口
consul_client=Consul(host,port) name="maple"
host="10.0.0.11"
port=8900
consul_client.RegisterService(name,host,port) check = consul.Check().tcp(host, port, "5s", "30s", "30s")
print(check)
res=consul_client.GetService("maple")
print(res)

#执行效果
{'tcp': '10.0.0.11:8900', 'interval': '5s', 'timeout': '30s', 'DeregisterCriticalServiceAfter': '30s'}
({'ID': 'maple', 'Service': 'maple', 'Tags': [], 'Meta': {}, 'Port': 8900, 'Address': '10.0.0.11', 'Weights': {'Passing': 1, 'Warning': 1}, 'EnableTagOverride': False}, '10.0.0.11:8900')
通过10.0.0.11:8900访问注册后的效果


三、golang服务注册

package main import (
"fmt"
consul "github.com/hashicorp/consul/api"
"strconv"
"strings"
) type Consul struct {
consul *consul.Client
} //服务发现 用来注册自己的服务端口给别的服务器调用和发现其他服务器
func InitConsul(host string, port int) (*Consul) {
config := consul.DefaultConfig()
config.Address = fmt.Sprintf("%s:%d", host, port)
c, err := consul.NewClient(config)
if err != nil {
panic(err)
}
return &Consul{
c,
} } func (c *Consul) RegisterService(Name, Addr string, Port int, Tags ...string) error {
return c.consul.Agent().ServiceRegister(&consul.AgentServiceRegistration{
ID: Name,
Name: Name,
Port: Port,
Tags: Tags,
Address: Addr,
Check: &consul.AgentServiceCheck{
Timeout: "5s",
Interval: "10s",
TCP: fmt.Sprintf("%v:%v", Addr, Port, ),
DeregisterCriticalServiceAfter: "30s",
},
})
} func (c *Consul) GetService(Name string) (service *consul.AgentService, err error) {
service, _, err = c.consul.Agent().Service(Name, &consul.QueryOptions{})
return
} func main() {
var Consul *Consul
//注册consul服务地址
Host:="10.0.0.11"
Port:=8900
Server:="10.0.0.11:8900"
Name:="go_maple"
Consul = InitConsul(Host,Port)
serverHost, err := strconv.Atoi(strings.Split(Server, ":")[1])
if err != nil {
panic(err)
}
err = Consul.RegisterService(Name,Host,serverHost)
if err != nil {
panic(err)
}
//获取服务
res,err:=Consul.GetService("go_maple")
if err != nil {
panic(err)
}
fmt.Println(res)
}


四、通过API的方式获取信息

#http://10.0.0.11:8900/v1/health/service/maple [
{
"Node": {
"ID": "db46c9ad-5c8d-bb9b-0543-9edb48e7bccc",
"Node": "71a1355e94b6",
"Address": "172.17.0.2",
"Datacenter": "dc1",
"TaggedAddresses": {
"lan": "172.17.0.2",
"wan": "172.17.0.2"
},
"Meta": {
"consul-network-segment": ""
},
"CreateIndex": 5,
"ModifyIndex": 9
},
"Service": {
"ID": "maple",
"Service": "maple",
"Tags": [],
"Address": "10.0.0.11",
"Meta": null,
"Port": 8900,
"Weights": {
"Passing": 1,
"Warning": 1
},
"EnableTagOverride": false,
"ProxyDestination": "",
"Proxy": {},
"Connect": {},
"CreateIndex": 4296,
"ModifyIndex": 4296
},
"Checks": [
{
"Node": "71a1355e94b6",
"CheckID": "serfHealth",
"Name": "Serf Health Status",
"Status": "passing",
"Notes": "",
"Output": "Agent alive and reachable",
"ServiceID": "",
"ServiceName": "",
"ServiceTags": [],
"Definition": {},
"CreateIndex": 5,
"ModifyIndex": 5
},
{
"Node": "71a1355e94b6",
"CheckID": "service:maple",
"Name": "Service 'maple' check",
"Status": "passing",
"Notes": "",
"Output": "TCP connect 10.0.0.11:8900: Success",
"ServiceID": "maple",
"ServiceName": "maple",
"ServiceTags": [],
"Definition": {},
"CreateIndex": 4296,
"ModifyIndex": 4297
}
]
}
]


#http://10.0.0.11:8900/v1/health/service/go_maple [
{
"Node": {
"ID": "db46c9ad-5c8d-bb9b-0543-9edb48e7bccc",
"Node": "71a1355e94b6",
"Address": "172.17.0.2",
"Datacenter": "dc1",
"TaggedAddresses": {
"lan": "172.17.0.2",
"wan": "172.17.0.2"
},
"Meta": {
"consul-network-segment": ""
},
"CreateIndex": 5,
"ModifyIndex": 9
},
"Service": {
"ID": "go_maple",
"Service": "go_maple",
"Tags": [],
"Address": "10.0.0.11",
"Meta": null,
"Port": 8900,
"Weights": {
"Passing": 1,
"Warning": 1
},
"EnableTagOverride": false,
"ProxyDestination": "",
"Proxy": {},
"Connect": {},
"CreateIndex": 4725,
"ModifyIndex": 4741
},
"Checks": [
{
"Node": "71a1355e94b6",
"CheckID": "serfHealth",
"Name": "Serf Health Status",
"Status": "passing",
"Notes": "",
"Output": "Agent alive and reachable",
"ServiceID": "",
"ServiceName": "",
"ServiceTags": [],
"Definition": {},
"CreateIndex": 5,
"ModifyIndex": 5
},
{
"Node": "71a1355e94b6",
"CheckID": "service:go_maple",
"Name": "Service 'go_maple' check",
"Status": "passing",
"Notes": "",
"Output": "TCP connect 10.0.0.11:8900: Success",
"ServiceID": "go_maple",
"ServiceName": "go_maple",
"ServiceTags": [],
"Definition": {},
"CreateIndex": 4725,
"ModifyIndex": 4742
}
]
}
]

python使用consul进行服务注册和发现的更多相关文章
- .netcore consul实现服务注册与发现-集群完整版
原文:.netcore consul实现服务注册与发现-集群完整版 一.Consul的集群介绍 Consul Agent有两种运行模式:Server和Client.这里的Server和Clien ...
- .netcore consul实现服务注册与发现-单节点部署
原文:.netcore consul实现服务注册与发现-单节点部署 一.Consul的基础介绍 Consul是HashiCorp公司推出的开源工具,用于实现分布式系统的服务发现与配置.与其他分 ...
- .netcore consul实现服务注册与发现-集群部署
一.Consul的集群介绍 Consul Agent有两种运行模式:Server和Client.这里的Server和Client只是Consul集群层面的区分,与搭建在Cluster之上的应用服务无关 ...
- Spring Cloud Consul 实现服务注册和发现
Spring Cloud 是一个基于 Spring Boot 实现的云应用开发工具,它为基于 JVM 的云应用开发中涉及的配置管理.服务发现.断路器.智能路由.微代理.控制总线.全局锁.决策竞选.分布 ...
- Consul初探-服务注册和发现
前言 经过上一篇的学习,现在已经来到了服务注册发现环节:Consul 的核心功能就是服务注册和发现,Consul 客户端通过将自己注册到 Consul 服务器集群,然后等待调用方去发现服务,实现代理转 ...
- 一个故事,一段代码告诉你如何使用不同语言(Golang&C#)提供相同的能力基于Consul做服务注册与发现
目录 引言 什么是微服务 传统服务 微服务 什么是服务注册与服务发现 为什么要使用不同的语言提供相同的服务能力 服务协调器 服务注册 Golang C#(.NetCore3.1) 服务发现 通过Htt ...
- 简单RPC框架-基于Consul的服务注册与发现
*:first-child { margin-top: 0 !important; } body>*:last-child { margin-bottom: 0 !important; } /* ...
- Spring Cloud Consul使用——服务注册与发现(注册中心)
整理自该文章 一.Consul 服务端接下来我们开发 Consul 的服务端,创建一个 spring-cloud-consul-producer 项目 1.添加依赖包 <dependencies ...
- spring boot2X整合Consul一服务注册与发现
Consul 是HashiCorp公司推出的开源工具,用于实现分布式系统的服务发现与配置. 关键特性: 服务注册/发现 数据强一致性保证 多数据中心 健康检查 key/value存储 1.下载 htt ...
随机推荐
- Hibernate缓存简介和对比、一级缓存、二级缓存详解
一.hibernate缓存简介 缓存的范围分为3类: 1.事务范围(单Session即一级缓存) 事务范围的缓存只能被当前事务访问,每个事务都有各自的缓存,缓存内的数据通常采用相互关联的对象 ...
- msdtc不可用
在使用“经销商园地 网上订单处理程序”等程序时,如果程序报:服务器×××上的MSDTC不可用”,可以按照以下方法进行解决: 在windows控制面版-->管理工具-->服务-->Di ...
- web自动化测试-selenium的三种等待
一.等待的作用 1.在系统的功能运行过程中,所有的内容是需要一定的时间来实现展示, 2.时间耗费长短与网络速度.系统框架设定.接口的执行复杂度有关, 3.因此需要设置缓冲时间,若未设置缓冲时间,容易导 ...
- ReactiveX 学习笔记(30)操作符辨析
RxJava: merge/concat/switch RxJS: merge/concat/switch/exhaust RxSwift: merge/concat/switchLatest mer ...
- H5利用formData来上传文件(包括图片,doc,pdf等各种格式)方法小结!
H5页面中我们常需要进行文件上传,那么怎么来实现这个功能呢??? 我主要谈如下两种方法. (一).传统的form表单方法 <form action="/Home/SaveFile1&q ...
- matrix67中适合程序员的例子
交互式证明:http://www.matrix67.com/blog/archives/6572 捡石子游戏(移动皇后问题):http://www.matrix67.com/blog/archives ...
- BMP文件格式详解(BMP file format)
BMP文件格式,又称为Bitmap(位图),或是DIB(Device-Independent Device,设备无关图),是windows系统中广泛使用的图片文件格式,由于它可以不作任何变换地址保存图 ...
- QML学习(四)——<Text显示>
文本显示是界面开发必不可少的内容,在Qt Quick模块中提供了 Text 项目来进行文本的显示,其中可以使用 font 属性组对文本字体进行设置.这一篇我们来看看它们的具体使用. 使用字体 就像前面 ...
- React_03_ECMAScript6
1.ES6解构赋值 1.1.解构赋值概述 解构赋值是对赋值运算符的扩展. 它是一种针对数组或者对象进行模式匹配,然后对其中的变量进行赋值.在代码书写上简洁且易读,语义更加清晰明了:也方便了复杂对象中数 ...
- 关于 Javascript 学习,有哪些好的博客或者网站推荐?
知乎社区:http://www.zhihu.com/question/19651401 Mozilla开发者网络社区:https://developer.mozilla.org/zh-CN/ moze ...