1. 程式人生 > 其它 >微服務中的服務註冊與發現-consul講解

微服務中的服務註冊與發現-consul講解

什麼是服務註冊和發現及技術選型

  1. 服務註冊和發現

  2. 基於配置檔案的微服務弊端
    當系統併發過高的時候,我們新增加了一個使用者服務,那麼其它需要呼叫使用者服務的服務都需要重新部署,非常的麻煩,而且容易出錯

  3. 註冊中心
    穩定性、一致性、是不是分散式

  4. 服務註冊與發現流程圖

  5. 服務註冊與發現的技術選型

consul的安裝和配置

  1. consul支援dns查詢功能

  2. windows下dig命令下載官網
    https://phoenixnap.com/kb/dig-windows

  3. windows下dig命令發起dns解析
    dig "@127.0.0.1" -p 8600 consul.service.consul SRV


    後續我們可以通過這個dns發現服務也行,或者通過給的url介面發現這個服務也行

服務註冊和登出

  1. consul的API介面

  2. 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服務的健康檢查

github 參考文件

  • gprc健康檢查重要點
  1. 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中剔除掉
        }
  1. 一定要確保網路是通的
  2. 一定要確保srv服務監聽的埠是對外可訪問的
  3. 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第三方庫實現服務註冊

github原始碼
python-consul2官方文件

  1. 安裝
    pip install python-consul2
  2. 註冊服務和登出服務
點選檢視程式碼
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)

  1. 獲取所有服務
rsp = c.agent.services()
print(rsp)
  1. 獲取我們想要的服務(過濾指定的服務)
    官方文件
點選檢視程式碼
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)

  1. 獲取所有服務
def service_list():
    """過濾服務"""
    url = "http://127.0.0.1:8500/v1/agent/services"
    rsp = requests.get(url).json()  # .json()方法將其轉換為dict型別
    print(rsp)