1 В избранное 0 Ответвления 0

OSCHINA-MIRROR/keijack-python-eureka-client

Клонировать/Скачать
README.zh_cn.md 15 КБ
Копировать Редактировать Web IDE Исходные данные Просмотреть построчно История
gitlife-traslator Отправлено 28.11.2024 15:08 e3bf5cc

Клиент Eureka на Python

Это клиент Eureka, написанный на языке Python. С его помощью можно легко интегрировать его с другими компонентами Spring Cloud.

Поддерживаемые версии

Python 3.7 и выше. С версии 0.9.0 не поддерживается Python 2.

Особенности

  • Поддержка регистрации и обнаружения сервисов.
  • Поддержка переключения при отказе.
  • Поддержка DNS-обнаружения.
  • Простой процесс настройки, аналогичный настройке Springboot.
  • Автоматизированные механизмы сердцебиения и состояния компонентов, разработчику не нужно поддерживать сердцебиение.
  • Инкапсулированные интерфейсы для вызова других сервисов, использование аналогично RestTemplate в Spring boot.
  • При вызове других сервисов поддерживается несколько стратегий высокой доступности (HA).
  • Поддерживаются обычные вызовы интерфейсов и асинхронные вызовы async def.
  • Легко заменяемый базовый HTTP-клиент.

Использование

Установка

pip install py_eureka_client

Рекомендуемое использование

Самый простой способ использования:

import py_eureka_client.eureka_client as eureka_client

your_rest_server_host = "192.168.10.106"
your_rest_server_port = 9090
# Следующий код зарегистрирует ваш сервер на сервере Eureka и также начнёт отправлять сердцебиение каждые 30 секунд
eureka_client.init(eureka_server="http://your-eureka-server-peer1,http://your-eureka-server-peer2",
                   app_name="your_app_name",
                   # Текущее имя хоста компонента, необязательный параметр, если не указано, будет автоматически вычислено, если служба и сервер Eureka развёрнуты на одном компьютере, необходимо указать, иначе будет вычислено 127.0.0.1
                   instance_host=your_rest_server_host,
                   instance_port=your_rest_server_port,
                   # Стратегия высокой доступности при вызове других служб, необязательно, по умолчанию случайная
                   ha_strategy=eureka_client.HA_STRATEGY_RANDOM)

В бизнес-коде вы можете вызывать сервисы других компонентов следующим образом:

import py_eureka_client.eureka_client as eureka_client

res = eureka_client.do_service("OTHER-SERVICE-NAME", "/service/context/path",
                               # Тип возврата, по умолчанию строка, можно передать json, если передано значение json, этот метод вернёт объект dict
                               return_type="string")
print("result of other service" + res)
# При остановке сервера вызывается метод отмены Eureka
eureka_client.stop()

Вы также можете напрямую использовать класс EurekaClient.

from py_eureka_client.eureka_client import EurekaClient
client = EurekaClient(eureka_server="http://my_eureka_server_peer_1/eureka/v2,http://my_eureka_server_peer_2/eureka/v2", app_name="python_module_1", instance_port=9090)
await client.start()
res = await client.do_service("OTHER-SERVICE-NAME", "/service/context/path")
print("result of other service" + res)
# Когда сервер выключен:
await client.stop()

Фактически, методы init и связанные с ними являются фасадом (facade) для EurekaClient, а его нижний уровень — это экземпляр объекта EurekaClient. Вы можете получить возвращаемое значение метода init или использовать get_client() для получения этого объекта. Метод init автоматически запускает процесс регистрации и сердцебиения. Если вы используете объект EurekaClient напрямую, вам необходимо явно вызвать методы start() и stop(), чтобы начать и остановить процесс регистрации.

Начиная с версии 0.11.0, все методы, предоставляемые EurekaClient, являются асинхронными (async def), и фасад также предоставляет соответствующие асинхронные версии, которые называются init_async, do_service_async, walk_nodes_async и stop_async.

В следующих документах в качестве примера будут использоваться только фасадные функции, но на самом деле вы можете найти соответствующие методы в классе EurekaClient.

Регистрация сервиса

Наиболее часто используемый метод регистрации:

import py_eureka_client.eureka_client as eureka_client

eureka_server_list = "http://your-eureka-server-peer1,http://your-eureka-server-peer2"
your_rest_server_host = "http://192.168.10.11"
your_rest_server_port = 9090
# Следующие коды зарегистрируют ваш сервер на сервере Eureka и начнут отправлять сердцебиение каждые 30 секунд
eureka_client.init(eureka_server=eureka_server_list,
                                app_name="your_app_name",
                                instance_host=your_rest_server_host,
                                instance_port=your_rest_server_port)

Также можно не передавать параметр instance_host. Если этот параметр не передан, компонент получит IP-адрес из текущей сети.

import py_eureka_client.eureka_client as eureka_client

your_rest_server_port = 9090
# Следующие коды зарегистрируют ваш сервер на сервере Eureka и начнут отправлять сердцебиение каждые 30 секунд
eureka_client.init(eureka_server="http://your-eureka-server-peer1,http://your-eureka-server-peer2",
                                app_name="your_app_name",
                                instance_port=your_rest_server_port)

Если у вас есть несколько зон, вы можете настроить их через параметр eureka_availability_zones. ### Вызов удалённого сервиса

После инициализации eureka client вы можете вызывать удалённый сервис, получая информацию от eureka server.

Самый простой способ вызова:

import py_eureka_client.eureka_client as eureka_client

