View on GitHub

ITMO-PE

My study notes about Program Engineering at University ITMO

MainPage/SOA/Rubiesh 2

Вариант 1

1. Варианты реализации Service Discovery
服务发现实现方式

Service Discovery (Обнаружение сервисов) — автоматическое обнаружение, отслеживание и контроль состояния устройств и сервисов в компьютерной сети.
服务发现是自动发现、监视和控制计算机网络中设备和服务的状态。

Он создан для того, чтобы с минимальными затратами можно было подключить новое приложение/сервис в уже существующее окружение.
它旨在使新的应用程序/服务能够以最低的成本连接到现有环境。

Основные функции Service Discovery
服务发现的主要功能

Решаемые задачи 需要解决的问题

Варианты реализации:
实施方案:

Это load balancer! (Или 2 способа использования SD load balancer-ом)
这是一个负载均衡器! (或者使用 SD 负载均衡器的两种方法)

Существует два типа SD:
SD 有两种类型:

Примеры реализации:

2. Структура реестра UDDI
UDDI 注册中心结构

UDDI: Universal Description, Discovery and Integration — централизованное хранилище дескрипторов WSDL со стандартизированным API. Спецификация UDDI задает способ публикации Web-служб и поиска информации о них.
UDDI (Universal Description, Discovery, and Integration) 是具有标准化 API 的 WSDL 描述符的集中存储库。UDDI 规范定义了一种发布 Web 服务和查找有关它们的信息的方法。

Спецификация UDDI выполняет две функции:
UDDI 规范有两个功能:

Структура состоит из:
其结构包括:

Белые страницы
白页 | Жёлтые страницы
黄页 | Зелёные страницы
绿页 —————|—————–|—————– Наименование компании.
公司名称 | Список предоставляемых сервисов.
所提供服务列表 | Техническая информация о сервисах.
有关服务的技术信息 Контактная информация.
联系信息 | Индустриальные коды (а-ля ОКВЭД).
工业代码(根据 ОКВЭД) | Спецификация API.
API 规范 Краткое описание.
| Почтовые и географические индексы.
简要描述 | Связывающие шаблоны.
链接模板 Идентификаторы (ИНН / КПП и тд и тп).
标识符(ИНН / КПП 等)

Помимо этого, имеют место четыре типа записей:
此外,还有四种类型的记录:

В состав UDDI входит схема XML для сообщений SOAP, в которой задан набор документов с описанием бизнес-записей и служб, общий набор API для поиска и публикации информации в каталогах, а также API для репликации записей каталогов между равноправными узлами UDDI.
UDDI 包含一个用于 SOAP 消息的 XML 模式,该模式指定了一组描述业务记录和服务的文档、一组用于在目录中搜索和发布信息的通用 API,以及一个用于在 UDDI 对等体之间复制目录记录的 API。

UDDI управляет поиском Web-служб в распределенном реестре бизнес-записей и связанных описаний служб в общем формате XML. Перед публикацией бизнес-объекта и Web-службы в общедоступном реестре необходимо зарегистрировать бизнес-объект в реестре UDDI.
UDDI 在一个分布式业务记录注册表和相关服务描述(采用通用 XML 格式)中管理 Web 服务的发现。将业务对象和 Web 服务发布到公共注册中心之前,必须先在 UDDI 注册中心注册该业务对象。

3. Сервис на JAX-WS реализующий DNS
实现 DNS 的 JAX-WS 服务

package dnsservice.endpoint;

import javax.jws.WebService;
import javax.jws.WebMethod;
import javax.jws.WebParam;

@WebService(name = "DNS")
public class DNS {

    private Map<String, String> dnsRecords = new HashMap<>();

    public void DNS () {};

    @WebMethod
    public String getIPAddress(@WebParam(name = "domain") String domain) {
        return dnsRecords.get(domain);
    }

    @WebMethod
    public String updateIPAddress(@WebParam(name = "domain") String domain,
                                  @WebParam(name = "ip") String ip) {
        dnsRecord.put(domain, ip);
        return dnsRecords.get(domain);
    }
    
    @WebMethod
    public String deleteIPAddress(@WebParam(name = "domain") String domain) {
        //…if contains, .remove(domain)…, else, …
    }
    
    @WebMethod
    public String addIPAddress(@WebParam(name = "domain") String domain,
                               @WebParam(name = "ip") String ip) {
        //…
    }
}

Публикуем сервис:

public class DNSServicePublisher {
    public static void main(String[] args) {
        Endpoint.publish(
                "http://localhost:8080/dns",
                new DNS()
        );
    }
}

Вариант 2

1. Service Discovery на Java EE и его реализации
Java EE 中的服务发现及其实现

JNDI (Java Naming and Directory Interface) — это механизм Service Discovery в Java EE (Jakarta EE), который позволяет находить и получать доступ к распределенным ресурсам, таким как базы данных, EJB-компоненты, очереди сообщений (JMS), удаленные объекты (RMI) и другие.
JNDI(Java Naming and Directory Interface) 是 Java EE(Jakarta EE) 提供的 服务发现机制,用于查找和访问分布式环境中的资源,如 数据库、EJB 组件、消息队列(JMS)、远程对象(RMI) 等。

Все сервисы “by design” регистрируются в JNDI и доступны через CDI
所有“按设计”的服务均在 JNDI 中注册并可通过 CDI 访问

