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

OSCHINA-MIRROR/keijack-python-eureka-client

Присоединиться к Gitlife
Откройте для себя и примите участие в публичных проектах с открытым исходным кодом с участием более 10 миллионов разработчиков. Приватные репозитории также полностью бесплатны :)
Присоединиться бесплатно
Это зеркальный репозиторий, синхронизируется ежедневно с исходного репозитория.
Клонировать/Скачать
Внести вклад в разработку кода
Синхронизировать код
Отмена
Подсказка: Поскольку Git не поддерживает пустые директории, создание директории приведёт к созданию пустого файла .keep.
Loading...
README.md

«us-east-1e.mydomaintest.netflix.net»

Then, you can define TXT records recursively for each zone similar to the following (if more than one hostname per zone, space delimit):

```txt.us-east-1c.mydomaintest.netflix.net = "ec2-552-627-568-165.compute-1.amazonaws.com" "ec2-368-101-182-134.compute-1.amazonaws.com"
txt.us-east-1d.mydomaintest.netflix.net = "ec2-552-627-568-170.compute-1.amazonaws.com"
txt.us-east-1e.mydomaintest.netflix.net = "ec2-500-179-285-592.compute-1.amazonaws.com"```  

И затем вы можете создать клиент следующим образом:  

```python
import py_eureka_client.eureka_client as eureka_client
eureka_client.init(eureka_domain="mydomaintest.netflix.net",
                region="us-east-1",
                zone="us-east-1c",
                app_name="python_module_1", 
                instance_port=9090,
                data_center_name="Amazon")```  

Вы можете указать протокол, базовую аутентификацию и контекстный путь вашего сервера Eureka отдельно, а не устанавливать их в URL.  

```python
import py_eureka_client.eureka_client as eureka_client
eureka_client.init(eureka_domain="mydomaintest.netflix.net",
                region="us-east-1",
                zone="us-east-1c",
                eureka_protocol="https",
                eureka_basic_auth_user="keijack",
                eureka_basic_auth_password="kjauthpass",
                eureka_context="/eureka/v2",
                app_name="python_module_1", 
                instance_port=9090)```  
или  
```python
import py_eureka_client.eureka_client as eureka_client
eureka_client.init(eureka_server="your-eureka-server-peer1,your-eureka-server-peer2",
                eureka_protocol="https",
                eureka_basic_auth_user="keijack",
                eureka_basic_auth_password="kjauthpass",
                eureka_context="/eureka/v2",
                app_name="python_module_1", 
                instance_port=9090)```  

*Об экземпляре IP и имени хоста*:  

Если вы используете дата-центр Amazon, py-eureka-client попытается использовать local-ipv4 и local-hostname, полученные от службы метаданных Amazon. В других случаях py-eureka-client будет использовать первый непетлевой IP-адрес и имя хоста из вашего сетевого интерфейса.  

Также вы можете явно указать оба этих поля или только одно из них:  

```python
eureka_client.init(eureka_server="your-eureka-server-peer1,your-eureka-server-peer2",
                eureka_protocol="https",
                eureka_basic_auth_user="keijack",
                eureka_basic_auth_password="kjauthpass",
                eureka_context="/eureka/v2",
                app_name="python_module_1", 
                instance_ip="192.168.10.168",
                instance_host="my-py-component.mydomian.com",
                instance_port=9090)```  
В некоторых случаях у вас может быть подключено более одного интерфейса, например, если вы запускаете своё приложение в контейнере Docker. В этом случае вы можете указать сеть через instance_ip_network для использования контейнера IP и хоста. Вы можете использовать:  

```python
eureka_client.init(eureka_server="your-eureka-server-peer1,your-eureka-server-peer2",
                eureka_protocol="https",
                eureka_basic_auth_user="keijack",
                eureka_basic_auth_password="kjauthpass",
                eureka_context="/eureka/v2",
                app_name="python_module_1", 
                instance_ip_network="192.168.10.0/24",
                instance_port=9090)```  
Если вы хотите получить только IP и указать хост самостоятельно, попробуйте:  

```python
import py_eureka_client.netint_utils as netint_utils

# вы можете получить только ip
ip = netint_utils.get_first_non_loopback_ip("192.168.10.0/24")
host = "my-py-component.mydomian.com"

eureka_client.init(eureka_server="your-eureka-server-peer1,your-eureka-server-peer2",
                eureka_protocol="https",
                eureka_basic_auth_user="keijack",
                eureka_basic_auth_password="kjauthpass",
                eureka_context="/eureka/v2",
                app_name="python_module_1", 
                instance_ip=ip ### Error Callback

Вы можете указать функцию обратного вызова при инициализации клиента Eureka. Когда в фазах `register`, `discover` или `status update` возникают ошибки, функция обратного вызова будет вызвана, чтобы сообщить вам об этом. Функция обратного вызова вызывается только тогда, когда все URL-адреса сервера Eureka испробованы и не работают.

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

```python
def on_err(err_type: str, err: Exception):
    if err_type in (eureka_client.ERROR_REGISTER, eureka_client.ERROR_DISCOVER):
        eureka_client.stop()
    else:
        print(f"{err_type}::{err}")

your_rest_server_port = 9090
eureka_client.init(eureka_server="http://your-eureka-server-peer1,http://your-eureka-server-peer2",
                                app_name="python_module_1",
                                instance_port=your_rest_server_port,
                                on_error=on_err)

