微服务中的服务注册与发现-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)

posted @ 2022-03-07 11:07  专职  阅读(307)  评论(0编辑  收藏  举报