微服務中的服務註冊與發現-consul講解
阿新 • • 發佈:2022-03-07
什麼是服務註冊和發現及技術選型
-
服務註冊和發現
-
基於配置檔案的微服務弊端
當系統併發過高的時候,我們新增加了一個使用者服務,那麼其它需要呼叫使用者服務的服務都需要重新部署,非常的麻煩,而且容易出錯
-
註冊中心
穩定性、一致性、是不是分散式 -
服務註冊與發現流程圖
-
服務註冊與發現的技術選型
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)