Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >Python | Python 使用 consul 做服务发现

Python | Python 使用 consul 做服务发现

作者头像
双鬼带单
发布于 2021-03-19 06:39:11
发布于 2021-03-19 06:39:11
4.9K10
代码可运行
举报
文章被收录于专栏:CodingToDieCodingToDie
运行总次数:0
代码可运行

Python 使用 consul 做服务发现


前言一、目标二、使用步骤1. 安装 consul2. 服务注册定义基类具体实现3. 服务发现基类定义具体实现4. 测试用例总结参考


前言

前面一章讲了微服务的一些优点和缺点,那如何做到

谨以此文,献给远方的老铁

一、目标

二、使用步骤

1. 安装 consul

我们可以直接使用官方提供的二进制文件来进行安装部署,其官网地址为 https://www.consul.io/downloads

在这里插入图片描述 下载后为可执行文件,在我们开发试验过程中,可以直接使用 consul agent -dev 命令来启动一个单节点的 consul

在启动的打印日志中可以看到 agent: Started HTTP server on 127.0.0.1:8500 (tcp), 我们可以在浏览器直接访问 127.0.0.1:8500 即可看到如下

在这里插入图片描述 这里我们的 consul 就启动成功了

2. 服务注册

在网络编程中,一般会提供项目的 IP、PORT、PROTOCOL,在服务治理中,我们还需要知道对应的服务名、实例名以及一些自定义的扩展信息

在这里使用 ServiceInstance 接口来规定注册服务时必须的一些信息

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
class ServiceInstance:

    def __init__(self, service_id: str, host: str, port: int, secure: bool = False, metadata: dict = None,
                 instance_id: str = None):
        self.service_id = service_id
        self.host = host
        self.port = port
        self.secure = secure
        self.metadata = metadata
        self.instance_id = instance_id

    def get_instance_id(self):
        return

定义基类

在上面规定了需要注册的服务的必要信息,下面定义下服务注册和剔除的方法,方便以后实现 Eureka 和 Redis 的方式

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import abc


class ServiceRegistry(abc.ABC):

    @abc.abstractmethod
    def register(self, service_instance: ServiceInstance):
        pass

    @abc.abstractmethod
    def deregister(self):
        pass

具体实现

因为 consul 提供了 http 接口来对consul 进行操作,我们也可以使用 http 请求方式进行注册和剔除操作,具体 http 接口文档见 https://www.consul.io/api-docs, consul 并没有提供 Python 语言的实现,这里使用 python-consul 来访问 consul

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import consul


class ConsulServiceRegistry(ServiceRegistry):
    _consul = None
    _instance_id = None

    def __init__(self, host: str, port: int, token: str = None):
        self.host = host
        self.port = port
        self.token = token
        self._consul = consul.Consul(host, port, token=token)

    def register(self, service_instance: ServiceInstance):
        schema = "http"
        if service_instance.secure:
            schema = "https"
        check = consul.Check.http(f'{schema}:{service_instance.host}:{service_instance.port}/actuator/health', "1s",
                                  "3s", "10s")
        self._consul.agent.service.register(service_instance.service_id,
                                            service_id=service_instance.instance_id,
                                            address=service_instance.host,
                                            port=service_instance.port,
                                            check=check)
        self._instance_id = service_instance.instance_id

    def deregister(self):
        if self._instance_id:
            self._consul.agent.service.deregister(service_id=self._instance_id)
            self._instance_id = None

3. 服务发现

在服务发现中,一般会需要两个方法

  1. 获取所有的服务列表
  2. 获取指定的服务的所有实例信息

基类定义

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import abc


class DiscoveryClient(abc.ABC):

    @abc.abstractmethod
    def get_services(self) -> list:
        pass

    @abc.abstractmethod
    def get_instances(self, service_id: str) -> list:
        pass

具体实现

来实现一下

这里是简化版,所以一些参数直接写死了,如果需要可以适当修改

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import consul


class ConsulServiceDiscovery(DiscoveryClient):

    _consul = None

    def __init__(self, host: str, port: int, token: str = None):
        self.host = host
        self.port = port
        self.token = token
        self._consul = consul.Consul(host, port, token=token)

    def get_services(self) -> list:
        return self._consul.catalog.services()[1].keys()

    def get_instances(self, service_id: str) -> list:
        origin_instances = self._consul.catalog.service(service_id)[1]
        result = []
        for oi in origin_instances:
            result.append(ServiceInstance(
                oi.get('ServiceName'),
                oi.get('ServiceAddress'),
                oi.get('ServicePort'),
                oi.get('ServiceTags'),
                oi.get('ServiceMeta'),
                oi.get('ServiceID'),
            ))
        return result

