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 服务实例IPport 服务实例portnamespaceId 命名空间IDweight 权重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_coderesult["message"] = "服务注册Nacos失败,失败原因:{error_message}".format(error_message=response.text)return resultif response.text != 'ok':result["code"] = 500result["message"] = "服务注册Nacos失败,失败原因:{error_message}".format(error_message=response.text)return resultreturn result
def service_beat():"""服务心跳,默认是5s一次:return:nacos的服务心跳接口有以下参数serviceName 服务名ip 服务实例IPport 服务实例PORTnamespaceId 命名空间IDgroupName 分组名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 指南