Это клиент Eureka, написанный на языке Python. С его помощью можно легко интегрировать его с другими компонентами Spring Cloud.
Python 3.7 и выше. С версии 0.9.0 не поддерживается Python 2.
async def
.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, а именно:
Если вам нужно изменить эти стратегии, вы можете указать соответствующую стратегию при инициализации службы обнаружения:
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]
# ... Скомпонуйте ссылку доступа и выполните удалённый вызов.
По умолчанию компонент использует встроенный urllib.request для выполнения HTTP-запросов. Вы можете использовать другие HTTP-библиотеки для доступа к данным. Это особенно полезно в сценариях с самоподписанными сертификатами HTTPS.
Начиная с версии 0.11.0, все методы базового класса Httplient определены как async def, что упрощает интеграцию с некоторыми асинхронными библиотеками ввода-вывода, такими как aiohttp.
Чтобы использовать собственный HTTP-клиент, выполните следующие действия:
Вы можете оставить комментарий после Вход в систему
Неприемлемый контент может быть отображен здесь и не будет показан на странице. Вы можете проверить и изменить его с помощью соответствующей функции редактирования.
Если вы подтверждаете, что содержание не содержит непристойной лексики/перенаправления на рекламу/насилия/вульгарной порнографии/нарушений/пиратства/ложного/незначительного или незаконного контента, связанного с национальными законами и предписаниями, вы можете нажать «Отправить» для подачи апелляции, и мы обработаем ее как можно скорее.
Опубликовать ( 0 )