4. 测试用例

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import unittest
from random import random


class MyTestCase(unittest.TestCase):
    def test_consul_register(self):
        instance = ServiceInstance("abc", "127.0.0.1", 8000, instance_id=f'abc_{random()}')

        registry = ConsulServiceRegistry("127.0.0.1", 8500)
        discovery = ConsulServiceDiscovery("127.0.0.1", 8500)
        registry.register(instance)
        print(discovery.get_services())
        print(discovery.get_instances("abc"))
        self.assertEqual(True, True)


if __name__ == '__main__':
    unittest.main()

总结

通过使用 consul api 我们可以简单的实现基于 consul 的服务发现,在通过结合 http rpc 就可简单的实现服务的调用,下面一章来简单讲下 go 如何发起 http 请求,为我们做 rpc 做个铺垫

具体代码见 https://github.com/zhangyunan1994/gimini

参考

  • https://www.consul.io/api-docs
  • https://github.com/hashicorp/consul/tree/master/api
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2021-02-27,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 双鬼带单 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
1 条评论
热度
最新
代码地址路径为: https://github.com/zhangyunan1994/gemini
代码地址路径为: https://github.com/zhangyunan1994/gemini
回复回复点赞举报
推荐阅读
编辑精选文章
换一批
Go | Go 使用 consul 做服务发现
我们可以直接使用官方提供的二进制文件来进行安装部署,其官网地址为 https://www.consul.io/downloads
双鬼带单
2020/10/29
2.9K0
Go | Go 使用 consul 做服务发现
文末送书|Python写的微服务如何融入Spring Cloud体系?
最近这几天工作和生活都比较忙碌,公众号没有得到及时的更新,还希望各位读者朋友们多多包涵!作为这几天文章更新不及时的弥补,小码哥决定出血给大家赠送一本我的好朋友"@程序员小灰"撰写的《漫画算法》这本书,没有关注“无敌码农”公众号的,关注后回复“小糖糖”就可以参与活动了!已经关注的直接回复“小糖糖”就可以了!
用户5927304
2019/07/30
2.9K0
文末送书|Python写的微服务如何融入Spring Cloud体系?
consul服务中心
2.1. 添加 maven 依赖 2.2. springboot 配置 application.yml 注册服务
suveng
2019/12/20
2.3K0
Java | Spring Cloud 是如何实现服务治理的
Spring Cloud Commons 之服务治理浅析服务注册服务发现健康检测Spring Cloud Consul 实现实现 ServiceRegistry 功能总结参考
双鬼带单
2021/03/19
9290
Prometheus 通过 consul 实现自动服务发现
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
哎_小羊
2019/11/12
12.4K0
consul 的 HTTP API 和使用方法
建议读者先学习笔者的另一篇文章 学习搭建 Consul 服务发现与服务网格-有丰富的示例和图片,这样了解 consul 大体的结构和学习集群搭建,摸清 consul 的服务注册发现配置方法。
痴者工良
2021/04/26
3.7K1
服务发现之consul的介绍、部署和使用
微服务的框架体系中,服务发现是不能不提的一个模块。我相信了解或者熟悉微服务的童鞋应该都知道它的重要性。这里我只是简单的提一下,毕竟这不是我们的重点。我们看下面的一幅图片:
sunsky
2020/08/20
1.7K0
使用Consul做服务发现的若干姿势
作者:波斯码 来源:http://blog.bossma.cn/consul/consul-service-register-and-discovery-style/?hmsr=toutiao.io&
程序猿DD
2018/12/06
4.6K0
Consul 的服务发现客户端
Consul是一个用于服务注册与发现的开源工具,它支持多种客户端语言,例如Go、Java、Python等。
堕落飞鸟
2023/04/18
1.2K0
grafana+prometheus+Consul自动服务发现监控平台
一、安装prometheus 安装包下载地址:https://prometheus.io/download/
@凌晨
2020/12/07
2.1K0
.Net微服务实践(五)[服务发现]:Consul介绍和环境搭建
在上篇.Net微服务实践(四)[网关]:Ocelot限流熔断、缓存以及负载均衡中介绍Ocelot的限流、熔断、缓存、负载均衡以及其他一些特性,Ocelot的基本配置和功能都已经介绍完了。本篇我们会介绍服务发现Consul.
我思故我在
2020/04/14
7800
Prometheus+Consul 自助服务发现(六)
Consul 是基于 GO 语言开发的开源工具,主要面向分布式,服务化的系统提供服务注册、服务发现和配置管理的功能。Consul 提供服务注册/发现、健康检查、Key/Value存储、多数据中心和分布式一致性保证等功能。通过 Prometheus 实现监控,当新增一个 Target 时,需要变更服务器上的配置文件,即使使用 file_sd_configs 配置,也需要登录服务器修改对应 Json 文件,会非常麻烦。不过 Prometheus 官方支持多种自动服务发现的类型,其中就支持 Consul。
Kevin song
2023/02/22
1.6K0
Prometheus+Consul 自助服务发现(六)
微服务 - Consul微服务注册中心
上篇说到构建良好的架构,依托于基础设施建设(自动化测试、自动化部署、服务监控,服务发现、配置中心等等),决定成败的往往是基础设施建设,所以从搭建一个注册中心和配置中心开始我们新一阶段的启程。
stark张宇
2023/04/20
5860
Consul 服务发现和配置
Service discovery and configuration made easy. Distributed, highly available, and datacenter-aware.
WindWant
2020/09/11
7030
注册中心选型以及Spring Cloud 是如何实现服务发现的
CAP原则又称CAP定理,指的是在一个分布式系统中,一致性(Consistency)、可用性(Availability)、分区容错性(Partition tolerance),这三个要素最多只能同时实现两点,不可能三者兼顾。
双鬼带单
2021/09/29
5800
Api网关Kong集成Consul做服务发现及在Asp.Net Core中的使用
  Api网关我们之前是用 .netcore写的 Ocelot的,使用后并没有完全达到我们的预期,花了些时间了解后觉得kong可能是个更合适的选择。
