Вы все еще вручную записываете отношения вызова службы (интерфейса) между микрослужбами?

Spring Cloud
Вы все еще вручную записываете отношения вызова службы (интерфейса) между микрослужбами?

предисловие

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

На предприятиях, использующих микросервисную архитектуру, чтобы разделить бизнес-модули, бизнес лучше развивать итеративно. Это нормально, когда весь бизнес компании делится на 10 модульных сервисов. А с непрерывным развитием бизнеса количество сервисов и количество интерфейсов в каждом сервисе постоянно увеличивается, а разработчики постоянно меняются. Представьте себе, что 10 модульных сервисов относительно взаимозависимы и вызывают друг друга, а связь похожа на сеть. Особенно доработан до уровня интерфейса, он более громоздкий. Если полагаться на то, что разработчики будут помнить головой, боюсь, это нереально. То, как точно узнать, какие службы вызываются службой, какие службы вызываются службой, очень помогает для стабильности службы, обслуживания кода, оценки воздействия и итерации бизнеса.

// money资金服务
@RequestMapping("/getById")
public Dto getById(Long id) {
    User user = userFeignClient.getUserById(userId); // 调用user用户服务
    return productFeignClient.getById(userId); // 调用product商品服务
}

Приведенный выше код является распространенным кодом в корпоративных веб-приложениях, использующих Spring Cloud для реализации межсервисных вызовов. Итак, для этого кода вы думаете о следующем сценарии.

Следующие диалоги часто встречаются у разработчиков программного обеспечения. Сценарий 1: Кто вызывает мой интерфейс?

小张:小王,user服务的获取getById()接口被哪些服务使用呢?
小王:原来业务不多的时候,我还知道。现在业务太复杂了,调用方太多,我已经记不清了。
小张:那么办,我接了一个需求,涉及原接口逻辑的变动,这个接口的调用方都要评估下影响面
小王:那你只能挨个负责服务的同事问下了
小张:太麻烦了,时间都用在寻找调用方上了

Драгоценное время RD каждый день тратится на поддержание взаимосвязи между сервисами и интерфейсами и, таким образом, теряет энергию, направленную на специализацию в более ценном бизнесе.

Сценарий 2: Мои сервисы вызывают какие интерфейсы чьих сервисов

小姚:小修,我接手了一个product服务,为了尽量熟悉,我需要知道这个服务都依赖哪些服务,调了哪些接口?
小修:这个···,服务有个wiki文档,你看看呢
小姚:我看了,最新的更新时间是一年前
小修:恐怕你只能翻代码了
小姚:一行一行看代码!,我嚎哭

Драгоценное время RD каждый день тратится на поддержание связи вызовов между сервисами и интерфейсами, и по этой причине теряется время на изучение новых технологий.

Смысл этого проекта состоит в том, чтобы собрать и отобразить взаимосвязь вызова службы, особенно взаимосвязь вызова интерфейса в службе. Ценность, приносимая этим, заключается в хорошем избегании памяти, которую разработчик может пропустить только через разум в прошлом, зная, что память будет уменьшаться. Поэтому полезно подготовиться к оценке воздействия, связанного с последующей разработкой требований. Тем самым поддерживая стабильность проекта онлайн и повышая доступность сервиса. так,微服务梳子Он предназначен для автоматического установления связи между сервисами в рамках микросервисной системы.

бизнес фон

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

Что может дать этот проект

Для того, чтобы точно знать информацию о вызывающем абоненте сервиса и его интерфейс, для этой цели и создан этот проект. С помощью этого проекта вы можете точно и в режиме реального времени получить вызов (использование) сервисов и их интерфейсов, чтобы помочь вам подготовиться к рабочей нагрузке по оценке повторяющихся требований и своевременно подсчитать вышестоящих поставщиков сервисов, затронутых изменениями, поэтому как улучшить Улучшается ремонтопригодность и стабильность сервиса, а также повышается доступность.

Основная цель

Цель этого проекта состоит в том, чтобы предоставить простые и быстрые учебные пособия, чтобы действительно помочь в стоимости обслуживания службы в режиме микросервисной архитектуры, уменьшить память RD о путанице с мобилизацией интерфейса службы и, конечно же, попрощаться с большой ямой. оставленный предшественниками.

Диаграмма архитектуры

Компонент зависит

Этот проект реализован на базе Spring Cloud openfeign (текущая версия: 2.1.0.RELEASE)

Принцип реализации

Этот проект разделен на три части: одна предназначена для сбора и отправки информации о звонках, другая — для получения и хранения информации о звонках, а третья — для отображения взаимосвязи между вызовами микрослужб в диаграммах. Передача (отправка и получение) информации о вызове осуществляется с помощьюCQRS模型

  1. Сбор и передача информации о звонках

Эта часть функцииmicroservice-comb-infrastructureМодуль отвечает. Конкретный принцип заключается в том, что динамический прокси используется для сбора информации о звонках, а проксиLoadBalancerFeignClientкласс, который дает возможность собирать информацию о вызове при вызове службы; иkafkaОтправьте информацию о вызове получателю. Собранная логика через кастомInvocationHandler:LoadBalancerFeignClientInvocationHandlerГотово, отправьте информацию о звонке черезMessageSenderКласс завершен.

  1. Получение и сохранение информации о звонках