try:
    res = eureka_client.do_service("OTHER-SERVICE-NAME", "/service/context/path", return_type="string")
    print("result of other service" + res)
except urllib.request.HTTPError as e:
    # Если все узлы недоступны, будет поднято `HTTPError`.
    print(e)

В этом параметре параметр return_type может принимать значение json. Если передано json, то этот интерфейс возвращает объект dict. Если передано response_object, то метод вернёт исходный объект HTTPResponse. Этот параметр также можно не передавать, тогда по умолчанию возвращается содержимое ответа str.

Этот метод также предоставляет асинхронную версию:

import py_eureka_client.eureka_client as eureka_client

res = await eureka_client.do_service_async("OTHER-SERVICE-NAME", "/service/context/path")

Если вы не хотите использовать встроенный HTTP-клиент и предпочитаете использовать другой клиент, вы можете использовать функцию walk_nodes для реализации:

import py_eureka_client.eureka_client as eureka_client

def walk_using_your_own_urllib(url):
    print(url)
    """
    # В соответствии с переданным параметром url вызовите интерфейс Restful, предоставленный другим компонентом, используя выбранную вами библиотеку.
    # Данные, которые вы возвращаете, будут непосредственно возвращены функцией eureka_client.walk_nodes.
    # Если вы обнаружите, что узел, соответствующий заданному url, недоступен, поднимите `urllib.request.HTTPError`(urllib2.HTTPError в python2),
    # Затем функция eureka_client.walk_nodes продолжит поиск других узлов со статусом UP для вызова.
    """

try:
    # `res` — это данные, которые вы вернули в walk_using_your_own_urllib.
    res = eureka_client.walk_nodes("OTHER-SERVICE-NAME", "/service/context/path", walker=walk_using_your_own_urllib)
    print(res)
except urllib.request.HTTPError as e:
    # Если ни один из узлов не вернул правильный результат, будет выброшена вышеуказанная ошибка.
    print(e)

У этого метода также есть асинхронная версия:

import py_eureka_client.eureka_client as eureka_client

def walk_using_your_own_urllib(url):
    print(url)


res = await eureka_client.walk_nodes("OTHER-SERVICE-NAME", "/service/context/path",
                          walker=walk_using_your_own_urllib,
                          on_success=success_callabck,
                          on_error=error_callback)

Высокая доступность

Методы do_service и walk_nodes поддерживают HA (высокая доступность), этот метод пытается получить доступ ко всем узлам, полученным от сервера ereka, пока один из узлов не вернёт данные или пока все узлы не потерпят неудачу.

Существует несколько стратегий HA, а именно:

  • HA_STRATEGY_RANDOM, стратегия по умолчанию, случайным образом выбирает узел.
  • HA_STRATEGY_STICK, после случайного выбора узла он всегда используется до тех пор, пока этот узел не будет удалён или его статус не станет DOWN.
  • HA_STRATEGY_OTHER, всегда использует другой узел, отличный от предыдущего.

Если вам нужно изменить эти стратегии, вы можете указать соответствующую стратегию при инициализации службы обнаружения:

import py_eureka_client.eureka_client as eureka_client

eureka_server_list = "http://your-eureka-server-peer1,http://your-eureka-server-peer2"

eureka_client.init(eureka_server=eureka_server_list,
                   app_name="your_app_name",
                   instance_port=9090,
                   ha_strategy=eureka_client.HA_STRATEGY_OTHER)

Если встроенные стратегии HA не могут удовлетворить ваши потребности, вы можете получить всю библиотеку служб регистрации, чтобы создать свой собственный метод доступа:

import py_eureka_client.eureka_client as eureka_client

client = eureka_client.get_client()
app = client.applications.get_application("OTHER-SERVICE-NAME")
up_instances = app.up_instances
up_instances_same_zone = app.up_instances_in_zone(client.zone)
up_instances_other_zone = app.up_instances_not_in_zone(client.zone)
inst = up_instances[0]

# ... Скомпонуйте ссылку доступа и выполните удалённый вызов.

Использование сторонних HTTP-клиентов

По умолчанию компонент использует встроенный urllib.request для выполнения HTTP-запросов. Вы можете использовать другие HTTP-библиотеки для доступа к данным. Это особенно полезно в сценариях с самоподписанными сертификатами HTTPS.

Начиная с версии 0.11.0, все методы базового класса Httplient определены как async def, что упрощает интеграцию с некоторыми асинхронными библиотеками ввода-вывода, такими как aiohttp.

Чтобы использовать собственный HTTP-клиент, выполните следующие действия:

  1. (Необязательно) В большинстве случаев вам необходимо написать класс, который наследуется от py_eureka_client.http_client.HttpResponse и предоставляет два свойства raw_response и body_text. Среди них raw_response возвращается только тогда, когда do_service передаёт response_object.
  2. Напишите класс, наследуемый от py_eureka_client.http_client.HttpClient.
  3. Перепишите метод urlopen этого класса, чтобы он возвращал объект подкласса py_eureka_client.http_client.HttpResponse.
  4. Установите объект вашего определённого класса в py_eureka_client.http_client.

Опубликовать ( 0 )

Вы можете оставить комментарий после Вход в систему

1
https://api.gitlife.ru/oschina-mirror/keijack-python-eureka-client.git
git@api.gitlife.ru:oschina-mirror/keijack-python-eureka-client.git
oschina-mirror
keijack-python-eureka-client
keijack-python-eureka-client
main