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
    portint服务实例port
    namespaceId字符串命名空间ID
    weightdouble权重
    enabledboolean是否上线
    healthyboolean是否健康
    metadata字符串扩展信息
    clusterName字符串集群名
    serviceName字符串服务名
    groupName字符串分组名
    ephemeralboolean是否临时实例
  • 返回参数:

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

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

    查看详细信息

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正常
  • 请求测试:

将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 指南

Logo

瓜分20万奖金 获得内推名额 丰厚实物奖励 易参与易上手

更多推荐