Эта часть функцииmicroservice-comb-serverМодуль отвечает. Используйте kafka для получения информации о звонках, а затем сохраните информацию на жестком диске. В настоящее время она сохраняется в базе данных mysql. Позже она будет использовать динамическое переключение для поддержки mongodb и других методов.

  1. Диаграмма, показывающая взаимосвязь вызова микросервисов

Эта часть функцииmicroservice-comb-adminМодуль отвечает. Используйте js и другие компоненты диаграммы, чтобы отобразить диаграмму взаимосвязи вызовов службы.Получив имя службы/имя интерфейса, вы можете узнать: информацию о вызывающем абоненте интерфейса службы A, когда он вызывается, и количество вызовов в Период времени. Но поскольку я не знаком с интерфейсными технологиями, я пока отложил этот модуль.

Структура проекта

module description
microservice-comb-admin Инфографический дисплей вызова, основной компонент
microservice-comb-base Базовый набор инструментов, основные компоненты
microservice-comb-infrastructure Сбор и передача информации о звонках, суперосновной компонент
microservice-comb-server Получение и сохранение информации о звонках, основной компонент
microservice-comb-example Используйте пример для имитации бизнес-сервиса

Специальное примечание:

microservice-comb-example包含三个module。
microservice-comb-server-a 模拟业务方服务,此模块引用microservice-comb-server-b-sdk
microservice-comb-server-b 模拟业务方服务
microservice-comb-server-b-sdk 模拟业务方服务sdk,此模块引用microservice-comb-infrastructure

Пример использования

Как использовать

легко использовать

Всего в два этапа:

  • подготовка ресурсов
  • ссылка SDK

подготовка ресурсов

  1. кафка. Отправка и получение информации о звонках с помощью kafka, поэтому вам нужно быть готовым к запускуkafka server, и положиkafkaЗамените информацию о конфигурации информацией о вашем сервере `kafka.

  2. MySQL. тебе нужно иметьmysql数据库.database: server_infoИ строительство стола

CREATE TABLE `server_invocation` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT 'id,自增',
  `from_application` varchar(100) NOT NULL DEFAULT '' COMMENT '服务调用方',
  `to_application` varchar(100) NOT NULL DEFAULT '' COMMENT '服务被调用方',
  `from_path` varchar(100) NOT NULL DEFAULT '' COMMENT '服务调用方接口路径path',
  `to_path` varchar(100) NOT NULL DEFAULT '' COMMENT '服务被调用方接口路径path',
  `method` varchar(32) NOT NULL DEFAULT '' COMMENT '请求方式: GET POST',
  `ctime` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
  `utime` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  `creator_id` bigint(20) NOT NULL DEFAULT '0' COMMENT '操作人id',
  `create_name` varchar(32) NOT NULL DEFAULT '' COMMENT '操作人姓名',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='服务调用信息表';
  1. eureka

Этот проект основан на системе весенних облаков, поэтому требуется эврика.

ссылка SDK

После импорта исходного кода заархивируйте микросервисную гребенчатую инфраструктуру через mvn, а затем импортируйте ее в проект приложения. цитировать оригиналspring-cloud-starter-openfeignЗамените модуль или сервис ссылкойmicroservice-comb-infrastructure,следующим образом

<dependency>
    <groupId>com.skyler.cobweb</groupId>
    <artifactId>microservice-comb-infrastructure</artifactId>
    <version>1.0.0-SNAPSHOT</version>
</dependency>

Имитация реального боя

Для удобства использования и доступа. Модуль microservice-comb-example предоставляет модель архитектуры микросервиса, имитирующую реальную компанию.Microservice-comb-example содержит три подмодуля, и общая взаимосвязь

microservice-comb-server-a依赖microservice-comb-server-b-sdk,因为microservice-comb-server-a需要调用sdk的feign接口
microservice-comb-server-b依赖microservice-comb-server-b-sdk,因为microservice-comb-server-b的controller实现sdk的feign接口
microservice-comb-server-b-sdk依赖microservice-comb-infrastructure
  1. запустить службу

Последовательно запускайте следующие службы

microservice-comb-server-a
microservice-comb-server-b
microservice-comb-server
  1. Доступ к интерфейсу microservice-comb-server-a

skyler@192 ~  curl -X GET 'localhost:9090/combo/getById?id=10'

  1. Просмотр данных базы данных

как показано на рисунке

Имитация реальных приложений

Функция microservice-comb-admin отвечает за отображение диаграммы взаимосвязи вызовов между сервисами базы данных. Потому что я не изучал передовые технологии. Эффект временно отображается путем запроса sql

Просмотр отношения вызова между несколькими службами в рамках микрослужбы

  • Запросить, какие сервисы и интерфейсы вызывает microservice-comb-server-b
SELECT * FROM server_invocation WHERE from_application = 'microservice-comb-server-b' 

Результат показан ниже,20200314235524.png

Примечание. Отображение поддержки точно соответствует методу вызова, просто добавьте условный запрос.

  • Запросить, какие сервисы и интерфейсы вызывают microservice-comb-server-b
SELECT * FROM server_invocation WHERE to_application = 'microservice-comb-server-b' 

Результат выглядит следующим образом20200314235605.png

адрес проекта:microservice-comb