微服务中的服务注册与发现-consul讲解
什么是服务注册和发现及技术选型
-
服务注册和发现
-
基于配置文件的微服务弊端
当系统并发过高的时候,我们新增加了一个用户服务,那么其它需要调用用户服务的服务都需要重新部署,非常的麻烦,而且容易出错
-
注册中心
稳定性、一致性、是不是分布式 -
服务注册与发现流程图
-
服务注册与发现的技术选型
consul的安装和配置
-
consul支持dns查询功能
-
windows下dig命令下载官网
https://phoenixnap.com/kb/dig-windows
-
windows下dig命令发起dns解析
dig "@127.0.0.1" -p 8600 consul.service.consul SRV
后续我们可以通过这个dns发现服务也行,或者通过给的url接口发现这个服务也行
服务注册和注销
-
consul的API接口
-
python中实现consul的服务注册与注销-http
点击查看代码
import requests
def register(name, id, address, port):
"""注册服务
参考官网:https://www.consul.io/api-docs/agent/service#register-service
"""
# url = "http://127.0.0.1:8500/v1/agent/service/register"
headers = {"contentType": "application/json"}
ret = requests.put(url, headers=headers, json={
"Name": name,
"Id": id,
"Tags": ["bobby", "srv"],
"Address": address,
"Port": port,
})
if ret.status_code == 200:
print("服务注册成功")
else:
print(f"服务注册失败:{ret.status_code}")
def deregister(id):
"""注销服务
参考官网:https://www.consul.io/api-docs/agent/service#deregister-service
"""
# url = f"http://127.0.0.1:8500/v1/agent/service/deregister/{id}"
rsp = requests.put(url)
print(rsp.status_code)
if rsp.status_code == 200:
print("注销服务成功")
else:
print("注销服务失败")
if __name__ == '__main__':
# 1. 注册服务(同时添加健康检查)
# 健康检查可以指定多长时间检查一次,服务多长时间不健康就从注册中心剔除掉等等
# 健康检查参考文档:consul.io/api/agent/check#check-agent-http-api
register("mxshop-srv", "mxshop-srv", "127.0.0.1", 50051)
# 2. 注销服务
deregister("mxshop-srv")
服务注册的健康检查-http
点击查看代码
import requests
def register(name, id, address, port):
"""注册服务
参考官网:https://www.consul.io/api-docs/agent/service#register-service
"""
url = "http://127.0.0.1:8500/v1/agent/service/register"
headers = {"contentType": "application/json"}
ret = requests.put(url, headers=headers, json={
"Name": name,
"Id": id,
"Tags": ["bobby", "srv"],
"Address": address,
"Port": port,
# 配置健康检查
"Check": {
"HTTP": f"http://{address}:{port}/health",
"Timeout": "5s", # 最小值是1分钟,我们设置5s的意思就是让它采用默认值:1分钟
"Interval": "5s", # 发起健康检查的频率
"DeregisterCriticalServiceAfter": "15s", # 服务停机后,Timeout + DeregisterCritical 这两个时间的和,才会真正将服务从consul中剔除掉
}
})
if ret.status_code == 200:
print("服务注册成功")
else:
print(f"服务注册失败:{ret.status_code}")
def deregister(id):
"""注销服务
参考官网:https://www.consul.io/api-docs/agent/service#deregister-service
"""
url = f"http://127.0.0.1:8500/v1/agent/service/deregister/{id}"
rsp = requests.put(url)
print(rsp.status_code)
if rsp.status_code == 200:
print("注销服务成功")
else:
print("注销服务失败")
if __name__ == '__main__':
# 1. 注册服务(同时添加健康检查)
# 健康检查可以指定多长时间检查一次,服务多长时间不健康就从注册中心剔除掉等等
# 健康检查参考文档:consul.io/api/agent/check#check-agent-http-api
register("mxshop-web", "mxshop-web", "127.0.0.1", 8021)
# 2. 注销服务
# deregister("mxshop-web")
配置grpc服务的健康检查
- gprc健康检查重要点
- Check配置 GRPC GRPCUseTLS
"Check": {
# "HTTP": f"http://{address}:{port}/health", # 注册HTTP健康检查
"GRPC": f"{ip}:{port}", # 注册GRPC健康检查
"GRPCUseTLS": False, # 指定是否为GRPC检查使用TLS,默认为False
"Timeout": "5s", # 最小值是1分钟,我们设置5s的意思就是让它采用默认值:1分钟
"Interval": "5s", # 发起健康检查的频率
"DeregisterCriticalServiceAfter": "15s", # 服务停机后,Timeout + DeregisterCritical 这两个时间的和,才会真正将服务从consul中剔除掉
}
- 一定要确保网络是通的
- 一定要确保srv服务监听的端口是对外可访问的
- GRPC属性一定要自己填写
python配置grpc的健康检查
点击查看代码
import requests
def register_http(name, id, address, port):
"""注册服务
参考官网:https://www.consul.io/api-docs/agent/service#register-service
"""
# url = "http://consul.mayanan.cn/v1/agent/service/register"
url = "http://127.0.0.1:8500/v1/agent/service/register"
headers = {"contentType": "application/json"}
ret = requests.put(url, headers=headers, json={
"Name": name,
"Id": id,
"Tags": ["bobby", "srv"],
"Address": address,
"Port": port,
# 配置健康检查
"Check": {
"HTTP": f"http://{address}:{port}/health", # 注册HTTP健康检查
"Timeout": "5s", # 最小值是1分钟,我们设置5s的意思就是让它采用默认值:1分钟
"Interval": "5s", # 发起健康检查的频率
"DeregisterCriticalServiceAfter": "15s", # 服务停机后,Timeout + DeregisterCritical 这两个时间的和,才会真正将服务从consul中剔除掉
}
})
if ret.status_code == 200:
print("服务注册成功")
else:
print(f"服务注册失败:{ret.status_code}")
def register_grpc(name, id, address, port):
"""注册服务
参考官网:https://www.consul.io/api-docs/agent/service#register-service
"""
# url = "http://consul.mayanan.cn/v1/agent/service/register"
url = "http://127.0.0.1:8500/v1/agent/service/register"
headers = {"contentType": "application/json"}
ret = requests.put(url, headers=headers, json={
"Name": name,
"Id": id,
"Tags": ["bobby", "srv"],
"Address": address,
"Port": port,
# 配置健康检查
"Check": {
"GRPC": f"{address}:{port}", # 注册GRPC健康检查
"GRPCUseTLS": False, # 指定是否为GRPC检查使用TLS,默认为False
"Timeout": "5s", # 最小值是1分钟,我们设置5s的意思就是让它采用默认值:1分钟
"Interval": "5s", # 发起健康检查的频率
"DeregisterCriticalServiceAfter": "15s", # 服务停机后,Timeout + DeregisterCritical 这两个时间的和,才会真正将服务从consul中剔除掉
}
})
if ret.status_code == 200:
print("服务注册成功")
else:
print(f"服务注册失败:{ret.status_code}")
def deregister(id):
"""注销服务, http和grpc注销服务是一样的
参考官网:https://www.consul.io/api-docs/agent/service#deregister-service
"""
# url = f"http://consul.mayanan.cn/v1/agent/service/deregister/{id}"
url = f"http://127.0.0.1:8500/v1/agent/service/deregister/{id}"
rsp = requests.put(url)
print(rsp.status_code)
if rsp.status_code == 200:
print("注销服务成功")
else:
print("注销服务失败")
if __name__ == '__main__':
# 1. 注册服务(同时添加健康检查)
# 健康检查可以指定多长时间检查一次,服务多长时间不健康就从注册中心剔除掉等等
# 健康检查参考文档:consul.io/api/agent/check#check-agent-http-api
# 注册http服务
# register_http("mxshop-web", "mxshop-web", "127.0.0.1", 8021)
# 注册grpc服务
register_grpc("mxshop-srv", "mxshop-srv", "127.0.0.1", 50051)
# 2. 注销服务(http或grpc均可)
# deregister("mxshop-srv")
python第三方库实现服务注册
- 安装
pip install python-consul2
- 注册服务和注销服务
点击查看代码
import consul
c = consul.Consul()
address, port = "127.0.0.1", 50051
check = {
"GRPC": f"{address}:{port}", # 注册GRPC健康检查
"GRPCUseTLS": False, # 指定是否为GRPC检查使用TLS,默认为False
"Timeout": "5s", # 最小值是1分钟,我们设置5s的意思就是让它采用默认值:1分钟
"Interval": "5s", # 发起健康检查的频率
"DeregisterCriticalServiceAfter": "15s", # 服务停机后,Timeout + DeregisterCritical 这两个时间的和,才会真正将服务从consul中剔除掉
}
# 注册服务
rsp = c.agent.service.register(
"mxshop-srv",
service_id="mxshop-srv",
address=address,
port=port,
tags=["mxshop"],
check=check
)
print(rsp)
# 注销服务
# rsp = c.agent.service.deregister(service_id="mxshop-srv")
# print(rsp)
- 获取所有服务
rsp = c.agent.services()
print(rsp)
- 获取我们想要的服务(过滤指定的服务)
官方文档
点击查看代码
def filter_service(name: str):
"""过滤服务"""
url = "http://127.0.0.1:8500/v1/agent/services"
params = { # 过滤条件
"filter": f'Service == "{name}"'
}
print("过滤条件是:", params)
rsp = requests.get(url, params=params).json() # .json()方法将其转换为dict类型
print(rsp)
- 获取所有服务
def service_list():
"""过滤服务"""
url = "http://127.0.0.1:8500/v1/agent/services"
rsp = requests.get(url).json() # .json()方法将其转换为dict类型
print(rsp)
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· .NET10 - 预览版1新功能体验(一)