【Python】Python注册微服务到nacos

时间:2024-03-11 13:50:17

Python注册微服务到Nacos

1.Nacos部署

  • github 的nacos项目的发布页(Releases · alibaba/nacos · GitHub ),选择所要下载的nacos版本,在nacos下方的assets中选择安装包进行下载。

  • 解压nacos安装包到指定目录。

    tar -zxvf nacos-server-2.0.3.tar.gz
  • 初始化Nacos数据库。

    -- 需要先选择数据库
    -- 初始化sql脚本位于解压的 nacos/conf 目录下
    use nacosdb;
    source /euansu/apps/nacos/conf/nacos-mysql.sql;
  • 修改nacos配置文件。

    # nacos/conf/application.properties
    # 默认的web路由
    server.servlet.contextPath=/nacos
    # web服务端口
    server.port=8848
    # 数据库配置
    db.url.0=jdbc:mysql://127.0.0.1:3306/nacos?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true&useUnicode=true&useSSL=false&serverTimezone=UTC
    db.user.0=nacos
    db.password.0=nacos
  • 启动Nacos服务,这里只是以单机模式启动Nacos。

    bin/startup.sh -m standalone

    启动完成之后,访问页面进行验证。

    如果没有在配置文件中修改密码,这里的用户名和密码是:nacos/nacos,直接登录即可。

2.Nacos验证

Nacos注册接口(注册一个实例服务到Naocs上)

  • 请求地址:/nacos/v1/ns/instance
  • 请求方式:POST

  • 请求参数:

    名称 类型 是否必选 描述
    ip 字符串 服务实例IP
    port int 服务实例port
    namespaceId 字符串 命名空间ID
    weight double 权重
    enabled boolean 是否上线
    healthy boolean 是否健康
    metadata 字符串 扩展信息
    clusterName 字符串 集群名
    serviceName 字符串 服务名
    groupName 字符串 分组名
    ephemeral boolean 是否临时实例
  • 返回参数:

    返回代码 描述 语义
    400 Bad Request 客户端请求中的语法错误
    403 Forbidden 没有权限
    404 Not Found 无法找到资源
    500 Internal Server Error 服务器内部错误
    200 OK 正常
  • 请求测试:

    请求接口后,在Nacos页面出现注册的服务,如下:

    查看详细信息

Nacos服务检测接口:

  • 请求地址:/nacos/v1/ns/instance/beat
  • 请求方式:PUT

  • 请求参数:

    名称 类型 是否必选 描述
    serviceName 字符串 服务名
    ip 字符串 服务实例IP
    port int 服务实例PORT
    namespaceId 字符串 命名空间ID
    groupName 字符串 分组名
    ephemeral boolean 是否临时实例
    beat JSON格式字符串 实例心跳内容
  • 响应参数:

    响应代码 描述 语义
    400 Bad Request 客户端请求中的语法错误
    403 Forbidden 没有权限
    404 Not Found 无法找到资源
    500 Internal Server Error 服务器内部错误
    200 OK 正常
  • 请求测试:

将Python服务注册到Nacos上至少需要两个接口,一个是实例注册接口,另一个则是心跳接口,只进行了注册,则会出现如下的情况:

时间稍长之后,注册的服务也会消失。

因此,需要按照心跳时间请求nacos服务检测接口,默认是5s。

3.Python注册Nacos服务

Python这里可以通过写一个脚本实现Nacos服务的注册,实现代码如下:

import time
import requests
​
# 心跳时间
HEARTBEATS_TIME = 5
# Nacos地址
NACOS_URL = 'http://xx.xx.xx.xx:8848/nacos'
# 服务注册路由
NACOR_REGISTER_URL = 'v1/ns/instance'
# 心跳检测路由
NACOS_HEARTBEATS_URL = 'v1/ns/instance/beat'
​
​
# Nacos服务注册
def service_register():
    """
    Nacos服务注册的接口有以下参数:
    ip          服务实例IP
    port        服务实例port
    namespaceId 命名空间ID
    weight      权重
    enabled     是否上线
    healthy     是否健康
    metadata    扩展信息
    clusterName 集群名
    serviceName 服务名
    groupName   分组名
    ephemeral   是否临时实例
    :return:
    """
    # 返回参数
    result = {
        "code": 200,
        "message": "success"
    }
    # 构造请求参数
    params = {
        'serviceName': 'python-service',
        'ip': 'xx.xx.xx.xx',
        'port': 8845
    }
    response = requests.post(
        "{NACOS_URL}/{NACOR_REGISTER_URL}".format(NACOS_URL=NACOS_URL, NACOR_REGISTER_URL=NACOR_REGISTER_URL),
        params=params)
    if response.status_code != 200:
        result["code"] = response.status_code
        result["message"] = "服务注册Nacos失败,失败原因:{error_message}".format(error_message=response.text)
        return result
    if response.text != 'ok':
        result["code"] = 500
        result["message"] = "服务注册Nacos失败,失败原因:{error_message}".format(error_message=response.text)
        return result
    return result
​
​
def service_beat():
    """
    服务心跳,默认是5s一次
    :return:
    nacos的服务心跳接口有以下参数
    serviceName 服务名
    ip          服务实例IP
    port        服务实例PORT
    namespaceId 命名空间ID
    groupName   分组名
    ephemeral   是否临时实例
    beat        实例心跳内容
    """
    # 构造请求参数
    params = {
        "serviceName": "python-service",
        'ip': 'xx.xx.xx.xx',
        'port': 8845
    }
    while True:
        response = requests.put(
            "{NACOS_URL}/{NACOS_HEARTBEATS_URL}".format(NACOS_URL=NACOS_URL, NACOS_HEARTBEATS_URL=NACOS_HEARTBEATS_URL),
            params=params)
        print("已注册服务,执行心跳服务,续期服务响应状态: {status_code}".format(status_code=response.status_code))
        time.sleep(HEARTBEATS_TIME)
​
def main():
    # 注册服务
    service_register()
    # 服务检测
    service_beat()
​
​
if __name__ == '__main__':
    main()

实现效果:

4.参考文档

nacos文档:Open API 指南