Skip to content

Python注册微服务到Nacos

1221字约4分钟

Pythonnacos

2024-03-05

1.Nacos部署

  1. github 的nacos项目的发布页(https://github.com/alibaba/nacos/releases ),选择所要下载的nacos版本,在nacos下方的assets中选择安装包进行下载。

    image-20240305205210391

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

    tar -zxvf nacos-server-2.0.3.tar.gz

    image-20240305211324277

  3. 初始化Nacos数据库。

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

    image-20240305212725373

  4. 修改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
  5. 启动Nacos服务,这里只是以单机模式启动Nacos。

    bin/startup.sh -m standalone

    image-20240305213034996

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

    image-20240305213443290

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

    image-20240305213529380

2.Nacos验证

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

    • 请求地址:/nacos/v1/ns/instance

    • 请求方式:POST

    • 请求参数:

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

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

      image-20240305214258554

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

      image-20240305214357819

      查看详细信息

      image-20240305214421602

  2. Nacos服务检测接口:

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

    • 请求方式:PUT

    • 请求参数:

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

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

      image-20240305230339216

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

image-20240305225952016

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

image-20240305214530371

因此,需要按照心跳时间请求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()

实现效果:

image-20240305230209793

image-20240305230230908

4.参考文档

[1] nacos文档 https://nacos.io/zh-cn/docs/open-api.html