Поиск DataSource через JNDI
通过 JNDI 查找 DataSource

  1. Конфигурация DataSource на сервере (например, WildFly)
    在服务器(如 WildFly)中配置 DataSource

    <subsystem xmlns="urn:jboss:domain:datasources:5.0">
        <datasources>
            <datasource jndi-name="java:/jdbc/MyDS" pool-name="MyDS">
                <connection-url>jdbc:mysql://localhost:3306/mydb</connection-url>
                <driver>postgresql</driver>
                <security>
                    <user-name>postgres</user-name>
                    <password>password</password>
                </security>
            </datasource>
        </datasources>
    </subsystem>
    
  2. Использование JNDI для поиска DataSource в Java
    在 Java 代码中使用 JNDI 查找 DataSource

    public class JNDIDataSourceExample {
        public static void main(String[] args) {
            try {
                Context ctx = new InitialContext();
                DataSource ds = (DataSource) ctx.lookup("java:/jdbc/MyDS"); // 查找 JNDI 绑定的数据源
                Connection conn = ds.getConnection();
                System.out.println("成功连接数据库!");
                conn.close();
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }
    

Поиск компонентов EJB через JNDI
通过 JNDI 查找 EJB 组件

  1. Регистрация EJB на сервере
    在 EJB 服务器端注册 EJB

    @Stateless
    public class HelloServiceBean implements HelloService {
        public String sayHello(String name) {
            return "Hello, " + name;
        }
    }
    
  2. Поиск и вызов EJB через JNDI на клиенте 在客户端通过 JNDI 查找并调用 EJB

    public class EJBClient {
        public static void main(String[] args) {
            try {
                Context ctx = new InitialContext();
                HelloService helloService = (HelloService) ctx.lookup("java:global/MyApp/HelloServiceBean");
                System.out.println(helloService.sayHello("Tolia"));
            } catch (NamingException e) {
                e.printStackTrace();
            }
        }
    }
    

Поиск очереди JMS через JNDI
通过 JNDI 查找 JMS 队列

  1. Определение JMS-ресурса на сервере
    在服务器端定义 JMS 资源

    <jms-destinations>
        <jms-queue name="MyQueue">
            <entry name="java:/jms/queue/MyQueue"/>
        </jms-queue>
    </jms-destinations>
    
  2. Поиск JMS-очереди через JNDI в Java
    在 Java 代码中通过 JNDI 查找 JMS 队列

    public class JNDIJMSExample {
        public static void main(String[] args) {
            try {
                Context ctx = new InitialContext();
                Queue queue = (Queue) ctx.lookup("java:/jms/queue/MyQueue");
                System.out.println("成功找到 JMS 队列:" + queue.getQueueName());
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }
    

Конфигурация сервера приложений может быть распределённой:
应用服务器配置可以分布式:

Если логику “под капотом” реализуют EJB, их можно масштабировать.
如果“底层”逻辑由 EJB 实现,那么它们就可以扩展。

<По идее надо бы раскрыть, но хз че можно вписать>

Различные реализации Java EE предоставляют дополнительные механизмы для реализации Service Discovery. Например, Apache Tomcat имеет свой механизм обнаружения служб, а JBoss предлагает JMX для обнаружения служб. Также есть несколько реализаций Service Discovery на основе JAX-WS.
各种 Java EE 实现提供了用于实现服务发现的附加机制。例如,Apache Tomcat 有自己的服务发现机制,JBoss 提供 JMX 用于服务发现。还有几个基于 JAX-WS 的服务发现实现。

2. Понятие микросервиса. Отличия и сходства от других сервисов.
微服务的概念。与其他服务的区别和相似之处。

Микросервисы – это шаблон сервис-ориентированной архитектуры, в котором приложения создаются как совокупность различных наименьших независимых (или слабо связанных), легко изменяемых модулей - микросервисов.
微服务是一种面向服务的架构模式,其中应用程序构建为不同、较小、独立(或松散耦合)、易于更改的模块集合,称为微服务。

Нет четкой спецификации и стандартна, это больше “идеология”.
没有明确的规范和标准,它更像是一种“意识形态”。

Микросервис - разновидность SOA, но есть различия:
微服务是 SOA 的一种,但有区别:

Критерий
Монолит
单体架构
SOA
Микросервисы
微服务
Разделение
模块划分
Всё в одном приложении
所有功能集中在一个应用中
Сервисы с общей шиной (ESB) 通过企业服务总线(ESB)连接的多个服务
Независимые сервисы
独立的微服务
Связность
耦合度
Жёсткая зависимость
高度耦合
Средняя (ESB)
中等耦合(ESB)
Слабая (REST, gRPC)
低耦合(REST, gRPC)
Масштабируемость
可扩展性
Трудно масштабировать частично
难以进行局部扩展
Частично масштабируемо
可以部分扩展
Горизонтально масштабируемо
水平扩展
Развертывание
部署方式
Обновление всего приложения
需要整体更新应用
Отдельные сервисы, но зависят от ESB
单独部署服务,但依赖 ESB
Полностью независимо
完全独立部署
Технологическая зависимость
技术栈
Единый стек технологий
统一的技术栈
Общий стек внутри SOA
共享 SOA 内部的技术栈
Разные технологии для разных сервисов
每个微服务可以使用不同的技术
Фрагментация данных
数据存储
Одна общая БД
使用一个统一的数据库
Централизованная БД или шина данных
采用集中式数据库或数据总线
У каждого сервиса своя БД
每个服务拥有独立的数据库

Сходства микросервисов с другими сервисами
微服务与其他架构的相似之处

Основные характеристики микросервисов
微服务的主要特点

3. Написать двухтарифный счётчик электроэнергии для интеграции его в ИС-предприятия на JAX-WS
编写双费率电表,以便将其集成到 JAX-WS 上的企业信息系统中

import javax.jws.WebService;
import javax.jws.WebMethod;
import javax.jws.WebParam;

@WebService(name = "ElectricityMeterService")
public class ElectricityMeterService {
    
    @WebMethod
    public double getCurrentPowerConsumption(@WebParam(name = "tariff") int tariff) {
        // Реализация метода
    }
    
    @WebMethod
    public double getTotalPowerConsumption(@WebParam(name = "tariff") int tariff) {
        // Реализация метода
    }
    
    @WebMethod
    public String setTariff(@WebParam(name = "tariff") int tariff) {
        // Реализация метода
    }
    
    @WebMethod
    public String getCurrentTariff(@WebParam(name = "tariff") int tariff) {
        // Реализация метода
    }
    
    @WebMethod
    public GetInformationAboutTariffsRes getInformationAboutTariffs() {
        // Реализация метода
    }
}

Вариант 3

1. Концепция Service Discovery.
服务发现的概念。

Service Discovery (Обнаружение сервисов) — автоматическое обнаружение, отслеживание и контроль состояния устройств и сервисов в компьютерной сети.
服务发现是自动发现、监视和控制计算机网络中设备和服务的状态。

Он создан для того, чтобы с минимальными затратами можно было подключить новое приложение/сервис в уже существующее окружение.
它旨在使新的应用程序/服务能够以最低的成本连接到现有环境。

Основные функции Service Discovery
服务发现的主要功能

Решаемые задачи
需要解决的问题

Два типа SD и варианты реализации см. Вариант 1. Вопрос 1
两种类型的 SD 和实施选项参见 Вариант 1. Вопрос 1

2. Smart endpoints & Dumb pipes в МСА.
微服务架构中的“智能端点&愚蠢管道”

Умные конечные точки и глупые каналы — один из основных принципов архитектуры микросервисов (MSA). Подчеркивается, что бизнес-логика должна быть сосредоточена в микросервисах (умных конечных точках), а каналы связи должны быть максимально простыми (немые каналы).
Smart Endpoints & Dumb Pipes(智能端点 & 愚蠢管道)是微服务架构(MSA,Microservices Architecture)的核心原则之一。它强调业务逻辑应该集中在微服务中(智能端点),而通信管道应尽可能简单(愚蠢管道)。

Smart Endpoints – 智能端点

Умные конечные точки — это сами микросервисы, которые должны:
智能端点指的是微服务自身,它们应该:

Dumb Pipes – 愚蠢管道

Глупые трубы относятся к максимально возможному упрощению каналов связи между службами. Его характеристики:
愚蠢管道指的是尽量简化服务之间的通信通道,其特点:

Традиционный SOA (умные каналы, немые конечные точки)
传统 SOA(智能管道,愚蠢端点)

В архитектуре SOA ESB обрабатывает такие функции, как маршрутизация данных, преобразование, бизнес-логика и аутентификация личности, что делает ESB сложным и трудным для расширения.
在 SOA 架构 中,ESB 处理 数据路由、转换、业务逻辑、身份认证 等功能,导致 ESB 变得复杂且难以扩展。

Пример 示例:

  1. Служба заказов отправляет запрос в ESB.
    订单服务发送请求到 ESB。
  2. ESB анализирует запрос и вызывает службу инвентаризации для проверки инвентаря.
    ESB 解析请求,调用 库存服务 检查库存。
  3. ESB вызывает платежный сервис для обработки логики платежа.
    ESB 调用 支付服务 处理支付逻辑。
  4. После того, как ESB обработает всю бизнес-логику, он возвращает результат заказа.
    ESB 处理完所有业务逻辑后,返回订单结果。

проблемы 问题:

Архитектура микросервисов (умные конечные точки, глупые каналы)
微服务架构(智能端点,愚蠢管道)

В архитектуре микросервисов каждый микросервис обрабатывает собственную бизнес-логику, а коммуникационные конвейеры (такие как REST, gRPC, Kafka) используются только для передачи данных. 在 微服务架构 中,每个微服务自己处理业务逻辑,通信管道(如 REST、gRPC、Kafka)仅用于数据传输。

Пример 示例:

  1. Служба заказов напрямую обращается в Службу инвентаризации для проверки наличия товара на складе.
    订单服务 直接调用 库存服务 检查库存。
  2. Служба заказа напрямую обращается к платежной службе для осуществления платежа.
    订单服务 直接调用 支付服务 进行支付。
  3. Платежный сервис асинхронно уведомляет через Kafka об оплате заказа.
    支付服务 通过 Kafka 异步通知 订单已支付。
  4. Заказать услугу Обновить статус заказа.
    订单服务 更新订单状态。

преимущество 优点:

3. Сервис Jax-ws по менеджменту учащихся.
Jax-ws 学生管理服务。

@WebService(endpointInterface = "shit.soa.StudentManagmentService")
public class StudentManagmentServiceImpl implements StudentManagmentService {
    
    @Inject
    private StudentManagmentRepository rep;
    
    @WebMehtod(operationName = "getAllStudents")
    @WebResult(name="student_list_dto")
    public StudentsListDTO getAllStudents(@WebParam(name="get_students_req_dto")
                                          GetAllStudentsReqDTO req) {
        return new StudentsListDTO().getStudents().addAll(rep.getStudents());
    }
    
    @WebMehtod(operationName = "getStudent")
    @WebResult(name="student")
    public Student getStudent(@WebParam(name="get_student_req_dto") GetStudentReqDTO req) {
        return rep.getStudent(req.getId)
    }
    
    @WebMehtod(operationName = "addStudent")
    @WebResult(name="student")
    public Student addStudent(@WebParam(name="add_student_req_dto") AddStudentReqDTO req) {
        return rep.addStudent(req.getName, req.getGroup, ...);
    }
    
    @WebMehtod(operationName = "updateStudent")
    @WebResult(name="student")
    public Student updateStudent(@WebParam(name="update_student_req_dto") UpdateStudentReqDTO req) {
        return rep.updateStudent(req.getId, req.getName, req.getGroup, ...);
    }
    
    //...
}

Вариант 4

1. Service Discovery в решениях на базе Spring Cloud Netflix
Spring Cloud Netflix 解决方案中的服务发现

Spring Cloud Netflix - Бандл для построения SOA-систем на базе Spring Cloud и стека Netflix OSS:
Spring Cloud Netflix - 基于 Spring Cloud 和 Netflix OSS 堆栈构建 SOA 系统的软件包:

В экосистеме Spring Cloud Netflix обнаружение сервисов является основной частью архитектуры микросервисов. Он позволяет экземплярам служб динамически регистрироваться и находить друг друга во время выполнения без жесткого кодирования адресов служб.
在 Spring Cloud Netflix 生态系统中,服务发现(Service Discovery) 是微服务架构的核心部分。它允许服务实例在运行时 动态注册 和 查找 彼此,而无需硬编码服务的地址。

Spring Cloud Netflix предоставляет client-side SD - Eureka.
Spring Cloud Netflix 提供客户端 SD - Eureka。

Основные компоненты Service Discovery
服务发现的核心组件

Напомним, что client-side discovery - клиент запрашивает информацию о доступе к доступным экземплярам у SD, а дальше сам распределяет нагрузку между ними. В Client-side SD единственной «фиксированной точкой» в архитектуре является Service Registry, в котором должна регистрироваться каждая служба. Клиент сам имплементирует логику для взаимодействия со службой.
让我们回想一下,客户端发现是指客户端从 SD 请求有关访问可用实例的信息,然后在它们之间分配负载。在客户端 SD 中,架构中唯一的“固定点”是服务注册表,每个服务都必须在此注册。客户端实现与服务本身交互的逻辑。

Каждый микросервис регистрируется на сервере Eureka, и Eureka знает все клиентские приложения, работающие на каждом порту и IP-адресе. Eureka Server также известен как Discovery Server.
每个微服务都会注册到Eureka服务器上,Eureka知道每个端口和IP地址上运行的所有客户端应用程序。 Eureka 服务器也称为发现服务器。

С Netflix Eureka каждый клиент действует как “сервер” при подключении к сервису: клиент извлекает список всех подключенных экземпляров в service registry и отправляет все дальнейшие запросы к службам с помощью алгоритма балансировки нагрузки.
使用 Netflix Eureka,每个客户端在连接到服务时都充当“服务器”:客户端从服务注册表中检索所有连接实例的列表,并使用负载平衡算法将所有进一步的请求发送到服务。

Обязанность Eureka — давать имена каждому микросервису. Эврика регистрирует микросервисы и отдает их ip другим микросервисам. Таким образом, каждый сервис регистрируется в Eureka и отправляет эхо-запрос серверу Eureka, чтобы сообщить, что он активен. Для этого сервис должен быть помечен как @EnableEurekaClient, а сервер @EnableEurekaServer.
Eureka的职责是对每一个微服务进行命名。 Eureka 注册微服务并将其 IP 提供给其他微服务。因此,每个服务都会向 Eureka 注册并 ping Eureka 服务器以让其知道它处于活动状态。为此,必须将服务标记为“@EnableEurekaClient”,将服务器标记为“@EnableEurekaServer”。

2. Технология JAX-WS и её использование для реализации веб-сервисов
JAX-WS 技术及其在实现 Web 服务中的应用

Java API for XML Web Services (JAX-WS) — это прикладной программный интерфейс языка Java для создания веб-служб, входит в спецификацию Java EE.
Java API for XML Web Services (JAX-WS) 是用于创建 Web 服务的 Java API,是 Java EE 规范的一部分。

JAX-WS является заменой технологии JAX-RPC, предоставляя более документо-ориентированную модель сообщений и упрощая разработку веб-служб за счёт использования аннотаций. Основан на разметке класса аннотациями (метапрограммировании), хорошо совместим с EJB.
JAX-WS 是 JAX-RPC 技术的替代品,它提供了更加面向文档的消息传递模型,并通过使用注释简化了 Web 服务开发。基于带有注释的类标记(元编程),它与 EJB 具有良好的兼容性。

В JAX-WS вызов операции веб-сервиса представлен протоколом SOAP — протоколом на основе XML. Спецификация SOAP определяет:
在 JAX-WS 中,Web 服务操作调用由 SOAP 协议(​​一种基于 XML 的协议)表示。 SOAP 规范定义:

Эти вызовы и ответы передаются как сообщения SOAP (файлы XML) по HTTP.
这些调用和响应通过 HTTP 以 SOAP 消息(XML 文件)的形式传输。

На стороне сервера разработчик:
在服务器端,开发人员:

Для реализации клиентских классов, рахработчик:
为了实现客户端类,开发人员需要:

Кроме того, JAX-WS не ограничивает ни одну из сторон в используемых технологиях: клиент JAX-WS может получить доступ к веб-сервису, который не работает в платформе Java, и наоборот. Эта гибкость возможна благодаря использованию в JAX-WS технологий, определённых W3C: HTTP, SOAP и WSDL. WSDL определяет формат XML для описания сервиса как набора конечных точек, работающих с сообщениями.
此外,JAX-WS 不限制任何一方所使用的技术:JAX-WS 客户端可以访问不在 Java 平台上运行的 Web 服务,反之亦然。这种灵活性是可能的,因为 JAX-WS 使用了 W3C 定义的技术:HTTP、SOAP 和 WSDL。 WSDL 定义了一种 XML 格式,用于将服务描述为一组消息处理端点。

Можно генерировать: WSDL <-> code (в обе стороны).
可以生成:WSDL <-> 代码(双向)。

Аннотации JAX-WS
JAX-WS 注释

Пример сервиса на JAX-WS: интерфейс
示例 JAX-WS 服务:接口

@WebService
public interface EmployeeService {
    @WebMethod
    Employee getEmployee(int id);
    
    @WebMethod
    Employee updateEmployee(int id, String name);
    
    @WebMethod
    boolean deleteEmployee(int id);
    
    @WebMethod
    Employee addEmployee(int id, String name);
    //...
}

Пример сервиса на JAX-WS: реализация
JAX-WS 服务示例:实现

@WebService(endpointInterface = "com.example.EmployeeService")
public class EmployeeServiceImpl implements EmployeeService {
    @Inject
    private EmployeeRepository employeeRepositoryImpl;

    @WebMethod
    public Employee getEmployee(int id) {
        return employeeRepositoryImpl.getEmployee(id);
    }

    @WebMethod
    public Employee updateEmployee(int id, String name) {
        return employeeRepositoryImpl.updateEmployee(id, name);
    }
    // ...
}

Пример сервиса на JAX-WS: публикация
示例 JAX-WS 服务:发布

public class EmployeeServicePublisher {
    public static void main(String[] args) {
        Endpoint.publish(
                "http://localhost:8080/employeeservice",
                new EmployeeServiceImpl());
    }
}

3. Набор микросервисов на Spring MVC, управляющий распределением по аудиториям и преподавателям студентов, ожидающих своей очереди на доп. Должна поддерживаться возможность добавления новых аудиторий и преподавателей и удаления существующих. В одной аудитории может находиться более одного преподавателя.
一组基于 Spring MVC 的微服务,用于管理排队等待加课的学生在教室和老师之间的分配。应该可以添加新的教室和教师,并删除现有的教室和教师。一个教室可能有多个老师。

Пишем CRUD для аудиторий, это отдельный микросервис.
我们为观众编写 CRUD,这是一个单独的微服务。

Controller:

@RestController
public class AudienceController {
    private final AudienceService audienceService;
    @Autowired
    public AudienceController(AudienceService audienceService) {
    }
    
    @GetMapping("/audiences")
    public List<Audience> getAudiences() {
        return audienceService.getAudiences();
    }
    
    @PostMapping("/audiences")
    public Audience addAudience(@RequestBody Audience audience) {
        return audienceService.addAudience(audience);
    }
    
    @DeleteMapping("/audiences/{id}")
    public void deleteAudience(@PathVariable Long id) {
        audienceService.deleteAudience(id);
    }
}

Application:

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class AudienceServiceApplication {
    public static void main(String[] args)
    {
        SpringApplication.run(
                AudienceServiceApplication.class,
                args);
    }
}

Controller:

@RestController
public class TeacherController {
    //...
}

Application:

@SpringBootApplication
public class TeacherServiceApplication {
    // ...
}

АНАЛОГИЧНО пишем микросервис для студентов
就像我们为学生编写微服务一样 //…

Последний шаг - микросервис, добавляющий студентов и преподавателей в аудитории (создает класс)
最后一步是将学生和老师添加到教室的微服务(创建班级)

@RestController(path = "/class")
public class ClassController {
    
    private final ClassService classService;
    
    @Autowired
    public ClassController(ClassService ClassService) {
    }
    
    @GetMapping("/student")
    public boolean applyStudent(
            @RequestParam(name = "student_id") Long studentId,
            @RequestParam(name = "audience_id") Long audienceId) {
        return classService.applyStudent(studentId, audienceId);
    }

    //Ну...И так же препода добавляем
}

Вариант 5

1. Реализация микросервисов на Spring Cloud.
Spring Cloud 上的微服务的实现。

Spring Cloud

Архитектура Spring Cloud

Микросервисы на Spring Cloud
Spring Cloud 上的微服务

2. Service Discovery и Service Registry.

Service Discovery — см Вариант 1 вопрос 1

Service Discovery – это процесс, позволяющий клиентам автоматически найти и использовать доступные службы. Примерами Service Discovery могут быть DNS, различные протоколы динамической конфигурации или протоколы обнаружения служб, такие как SLP или UPnP.
服务发现是一个使客户端能够自动查找和使用可用服务的过程。服务发现的示例包括 DNS、各种动态配置协议或服务发现协议(如 SLP 或 UPnP)。

Решаемые задачи:
需要解决的任务:

Service Registry – Ключевой компонент, SD. Это хранилище данных, используемое для хранения информации об услугах, доступных для других систем. Оно может содержать информацию о местоположении служб, метаданные и обнаруженные атрибуты, протоколы доступа и другую полезную информацию. Поэтому его необходимо обновлять и регулярно поддерживать.
服务注册表 — 关键组件,SD。它是一个数据仓库,用于存储有关其他系统可用的服务的信息。它可能包含有关服务位置、元数据和发现的属性、访问协议和其他有用信息。因此,需要定期更新和维护。

Service Registry
服务注册中心

3. Веб-сервис на JAX-WS, управляющий процессом выпечки колобков. Выпечка пирожка состоит из последовательности взаимозависимых этапов, выполнение которых должен обеспечивать сервис - поскребание по сусекам, подготовка теста, лепка заготовки, термическая обработка.
管理烘焙 kolobok 过程的 JAX-WS Web 服务。烘烤馅饼包括一系列相互依赖的阶段,服务必须确保这些阶段的实施 - 刮擦桶底,准备面团,塑造坯料,热处理。

@WebService(endpointInterface = "shit.soa.BakeryService")
public class BakeryServiceImpl extends BakeryService {
    @Inject
    private DoBakeryService doService;

    @WebMehtod(operationName = "poskrebanie")
    @WebResult(name = "poskrebanie_res_dto")
    public PoskrebanieResDto poskrebanie(@WebParam(name = "poskrebanie_req_dto")
                                         PoskrebanieReqDto req) {
        return new doService.doPoskrebanie(req); //delaet poskrebanie
    }

    @WebMehtod(operationName = "test_preparing")
    @WebResult(name = "test_preparing_res_dto")
    public TestPreparingResDto test_preparing(@WebParam(name = "poskrebanie_req_dto")
                                              TestPreparingReqDto req) {
        return new doService.doTestPreparing(req); //delaet testa preparing
    }

    @WebMehtod(operationName = "lepka")
    @WebResult(name = "lepka_res_dto")
    public LepkagResDto lepka(@WebParam(name = "lepka_req_dto") LepkaReqDto req) {
        return new doService.doLepka(req); //delaet lepka ZagotoVki
    }

    @WebMehtod(operationName = "term_handling")
    @WebResult(name = "term_handling_res_dto")
    public TermHandlingResDto termHandling(@WebParam(name = "term_handling_req_dto")
                                           TermHandlingReqDto req) {
        return new doService.doTermHandling(req); //delaet term handling
    }
}

Вариант 6

1. Реализация Service Discovery на уровне инфраструктурного ПО
在基础设施软件层面实现服务发现

Это один из способов реализации SD в MSA и SOA. Service Discovery на уровне инфраструктурного ПО по сравнению со специальным ПО (по типу Consula) поддерживает не только Client-side SD, но и Server-Side.
这是在MSA和SOA中实现SD的方法之一。基础设施软件级别的服务发现,与专用软件(如 Consula)相比,不仅支持客户端 SD,还支持服务器端

Реализация SD происходит на уровне инфраструктурного ПО происходит с помощью конфигурирования и управления контейнерами и виртуальными машинами.
SD 的实现发生在基础设施软件层面,通过容器和虚拟机的配置和管理。

Контейнеризация.
容器化。

При такой реализации возможностей гораздо больше, чем в прозрачном Java EE и специальном ПО том же.
通过这种实现,比透明 Java EE 和特殊软件有更多可能性。

* Что же такое Client side и server-side?
* 什么是客户端和服务器端?

2. Реализация микросервисов на Java EE
在 Java EE 上实现微服务

Java EE: EJB Pool @ GlassFish Cluster

Компонент в пуле представляет состояние пула в жизненном цикле EJB. Это означает, что у bean-компонента нет идентификатора. Преимущество наличия bean-компонентов в пуле заключается в том, что время на создание bean-компонента можно сэкономить для запроса. Контейнер имеет механизмы, которые создают объекты пула в фоновом режиме, чтобы сэкономить время создания bean-компонента на пути запроса.
池中的组件表示 EJB 生命周期中池的状态。这意味着该 bean 没有标识符。将 bean 放在池中的好处是可以节省每个请求创建 bean 所需的时间。容器具有在后台创建池对象的机制,以节省请求路径上的 bean 创建时间。

Компоненты сеанса без сохранения состояния и компоненты управления данными используют пул EJB. Помня о том, как вы используете сеансовые компоненты без сохранения состояния и объем трафика, который обрабатывает ваш сервер, настройте размер пула, чтобы предотвратить чрезмерное создание и удаление компонентов.
无状态会话 Bean 和实体 Bean 使用 EJB 池。记住您如何使用无状态会话 Bean 以及服务器处理的流量量,调整池大小以防止过多地创建和删除 Bean。

3. Конфигурация в Consul сервиса по выпеканию пирожков с пулом экземпляров сервиса. Сервис реализован на Jakarta EE и развернут в контейнере приложений Wildfly на серверах helios, terra и aqua
在 Consul 中配置带有服务实例池的馅饼烘焙服务。该服务在 Jakarta EE 上实现,并部署在 helios、terra 和 aqua 服务器上的 Wildfly 应用程序容器中

{
  "services": [{
    "name": "wildfly-bakery-1",
    "address": "helios.se.ifmo.ru",
    "port": "41050",
    "checks": [{
      "id": "bakery-1-check",
      "name": "Bakery 1 Helios check",
      "http": "http://helios.se.ifmo.ru:41050/health",
      "method": "GET",
      "interval": "13s"
    }]
  },{
    "name": "wildfly-bakery-2",
    "address": "aqua",
    "port": "41050",
    "checks": [{
      "id": "bakery-2-check",
      "name": "Bakery 1 Aqua check",
      "http": "http://aqua:41050/health",
      "method": "GET",
      "interval": "13s"
    }]
  },{
    "name": "wildfly-bakery-3",
    "address": "terra",
    "port": "41050",
    "checks": [{
      "id": "bakery-2-check",
      "name": "Bakery 1 Terra check",
      "http": "http://terra:41050/health",
      "method": "GET",
      "interval": "13s"
    }]
  }]
}

Вариант 7

1. Consul. Назначение, архитектура, возможности
Consul:目的、架构、功能

Consul - server-side Система обнаружения сервисов (Service Discovery) с распределенным хранилищем “ключ-значение”. Так как является распределенным, то (ПО ставится на каждый комп). Регистрируются путём создания файлов в формате json
Consul - 具有分布式键值存储的服务器端服务发现系统。由于它是分布式的,(该软件安装在每台计算机上)。通过创建json格式的文件进行注册

Предлагает веб-интерфейс для работы со списками сервисов.
提供用于处理服务列表的 Web 界面。

Архитектура Consul

Преимущества Consul для микросервисов
Consul 对微服务的好处

  1. Обнаружение сервисов: эта функция покрывается Consul и полезна для интеграции новых технологий в ваши микросервисы.
    服务发现:此功能由 Consul 涵盖,对于将新技术集成到您的微服务中很有用。
  2. Повышенная прозрачность: Consul полностью прозрачен и может использоваться без каких-либо зависимостей кода.
    提高透明度:Consul 完全透明,无需任何代码依赖即可使用。
  3. Конфигурация: Consul можно использовать для настройки микросервисов. Могут быть реализованы как обнаружение сервисов, так и их настройка.
    配置:可以使用Consul来配置微服务。它既可以实现服务发现,也可以进行服务配置。
  4. Балансировка нагрузки: с помощью Consul DNS Consul прозрачно реализует балансировку нагрузки с помощью DNS-сервера.
    负载均衡:通过Consul DNS,Consul透明地使用DNS服务器实现负载均衡。

Регистрация сервисов в консуле производится с помощью функции Consul Connect. Также регистрируются политики взаимодействия, например, мы можем указать, что сервис 1 может взаимодействовать с сервисом 2, но не может взаимодействовать с сервисом 3. Также для регистрации своего приложения доступна HTTP API или конфигурационные файлы самого консула (при наличии поддержки со стороны приложения).
使用 Consul Connect 功能在 Consul 中注册服务。交互策略也被注册,例如,我们可以指定服务1可以与服务2交互,但不能与服务3交互。此外,HTTP API或consul本身的配置文件(如果应用程序支持)也可用于注册您的应用程序。

Принцип работы server side SD: клиент использует посредника (SD - Consul’a) для запроса каталога услуг и выполнения запросов к ним.
服务器端 SD 的运行原理:客户端使用中介(SD - Consul)请求服务目录并对其执行请求。

2. Микросервисы на spring boot
Spring Boot 上的微服务

Микросервисы на Spring Boot
Spring Boot 上的微服务

Spring Boot 微服务架构(Архитектура микросервисов на Spring Boot)

Пример архитектуры

Балансировка нагрузки и использование индекса

3. Написать на JAX-WS сервис по управлению процессом изготовления резиновых уточек
使用 JAX-WS 编写一个服务来管理小黄鸭的制作过程

@WebService(endpointInterface = "shit.soa.DuckService")
public class DuckServiceImpl extends DuckService {

    @Inject
    private DoDuckService makingService;

    @WebMehtod(operationName = "makeNewDuck")
    public MakeNewDuckResDto makeNewDuck(MakeNewDuckReqDto req) {
        return new makingService.makeNewDuck(req.getDuckParams());
        //delat' utka po params
    }

    @WebMehtod(operationName = "remakeOldDuck")
    public TestPreparingResDto remakeOldDuck(TestPreparingReqDto req) {
        return new makingService.remakeOldDuck(req.getOldDuck(). req.getDuckParams());
        //peredelat' old utka with new params
    }
    
    @WebMehtod(operationName = "destroyBadDuck")
    public DestroyBadDuckResDto destroyBadDuck(DestroyBadDuckReqDto req) {
        return new makingService.destroyBadDuck(req.getDeffectiveDuck());
        //ubit' utka with wrong params
    }
    //... fantasize!
}

Вариант 8

1. Service Discovery

Описание подхода

SD создан для того, чтобы с минимальными затратами можно подключить новое приложение в уже существующее наше окружение. Используя Service Discovery, мы можем максимально разделить либо контейнер в виде докера, либо виртуальный сервис от того окружения, в котором он запущен.
SD 的设计目标是使新的应用程序能够以最低的成本连接到我们现有的环境。使用服务发现,我们可以最大限度地将 Docker 容器或虚拟服务与其运行环境分离。

Решаемые задачи 需要解决的问题

Варианты реализации:
实施方案:

Два типа SD и варианты реализации см. Вариант 1. Вопрос 1

2. Smart Endpoints & Dump pipes

смотрите Вариант 3. Вопрос 2

3. Jax-ws сервис по управлению контингентом в университете
Jax-ws 大学学生人口管理服务

@WebService(endpointInterface = "shit.soa.StudentManagmentService")
public class StudentManagmentServiceImpl extends StudentManagmentService {
    
    @Inject
    private StudentManagmentRepository rep;
    
    @WebMehtod(operationName = "getAllStudents")
    @WebResult(name="student_list_dto")
    public StudentsListDTO getAllStudents(@WebParam(name="get_students_req_dto")
                                          GetAllStudentsReqDTO req) {
        return new StudentsListDTO().getStudents().addAll(rep.getStudents());
    }
    
    @WebMehtod(operationName = "getStudent")
    @WebResult(name="student")
    public Student getStudent(@WebParam(name="get_student_req_dto") GetStudentReqDTO req) {
        return rep.getStudent(req.getId)
    }
    
    @WebMehtod(operationName = "addStudent")
    @WebResult(name="student")
    public Student addStudent(@WebParam(name="add_student_req_dto") AddStudentReqDTO req) {
        return rep.addStudent(req.getName, req.getGroup, ...);
    }
    @WebMehtod(operationName = "updateStudent")
    @WebResult(name="student")
    public Student updateStudent(@WebParam(name="update_student_req_dto") UpdateStudentReqDTO
                                         req) {
        return rep.updateStudent(req.getId, req.getName, req.getGroup, ...);
    }
    //... 
}

Вариант 9

1. Основные проблема коммуникации микросервисов и способы их решения
微服务通信的主要问题及解决方法

Проблемы:

Решения:

Минусы: Если какой-то простой batch должен передать сообщение и завершиться, но получатель лежит, будут проблемы
缺点:如果某个简单的批处理需要传输消息并完成,但接收方却宕机了,就会出现问题

2. Circuit Breaker. Принципы, реализация, примеры использования.
断路器。原理、实施、使用示例。

В отличии от Retry (когда если маленький шанс, что ошибка возникнет снова - мы не выбрасываем ошибку) паттерна, паттерн Circuit Breaker рассчитан на менее ожидаемые ошибки, которые могут длиться намного дольше: обрыв сети, отказ сервиса, оборудования. В этих ситуациях при повторной попытке отправить аналогичный запрос с большой долей вероятности мы получим аналогичную ошибку.
与重试模式不同(如果错误再次发生的可能性很小,我们就不会抛出错误),断路器模式是为不太常见的、可能持续时间更长的错误而设计的:网络中断、服务故障、设备故障。在这些情况下,当我们尝试再次发送类似的请求时,我们很可能会收到类似的错误。

Например, приложение взаимодействует с неким сервисом, и в рамках реализации запросов и ответов предусмотрен некоторый тайм-аут, по истечении которого, если от сервиса не получен ответ, то операция считается неуспешной. В случае проблем с этим сервисом, во время ожидания ответа и до достижения тайм-аута приложение может потреблять какие- критически важные ресурсы (память, процессорное время), которые скорее всего нужны другим частям приложения. В такой ситуации, для приложения будет предпочтительнее завершить операцию с ошибкой сразу, не дожидаясь тайм-аута от сервиса и повторять попытку только тогда, когда вероятность успешного завершения будет достаточно высока.
例如,一个应用程序与某个服务进行交互,在请求和响应的实现框架内,规定了一个一定的超时时间,如果在此时间之后没有收到服务的响应,则认为该操作不成功。如果此服务出现问题,则在等待响应并直到达到超时时,应用程序可能会消耗一些关键资源(内存,处理器时间),而这些资源很可能是应用程序的其他部分所需要的。在这种情况下,应用程序最好立即完成出现错误的操作,而无需等待服务超时,并且仅当成功完成的概率足够高时才重试。

3. JAX-WS сервис по управлению авиаперелётами
JAX-WS 航空旅行管理服务

import javax.jws.WebService;
import javax.jws.WebMethod;
import javax.jws.WebParam;

@WebService(name = "FlightService")
public class FlightService {
    @WebMethod
    public List<Flight> getFlights() {
        // Реализация метода
    }

    @WebMethod
    public void addFlight(@WebParam(name = "flight") Flight flight) {
        // Реализация метода
    }

    @WebMethod
    public void deleteFlight(@WebParam(name = "flight") Flight flight) {
        // Реализация метода
    }

    @WebMethod
    public List<Airport> getAirports() {
        // Реализация метода
    }

    @WebMethod
    public void addAirport(@WebParam(name = "airport") Airport airport) {
        // Реализация метода
    }
    
    @WebMethod
    public void deleteAirport(@WebParam(name = "airport") Airport airport) {
        // Реализация метода
    }
}

Вариант 10

1. Load Balancer в Spring Cloud.
Spring Cloud 中的负载均衡器。

Spring Cloud LoadBalancer является официальной заменой Ribbon и поддерживает:
Spring Cloud LoadBalancer 是 Ribbon 的官方替代品,它支持:

Библиотека Spring Cloud Load Balancer позволяет нам создавать приложения, которые взаимодействуют с другими приложениями с балансировкой нагрузки . Используя любой алгоритм, который мы хотим, мы можем легко реализовать балансировку нагрузки при выполнении удаленных вызовов службы.
Spring Cloud Load Balancer 库允许我们构建与其他负载平衡应用程序通信的应用程序。使用任何我们想要的算法,我们都可以在进行远程服务调用时轻松实现负载平衡。

Load Balancer в Spring Cloud предоставляет возможность распределения нагрузки между несколькими экземплярами служб или приложений.
Spring Cloud 中的负载均衡器提供了在服务或应用程序的多个实例之间分配负载的能力。

Он поддерживает различные алгоритмы балансировки, включая балансировку по нагрузке, балансировку по расстоянию и балансировку рандомом. Он может использоваться для маршрутизации трафика в микросервисных архитектурах. Это помогает избежать перегрузки одного экземпляра, а также снизить время отклика. Он также предлагает маршрутизацию по меткам (применяемым к отдельным экземплярам служб) и равномерное распределение нагрузки между ними.
它支持各种平衡算法,包括负载平衡、距离平衡和随机平衡。它可用于在微服务架构中路由流量。这有助于避免一个实例过载并减少响应时间。它还提供基于标签的路由(应用于单个服务实例)和它们之间的负载平衡。

Для использования Load Balancer в Spring Cloud необходимо иметь следующие компоненты:
要在 Spring Cloud 中使用负载均衡器,您需要具有以下组件:

  1. Клиентское приложение, использующее балансировщик нагрузки для отправки запросов на сервер.
    使用负载均衡器向服务器发送请求的客户端应用程序。
  2. Сервер, который принимает запросы и отправляет ответы клиентскому приложению.
    接受请求并向客户端应用程序发送响应的服务器。
  3. Фронт-контроллер, который отвечает за обработку запросов и управляет потоком трафика между клиентом и сервером.
    前端控制器,负责处理请求和管理客户端与服务器之间的流量。
  4. Алгоритм балансировки, который определяет, какие серверы будут использоваться для обработки запросов и каким образом будет происходить маршрутизация трафика.
    平衡算法,确定使用哪些服务器来处理请求以及如何路由流量。

Spring Cloud предоставляет Load Balancer:
Spring Cloud 提供负载均衡器:

  1. Ribbon – это клиентский Load Balancer, который помогает приложениям маршрутизировать запросы к доступным службам.
    Ribbon 是一个客户端负载均衡器,可帮助应用程序将请求路由到可用的服务。

2. Mule ESB, основные свойства и понятия.

Сервисная шина предприятия (Enterprise Service Bus, ESB) — ПО, обеспечивающее обмен сообщениями между различными ИС на принципах СОА.
企业服务总线(ESB)是一种基于SOA原则提供不同信息系统之间消息交换的软件。

Основным направлением архитектуры ESB является разделение систем друг от друга и обеспечение их устойчивой и управляемой связи.
ESB 架构的主要重点是将系统彼此分离并确保它们的通信稳定且易于管理。

Cостав ESB :

Возможности ESB
ESB 功能

Преимущества: 优点:

Недостатки: 缺陷:

Mule ESB - реализация сервисной шины.
Mule ESB 是一种服务总线实现。

Mule ESB - платформа, одна из реализаций ESB, дающая возможность объединять различные информационные системы на основе принципов обмена сообщениями, контроля надежности, сопоставления данных, оркестровки, а также масштабированием между узлами.
Mule ESB 是一个平台,是 ESB 实现之一,它基于消息交换、可靠性控制、数据比较、编排和节点间扩展的原则实现各种信息系统的统一。

Mule ESB

Mule: основные понятия
Mule:基本概念

3. Конфигурация на Consul пула серверов WildFly, на которых развёрнута Jakarta EE система по выпеканию пирожков.
在 Consul 上配置部署了 Jakarta EE 饼烘焙系统的 WildFly 服务器池。

{
  "services": [{
    "name": "wildfly-bakery-1",
    "address": "14.88.228.42",
    "port": "14141",
    "checks": [{
      "id": "bakery-1-check",
      "name": "Bakery 1 HTTP check",
      "http": "http://14.88.228.42/14141",
      "method": "GET",
      "interval": "14s"
    }]
  },{
    "name": "wildfly-bakery-2",
    "address": "14.88.228.24",
    "port": "14141",
    "checks": [{
      "id": "bakery-2-check",
      "name": "Bakery 2 script check",
      "script": "/petuxon.py --host 14.88.228.24 -- port 14141",
      "interval": "88s"
    }]
  }]
}

Вариант 11

1. Оркестровка и хореография микросервисов

Оба термина описывают два аспекта разработки бизнес-процессов на основе объединения Web-сервисов.
这两个术语描述了基于 Web 服务组合的业务流程开发的两个方面。

Оркестровка микросервисов – добавление подсистемы (дирижер - orchestrator), которая будет координировать взаимодействие между сервисами:
微服务编排——添加一个子系统(指挥者 - orchestrator),用于协调服务之间的交互:

При оркестровке мы настраиваем и интегрируем существующие микросервисы для реализации бизнес-целей (в т.ч. планирование распределенной системы, интеграцию существующих микросервисов, обновление микросервисов и мониторинг производительности).
在编排中,我们配置并集成现有的微服务,以实现业务目标(包括分布式系统的规划、现有微服务的集成、微服务的更新以及性能监控)。

Хореография микросервисов – это процесс проектирования связи между микросервисами и их взаимодействий. Она может включать в себя проектирование архитектуры, создание мостов между микросервисами, планирование взаимодействия между микросервисами и мониторинг и анализ межсервисной связи. В отличие от оркестровки “центрального” сервиса нет: Административная логика “размазана” по сервисам:
微服务编舞——设计微服务之间的连接及其交互方式。编舞可能包括架构设计、微服务间桥接、微服务交互规划,以及跨服务连接的监控和分析。与编排不同,编舞没有“中央”服务:管理逻辑分布在各个服务中:

Хореография более честно ложится на Микросервисную архитектуру, но сложнее в реализации. Для имплементации могут использоваться брокеры событий
编舞更符合微服务架构的理念,但实现起来更复杂。为了实现编舞,可以使用事件代理(Event Broker)。

2. Top-down и bottom-up стратегии при использовании аннотаций wsdl
使用 wsdl 注释时的自上而下和自下而上的策略

При разработке веб-сервисов с использованием WSDL (Web Services Description Language) существуют две основные стратегии:
在使用 WSDL(Web 服务描述语言) 开发 Web 服务时,有两种主要策略:

Top-down (сверху вниз) — 基于 WSDL 的契约优先方法

Суть подхода:

Шаги реализации 实现步骤

  1. Создание WSDL-файла вручную или с помощью инструментов (например, Eclipse, SoapUI)
    手动编写 WSDL 文件 或使用工具(如 Eclipse、SoapUI)生成
  2. Генерация Java-классов с помощью wsimport (JAX-WS) или других инструментов
    使用 wsimport(JAX-WS)或其他工具生成 Java 代码
  3. Реализация бизнес-логики сервиса
    编写服务逻辑,实现生成的接口
  4. Развертывание сервиса
    部署 Web 服务

Bottom-up (снизу вверх) — Код-ориентированный подход

Суть подхода:

Шаги реализации (实现步骤)

  1. Написание Java-класса с аннотациями JAX-WS
    使用 JAX-WS 注释编写 Java 类
  2. Деплой в контейнер (например, Apache Tomcat, WildFly)
    部署到容器(例如 Apache Tomcat、WildFly)
  3. Автоматическая генерация WSDL
    自动 WSDL 生成
  4. Клиенты могут использовать этот WSDL для взаимодействия с сервисом
    客户端可以使用此 WSDL 与服务进行交互。

3. Конфигурация Spring Boot сервиса для подключения Consul, он живет на localhost на 8500 порту
配置 Spring Boot 服务用于连接 Consul,它位于本地主机的 8500 端口上

spring.application.name=main-service
spring.cloud.consul.host=localhost
spring.cloud.consul.port=8500
spring.cloud.consul.config.enabled=true
#health check
spring.cloud.consul.config.import-check.enabled=false
spring.cloud.consul.discovery.health-check-path=/health
spring.cloud.consul.discovery.health-check-interval=8s
#if tls cert self-signed
spring.cloud.consul.discovery.health-check-tls-skip-verify=true
#if https needed
spring.cloud.consul.discovery.scheme=https

Вариант 12

1. Свойства и ключевые особенности микросервиса.
微服务的属性和主要特征。

Это архитектурный стиль разработки, который позволяет создавать приложения в виде набора небольших автономных микросервисов, разработанных для бизнес-сферы.
它是一种架构开发风格,允许将应用程序构建为一组为业务目的而设计的小型、自主的微服务。

Особенности MSA
MSA 的功能

Свойства микросервиса
微服务属性

  1. Небольшой
  2. Независимый.
    独立。
  3. Строится вокруг бизнес-потребности и использует ограниченный контекст (Bounded Context).
    围绕业务需求构建并使用有界上下文。
  4. Взаимодействует с другими микросервисами по сети на основе паттерна Smart endpoints & dumb pipes.
    基于智能端点和哑管道模式通过网络与其他微服务进行交互。
  5. Его распределенная суть обязывает использовать подход Design for failure.
    它的分布式特性要求使用故障设计方法。
  6. Централизация ограничена сверху на минимуме.
    集中化​​至少受到来自上层的限制。
  7. Процессы его разработки и поддержки требуют автоматизации.
    其开发和支持过程需要自动化。
  8. Его развитие итерационное.
    其发展是迭代的。

Что значит “небольшой”?
“小”是什么意思?

Что значит “независимый”?
“独立”是什么意思?

2. Структура документа WSDL

Структура версии 1.1:
1.1版结构:

Abstract Definition of Service
服务的抽象定义

Структура документа WSDL 1.1, пример:
WSDL 1.1 文档结构,示例:

Отличия WSDL 2.0 от 1.1:
WSDL 2.0 和 1.1 之间的区别:

3. Конфигурация, регистрирующая в Consul пул экземпляров СУБД MySQL. Сервисы расположены на машинах ra, helios и anubis, экземпляры занимают порт 3306 на каждой из машин. Конфигурация должна обеспечивать проверку того, запущены ли экземпляры каждого из сервисов.
在 Consul 中注册 MySQL DBMS 实例池的配置。服务位于机器ra、helios和anubis上,每台机器上的实例占用3306端口。配置必须确保每个服务的实例都在运行。

{
  "services": [{
    "name": "mysql-ra",
    "address": "ra-address",
    "port": "3306",
    "checks": [{
      "name": "RA MySQL check",
      "script": "/mysql-check-script.py --host ra-address -- port 3306",
      "interval": "88s"
    }]
  },{
    "name": "mysql-helios",
    "address": "helios.se.ifmo.ru",
    "port": "3306",
    "checks": [{
      "name": "Helios MySQL check",
      "script": "/mysql-check-script.py --host helios.se.ifmo.ru -- port 3306",
      "interval": "88s"
    }]
  }, {
    "name": "mysql-anubis",
    "address": "anubis-address",
    "port": "3306",
    "checks": [{
      "name": "Anubis MySQL check",
      "script": "/mysql-check-script.py --host anubis-address -- port 3306",
      "interval": "88s"
    }]
  }]
}

Вариант 13

1. Преимущества и недостатки MSA по сравнению с “обычной” SOA.

Преимущества МСА по сравнению с СОА:
MSA 相对于 SOA 的优势:

Недостатки МСА по сравнению с СОА:
与 SOA 相比,MSA 的缺点:

Преимущества микросервисов
微服务的好处

Недостатки микросервисов
微服务的缺点

2. Аннотации JAX-WS

Аннотации JAX-WS
JAX-WS 注释

3. Конфигурация, регистрирующая в Consul пул сервисов libreoffice … обработкой документов. Сервисы расположены на машинах aqua, …, по пути /usr/bin/soffice. Конфигурация должна обеспечивать проверку запущены ли экземпляры сервисов.
在 Consul 中注册 libreoffice 服务池的配置,用于文档处理。服务位于机器 aqua、……上,沿着路径 /usr/bin/soffice。配置必须确保服务实例正在运行。

{
  "service": {
    "name": "libreoffice-service",
    "port": 8080,
    "check": {
      "script": "curl helios:8080/health",
      "interval": "10s"
    },
    "tags": ["libreoffice", "documents"],
    "enable_tag_override": false
  },
  "checks": [
    {
      "id": "libreoffice-service-1",
      "name": "Libreoffice service on aqua",
      "command": "/usr/bin/soffice",
      "args": ["--listen",
        "--accept=socket,host=aqua,port=8080"],
      "interval": "10s"
    },
    {
      "id": "libreoffice-service-2",
      "name": "Libreoffice service on terra",
      "command": "/usr/bin/soffice",
      "args": ["--listen",
        "--accept=socket,host=terra,port=8080"],
      "interval": "10s"
    }
  ]
}

Вариант 14

1. UDDI

смотрите Вариает1. Вопрос 2

2. Design for failure

Design for Failure - Одно из ключевых свойств микросервисной архитектуры. У MSA есть ряд проблем:
针对故障进行设计——微服务架构的关键属性之一。 MSA 存在许多问题:

Эти проблемы сложно и дорого устранять, поэтому мы считаем, что наличие некритичных ошибок при работе – нормальная ситуация. Свойство же design for failure заключается в том, что с самого первого этапа, начиная строить микросервисную архитектуру, вы должны исходить из предположения, что ваши сервисы не работают. Другими словами, ваш сервис должен понимать, что ему могут не ответить никогда, если он ожидает каких-то данных. Таким образом, вы сразу должны исходить из ситуации, что что-то у вас может не работать.
这些问题修复起来很困难而且成本很高,所以我们认为运行过程中出现非严重错误是正常情况。失败属性的设计是,从最初阶段开始构建微服务架构时,就必须从服务无法正常工作的假设出发。换句话说,您的服务必须明白,如果它正在等待某些数据,它可能永远不会收到响应。因此,您必须立即假设某些事情可能不适合您。

При этом повышаются требования к инфраструктуре: мы должны уметь оперативно выявлять и исправлять проблемы.
与此同时,对基础设施的要求也日益提高:我们必须能够快速发现并纠正问题。

Например, для этого компания Netflix разработала Chaos Monkey — инструмент, который ломает сервисы, хаотически их выключает и рвет соединения. Этот нужно, чтобы оценить надежность системы.
例如,为了这个目的,Netflix 开发了 Chaos Monkey,这是一种破坏服务、随机关闭服务并断开连接的工具。这对于评估系统的可靠性是必要的。

3. конфиг для консула чтобы зарегать 3 бд

{
  "services": [
    {
      "name": "mysql-service",
      "address": "mysql-address",
      "port": "1010",
      "checks": [
        {
          "name": "check is mysql alive",
          "script": "/check-is-alive.py --host mysql-address --port 1010",
          "interval": "20s"
        }
      ]
    },
    {
      "name": "postgresql-service",
      "address": "postgresql-address",
      "port": "1010",
      "checks": [
        {
          "name": "check is postgresql alive",
          "script": "/check-is-alive.py --host postgresql-address --port 1010",
          "interval": "20s"
        }
      ]
    },
    {
      "name": "redis-service",
      "address": "redis-address",
      "port": "1010",
      "checks": [
        {
          "name": "check is redis alive",
          "script": "/check-is-alive.py --host redis-address --port 1010",
          "interval": "20s"
        }
      ]
    }
  ]
}

Вариант 15

1. Service Discovery в решениях на базе Spring Cloud Netflix

смотрите Вариает4. Вопрос 1

2. Сервисные шины особенности, преимущества и недостатки, использование в решениях на базе SOA

Основным направлением архитектуры ESB является разделение систем друг от друга и обеспечение их устойчивой и управляемой связи.

Cостав ESB:

Преимущества:

Недостатки:

Mule(см. Вариант 10 вопрос 2)

3. Набор микросервисов на Spring MVC, реализующий параллельную сортировку элементов массива. Алгоритм сортировки мож но выбрать любой подходящий.
一组实现数组元素并行排序的 Spring MVC 微服务。您可以选择任何合适的排序算法。

Похоже на вариант 4. Вопрос 3 (потому что тоже именно набор микросервисов, а не 1 микр.,/осервис)