官方文档https://nacos.io/zh-cn/docs/quick-start-docker.html,然而自己部署的时候遇到了“Database not set”的问题。有可能是因为环境中已经部署了3306的mysql服务导致的。(虽然我尝试修改了naco的docker-compose,但是未果,遂放弃)
安装过程参考文章:https://blog.csdn.net/ilvjiale/article/details/129417768
docker pull nacos/nacos-server
mkdir -p /mydata/nacos/logs/ #新建logs目录
mkdir -p /mydata/nacos/conf/ #新建conf目录
docker run -p 8848:8848 --name nacos -d nacos/nacos-server
docker cp nacos:/home/nacos/logs/ /mydata/nacos/
docker cp nacos:/home/nacos/conf/ /mydata/nacos/
docker rm -f nacos
## 随后去数据库中创建表nacos_config,并执行下列sql
## https://github.com/alibaba/nacos/blob/master/config/src/main/resources/META-INF/nacos-db.sql
## 然后重启
docker run -d --name nacos -p 8848:8848 -p 9848:9848 -p 9849:9849 --privileged=true -e JVM_XMS=256m -e JVM_XMX=256m -e MODE=standalone -v /mydata/nacos/logs/:/home/nacos/logs -v /mydata/nacos/conf/:/home/nacos/conf/ --restart=always nacos/nacos-server
修改配置文件
# 在宿主机中修改application.properties文件
vim /mydata/nacos/conf/application.properties
# 修改下列内容
spring.datasource.platform=mysql
db.num=1
## 这里我是用docker的内置网络进行DNS解析,因此使用的image的名字mysql_server来进行关联的
db.url.0=jdbc:mysql://mysql_server:3306/nacos-config?characterEncoding=utf8&connectTimeout=1000&socketTimeout=30000&autoReconnect=true&useUnicode=true&useSSL=false&serverTimezone=UTC
db.user=root
db.password=root
进入页面
http://ip:8848/nacos/index.html
直接访问http://ip:8848/nacos/index.html是裸奔,因此要配置账号密码
参考https://nacos.io/zh-cn/docs/v2/guide/user/auth.html,https://juejin.cn/post/7281201055627493413
### If turn on auth system:
nacos.core.auth.enabled=false
### If turn on auth system:
nacos.core.auth.system.type=nacos
nacos.core.auth.enabled=true
然后再去http://ip:8848/nacos/index.html就有密码了。默认是nacos/nacos
SpringBoot
Flask
以下代码均通过v1的接口实现。接口文档参考“https://nacos.io/zh-cn/docs/v2/guide/user/open-api#1.2”
通过request的方法实现注册
import requests
from flask import Flask, make_response
import time
# 用于异步处理心跳检测
import threading
import json
app = Flask(__name__)
IP = "XXXXXXX"
PORT = 5030
data = {
"serviceName": "pythonservice",
"ip": IP,
'port': PORT,
'namespaceId': 'XXXX',
'USERNAME': 'XXXX',
'PASSWORD': 'XXXX',
"metadata": json.dumps({"version":"v1.0", "message": "测试数据"})
}
print(data)
# 服务注册
def service_register():
url = "http://127.0.0.1:8848/nacos/v1/ns/instance"
res = requests.post(url, data=data)
print(res.text, type(res))
print("完成注册")
# 心跳检测
def service_beat():
while True:
url = "http://127.0.0.1:8848/nacos/v1/ns/instance/beat"
res = requests.put(url, data=data)
print(f"心跳检测中... 响应状态码: {res.status_code}", res.text)
time.sleep(5)
@app.route('/test', methods=['GET'])
def test():
response = make_response("部署成功")
return response
if __name__ == '__main__':
service_register()
# 创建定时器,每5秒调用一次my_function函数
timer = threading.Timer(5.0, service_beat)
# 启动定时器
timer.start()
app.run('0.0.0.0', PORT)
request方法实现服务发现
由于这里是get请求,不接受data
要把用户名密码放到header中,并且url要带上serviceName和namespaceId
import requests
# 服务发现
def service_find():
headers = {
'USERNAME': 'xxxx',
'PASSWORD': 'xxxx'
}
url = "http://xxxxx:8848/nacos/v1/ns/instance/list?serviceName=pythonservice&namespaceId=xxxxx"
res = requests.get(url, headers=headers)
print(res.text, type(res), res)
if __name__ == '__main__':
service_find()
通过sdk的方式完成注册(由于python的库版本太老,并且不支持新版naco,因此放弃)