乔达摩@嘿
2021/06/01
2.5K0
Api网关Kong集成Consul做服务发现及在Asp.Net Core中的使用
Consul+Prometheus系统监控之注册发现
缘起 前面几篇文章分别对系统服务、MySql以及Redis相关软件做了监控预警,但是大家有没有发现,在prometheus.yml里配置需要监听的服务时,我们需要按服务名手动写入,也就是说以后每增加一个服务,就得手动修改此配置,并重启promethues服务。 那么我们如何做到动态的监听服务呢?相信不少接触过分布式框架Dubbo的小伙伴们都知道它是靠zookeeper做注册监听的,最近比较流行的Spring Cloud Netflix的Eureka,consul也是比较常用的注册中心。 参考官方文档con
小柒2012
2018/04/13
6.9K1
Consul+Prometheus系统监控之注册发现
Consul+Prometheus系统监控之注册发现
前面几篇文章分别对系统服务、MySql以及Redis相关软件做了监控预警,但是大家有没有发现,在prometheus.yml里配置需要监听的服务时,我们需要按服务名手动写入,也就是说以后每增加一个服务,就得手动修改此配置,并重启promethues服务。 那么我们如何做到动态的监听服务呢?相信不少接触过分布式框架Dubbo的小伙伴们都知道它是靠zookeeper做注册监听的,最近比较流行的Spring Cloud Netflix的Eureka,consul也是比较常用的注册中心。
小柒2012
2019/12/09
9220
Consul+Prometheus系统监控之注册发现
Consul与微服务的集成
Consul可以与多种编程语言和框架集成,包括Java、Go、Python、Node.js、Spring Boot和.NET等。它提供了丰富的客户端库和API,以便服务可以与Consul进行交互。
堕落飞鸟
2023/04/18
4740
自己动手实现 Go 的服务注册与发现(上)
通过服务发现与注册中心,可以很方便地管理系统中动态变化的服务实例信息。与此同时,它也可能成为系统的瓶颈和故障点。因为服务之间的调用信息来自于服务注册与发现中心,当它不可用时,服务之间的调用可能无法正常进行。因此服务发现与注册中心一般会多实例部署,提供高可用性和高稳定性。
aoho求索
2021/12/04
1.2K0
自己动手实现 Go 的服务注册与发现(上)
相关推荐
Go | Go 使用 consul 做服务发现
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文