### Вызов удалённой службы

После `init` клиента Eureka это самый простой способ сделать сервис:

```python
import py_eureka_client.eureka_client as eureka_client

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

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

Также можно использовать его асинхронную версию:

import py_eureka_client.eureka_client as eureka_client

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

Метод do_service автоматически попытается использовать другие узлы, когда один узел вернёт ошибку HTTP, пока один из них не добьётся успеха или не будут испробованы все узлы.

Если вы хотите обрабатывать все вызовы служб, вы можете использовать функцию walk_nodes:

import py_eureka_client.eureka_client as eureka_client

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

# результат - это результат, который вы возвращаете в функции walk_using_your_own_urllib
try:
    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:
    # Если все узлы недоступны, возникает ошибка HTTPError.
    print(e)

Также предоставляется асинхронная версия:

import py_eureka_client.eureka_client as eureka_client

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

res = await eureka_client.walk_nodes_async("OTHER-SERVICE-NAME", "/service/context/path",
                          walker=walk_using_your_own_urllib)
### Стратегии высокой доступности

Существует несколько стратегий HA при использовании клиента обнаружения. Они есть:

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

В вашей функции `init` вы можете указать одну из вышеперечисленных стратегий:

```python
import py_eureka_client.eureka_client as eureka_client
# General **Метод init**

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,
                   ha_strategy=eureka_client.HA_STRATEGY_STICK)

**Использование другого HTTP-клиента**

Вы можете использовать другой HTTP-клиент для подключения к серверу Eureka и другим сервисам вместо встроенного метода urlopen. Это может быть полезно, если вы используете HTTPS-соединения через самозаверяющие сертификаты.

С версии 0.11.0 методы класса `py_eureka_client.http_client.HttpClient` определены как асинхронные. Теперь вы можете использовать некоторые асинхронные HTTP-библиотеки, такие как aiohttp.

Для этого вам следует:

1. (Необязательно) В большинстве сценариев вам также следует написать класс, который наследуется от `py_eureka_client.http_client.HttpResponse`, по причине того, что класс `py_eureka_client.http_client.HttpResponse` оборачивает `http.client.HTTPResponse`, который может не возвращаться третьими HTTP-библиотеками.
2. Написать класс, унаследованный от класса `HttpClient` в `py_eureka_client.http_client`.
3. Переписать метод `urlopen` в вашем классе. Этот метод должен возвращать подкласс `py_eureka_client.http_client.HttpResponse`, который является классом-обёрткой, содержащим свойства `raw_response` и `body_text`.
4. Установить собственный объект HttpClient в `py_eureka_client.http_client` с помощью `py_eureka_client.set_http_client`:

```python
import py_eureka_client.http_client as http_client

# 1. Класс, унаследованный `py_eureka_client.http_client.HttpResonse`

class MyHttpResponse(http_client.HttpResponse):

    def __init__(self, raw_response):
        """
        "Этот необработанный ответ будет возвращён при передаче `response_object` в функции `do_service`.
        """
        self.raw_response = raw_response

    @property
    def body_text(self):
        txt = ""
        """
        "Прочитать текст тела из `self.raw_response`"
        """
        return txt

# 2. Класс, унаследованный `py_eureka_client.http_client.HttpClient`.
class MyHttpClient(http_client.HttpClient):

    # 3. Перепишите метод `urlopen` в своём классе.
    # Если вы хотите вызвать исключение, убедитесь, что это исключение является `http_client.HTTPError` или `http_client.URLError`.     
    async def urlopen(self, request: Union[str, http_client.HttpRequest] = None,
                      data: bytes = None, timeout: float = None) -> http_client.HttpResponse:
        res = await your_own_http_client_lib.do_the_visit(request, data, timeout)
        return MyHttpResponse(res)
        # Вы можете проанализировать свой ответный объект здесь и установить `body_text` в `http_client.HttpResponse`, тогда вы можете игнорировать наследование `http_client.HttpResponse`.
        # body_txt = parse_res_body(res)
        # http_res = http_client.HttpResponse()
        # http_res.raw_response = res
        # http_res.body_text = body_text
        # return http_res
            

# 4. Установите свой класс в `py_eureka_client.http_client`. 
http_client.set_http_client(MyHttpClient())

Логгер

По умолчанию логгер пытается записать логи на экран. Вы можете указать обработчик логгера для записи в файл.

import py_eureka_client.logger as logger
import logging

_formatter = logging.Formatter(fmt='[%(asctime)s]-[%(name)s]-%(levelname)-4s: %(message)s')
_handler = logging.TimedRotatingFileHandler("/var/log/py-eureka-client.log", when="midnight", backupCount=7)
_handler.setFormatter(_formatter)
_handler.setLevel("INFO")

logger.set_handler(_handler)

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

logger.add_handler(_handler)

Комментарии ( 0 )

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

Введение

Это клиент Eureka, написанный на Python, который поддерживает регистрацию и обнаружение сервисов, что позволяет удобно интегрировать ваш код в Spring Cloud. Развернуть Свернуть
Python
MIT
Отмена

Обновления

Пока нет обновлений

Участники

все

Недавние действия

Загрузить больше
Больше нет результатов для загрузки
1
https://gitlife.ru/oschina-mirror/keijack-python-eureka-client.git
git@gitlife.ru:oschina-mirror/keijack-python-eureka-client.git
oschina-mirror
keijack-python-eureka-client
keijack-python-eureka-client
main