• python flask服务如何注册到nacos


    shigen坚持更新文章的博客写手,擅长Java、python、vue、shell等编程语言和各种应用程序、脚本的开发。记录成长,分享认知,留住感动。
    个人IP:shigen

    背景

    shigen之前遇到了一个服务,需要结合nacos+ Spring security实现服务的负载均衡。其中最为重要的就是python服务自己注册到nacos上,趁着闲暇时间,来研究了一番。

    nacos官网中提到了【其它语言的sdk】:

    nacos其它语言SDK

    点击【python】就跳转到了GitHub。

    官网内容

    看着好像也没说的很清楚,我们自己来调用SDK实现一下。

    代码实现

    首先确保nacos服务启动了,shigen这里用的docker-compose的方式启动的:

    nacos启动

    对应的docker-compose文件如下:

    version: '3'
    services:
      nacos-standalone:
        image: nacos/nacos-server:v2.1.2-slim
        container_name: nacos-server
        ports:
          - 8848:8848
          - 9848:9848
          - 9849:9849
        environment:
          - 'MODE=standalone'
          - 'TIME_ZONE=Asia/Shanghai'
        volumes:
          - ./conf:/home/nacos/conf
          - ./logs:/home/nacos/logs
          - ./data:/home/nacos/data
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

    代码可以参考shigen的gitee-cloud-patform

    首先下载依赖:

    pip install nacos-sdk-python
    
    • 1

    安装依赖

    依赖安装完成,就可以继续写代码了,主要是注册上服务和发送心跳。

    最开始,shigen尝试了官方的SDK,总是出现异常,最后看了一下官方的描述:

    Supported Python version:

    Python 2.7 Python 3.6 Python 3.7

    Supported Nacos version

    Nacos 0.8.0 ~ 1.3.2

    好家伙,我忽视了nacos的版本,注意,我的nacos是这样的:nacos/nacos-server:v2.1.2-slim,直接2.0+,不适配。害得我折腾了一下午,最后和伙伴出去跑步了,心里一想,我真是钻牛角尖。服务的注册也不是我的首要任务,实在不行,用官方的API照样可以注册上去。

    于是,回来尝试了一下:

    import sys
    # 用于异步处理心跳检测
    import threading
    import time
    from typing import NoReturn
    
    import requests
    from flask import Flask, jsonify, request
    
    app = Flask(__name__)
    
    
    # 服务注册
    def service_register(service_name: str, ip: str, port: int):
        url = f"http://127.0.0.1:8848/nacos/v1/ns/instance?serviceName={service_name}&ip={ip}&port={port}"
        res = requests.post(url)
        print(f"完成注册: {res.status_code}")
    
    
    # 心跳检测
    def service_beat(service_name: str, ip: str, port: int) -> NoReturn:
        while True:
            url = f"http://127.0.0.1:8848/nacos/v1/ns/instance/beat?serviceName={service_name}&ip={ip}&port={port}"
            res = requests.put(url)
            print(f"心跳检测中... 响应状态码: {res.status_code}")
            time.sleep(5)
    
    
    @app.route('/get_server_info', methods=['GET'])
    def get_server_info():
        server_ip = request.host.split(':')[0]
        server_port = request.host.split(':')[1]
    
        response = {'ip': server_ip, 'port': server_port}
        return jsonify(response)
    
    
    if __name__ == '__main__':
        if len(sys.argv) > 1:
            port = int(sys.argv[1])
        else:
            port = 10000
        service_name = 'python-server'
        ip = '127.0.0.1'
        service_register(service_name, ip, port)
        # 5 秒后执行心跳检测
        threading.Timer(5, service_beat(service_name, ip, port)).start()
        app.run()
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49

    参考文章:spring boot和flask整合nacos

    特意的留了一个命令行参数作为服务的端口号,这样的话,副本数就很好控制了。

    控制台操作一下:

    服务的启动

    注意:服务在第一次启动注册之后,需要不断的对nacos发送心跳,表明服务的存活。

    最后实现的效果是这样的:

    实现效果

    那接下来就是网关层的调用和负载均衡了,这个下期再讲。

    与shigen一起,每天不一样!

  • 相关阅读:
    马踏棋盘的贪心算法
    es搜索功能——DSL查询文档——搜索结果处理
    js事件循环EventLoop
    7-2 时间换算
    图像练习-答题卡opencv(02)
    10个前端开发常用的速查网站
    目标检测 图像处理 计算机视觉 工业视觉
    vue前后端端口不一致解决方案
    记录因Sharding Jdbc批量操作引发的一次fullGC
    边缘计算:下一个技术前沿
  • 原文地址:https://blog.csdn.net/weixin_55768452/article/details/136724835