Рубрики
Без рубрики

Если вы явно определите API при использовании микросервисов?

Если у вас есть: проект, который работает десятки или даже сотни микроэвиксов, с несколькими командами … Помечено Python, микросервисы, архитектуру, обсуждение.

Если у тебя есть:

  • Проект, который работает десятки или даже сотни микроэвиксов,
  • с несколькими командами, обрабатывающими разные детали,
  • все связано с кафкой,

Как вы убедитесь, что другие разработчики могут легко поговорить с любым микросервисом?

Я не совсем уверен, если явно определить API – лучшее решение для этой ситуации. В компании, где я работаю, у нас их определены, и есть смешанные чувства.

👍 С одной стороны, явно говоря, что ожидает микросервиса как вход, кажется логичным – другие разработчики должны только заботиться о том, чтобы прочитать это, и не беспокоиться о базовой реализации. И если кто-то издает изменения в их API, он будет четко виден через ChangeLog на этом API. Кроме того, при создании новой функции разработчики могут начать с определения API, которые много помогают в мыслительном процессе.

👎 С другой стороны, создание API, легко читаемое, сложно, и практически невозможно для сценариев со сложными структурами данных. Также требуется много времени, чтобы написать его и поддерживать его. Если разработчик, который написал, это близко, часто гораздо проще просто спросить их о помощи.

Есть два подхода к определению API Я собираюсь прикрыть.

Чтобы сохранить вещи простыми, мы напишем API для микровизации, которые могут добавлять или вычитать n чисел.

Для нашего примера: все, что нам нужно, это два поля:

  • Действие который может быть Добавить/вычесть ,
  • Аргументы который является списком номеров.

Полезная нагрузка по сообщению в микросервис будет выглядеть так:

{
  "action": "ADD",
  "arguments": [4, 8.3, 11]
}

Подход 1: jsonschema

Это подход, с которым у меня самый опыт. Jsonschema Это словарь, который позволяет аннотировать и проверять документы JSON (наши сообщения из кафки).

Все в схеме довольно неясно, поэтому я не буду входить в какие-либо детали.

{
  "type": "object",
  "$schema": "http://json-schema.org/draft-07/schema#",
  "required": [
    "action",
    "arguments"
  ],
  "properties": {
    "action": {
      "type": "string",
      "enum": ["ADD", "SUBTRACT"]
    },
    "arguments": {
      "type": "array",
      "items": {
        "type": "number"
      }
    },
  },
  "additionalProperties": false
}

Я могу только сказать вам, что все становится довольно сумасшедшим, когда есть более сложные структуры данных (> 700 строк).

Чтобы справиться с низкой читаемостью и проверить нашу схему, мы часто пишем примеры для разных случаев. Таким образом, другие разработчики могут посмотреть на них вместо этого и ссылаться на настоящую схему для мелких деталей.

Слияние Этот потрясающий инструмент для отладки схемы это Валидатор схемы JSON . Я использовал его в течение нескольких месяцев.

Подход 2: Python Dataclasses.

Для этого примера мы будем придерживаться Python, но я думаю, что подход применим к большинству объектно-ориентированных языках.

В основном, Python представил Dataclasses В версии 3.7, и они делают определение структур данных проще и очистить.

from dataclasses import dataclass
from enum import Enum
from typing import List


class ActionOptions(Enum):
    ADD = 'ADD'
    SUBTRACT = 'SUBTRACT'


@dataclass
class Message:
    action: ActionOptions
    arguments: List[float]

А потом, используя пакет одарный Мы можем импортировать наше сообщение в эту структуру:

from dacite import from_dict, Config  


data = {"action": "ADD", "args": [4, 8.3, 11]}
message = from_dict(
    Message,
    data,
    config=Config(type_hooks={ActionOptions: ActionOptions}, strict=True)
)

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

Мне нравится идея о том, что Dataclasses может иметь разные методы на них, которые могут соответствовать своему контексту. Легко написать любую пользовательскую проверку, которая не может быть легко выражена иначе. Также возможно прочесть для разработчика, но я еще не знаю.

Недостатком является то, что классы должны быть определены снизу вверх, поэтому Python может ссылаться на все правильно (хотя, возможно, что может быть обойдено). Также одарный все еще находится в активном развитии и нуждается в некоторых улучшениях.

Я действительно с нетерпением жду возможности попробовать второй подход и тестирование битвы. С течением времени я вижу jsonschema как больше о боли, чем облегчение. Хотя, если честно, может быть, я просто не знаю этого достаточно 🙂

Что я хочу услышать, это то, что вы думаете:

  • Вы пишете API для ваших микросервисов?
  • Что подходит работает и что не?
  • Вы знаете, что другие причины, по которым я перечислял два подхода, может быть удивительным/ужасно?

Оригинал: “https://dev.to/mjuraj/should-you-define-apis-when-using-microservices-19l6”