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

OSCHINA-MIRROR/kailing-springboot-mqrpc

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

Перевод текста на русский язык:

С радостью приглашаем присоединиться к открытому техническому QQ-чату для общения: 613025121.

Понимание принципа удалённого вызова процедур (RPC) через Spring, RabbitMQ и Hessian.

  1. Простое объяснение RPC

Проще говоря, RPC означает, что вызов удалённых сервисов и вызов локальных сервисов одинаково прозрачен и незаметен. Те, кто использовал Dubbo и Motan, наверняка знакомы с этим ощущением. В процессе реализации удалённого вызова необходимо решить две проблемы:

  • Передача данных: здесь используется RabbitMQ для отправки и получения сообщений, обеспечивая надёжность сообщений.
  • Сериализация и десериализация запросов и ответов: используется Hessian.

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

  1. Процесс удалённого вызова

Во-первых, при инициализации потребителя и производителя в контейнере Spring, соответствующие очереди будут созданы на RabbitMQ в соответствии с конфигурацией, и потребитель будет следить за соответствующими очередями.

  1. Производитель (клиент) вызывает сервис локально.
  2. После вызова клиент использует Hessian для упаковки метода, параметров и других данных в сообщение, которое может быть передано по сети.
  3. Клиент выполняет метод invoke через прокси-класс, чтобы отправить унифицированное сообщение на сервер, который слушает MQ.
  4. Сервер получает сообщение и выполняет его десериализацию с помощью Hessian после получения.
  5. Сервер вызывает локальный сервис на основе результата десериализации.
  6. Локальный сервис выполняет операцию и возвращает результат серверу.
  7. Сервер упаковывает возвращённый результат с помощью Hessian и отправляет его обратно клиенту.
  8. Клиент получает сообщение и выполняет десериализацию.
  9. Производитель получает окончательный результат.

Конфигурация клиента:

<!-- RabbitMQ连接池 -->
<task:executor id="amqpConnectionTaskExecutor" pool-size="5"/>

<!-- RabbitMQ连接器 -->
<rabbit:connection-factory id="connectionFactory" executor="amqpConnectionTaskExecutor" host="127.0.0.1" port="5672" username="admin" password="admin"
                           virtual-host="/kl"/>

<bean id="myService" class="com.kl.client.MQClientProxyFactoryBean">
    <property name="connectionFactory" ref="connectionFactory"/>
    <property name="serviceInterface" value="com.kl.api.Service"/>
</bean>

Конфигурация сервера:

<!-- RabbitMQ连接池 -->
<task:executor id="amqpConnectionTaskExecutor" pool-size="5"/>

<!-- RabbitMQ连接器 -->
<rabbit:connection-factory id="connectionFactory" executor="amqpConnectionTaskExecutor" host="127.0.0.1" port="5672" username="admin" password="admin"
                           virtual-host="/kl"/>
<bean id="ServiceImpl" class="com.kl.apiImpl.ServiceImpl"/>

<bean id="MyServiceEndpoint" class="com.kl.server.MQServerEndpoint">
    <constructor-arg index="0" ref="ServiceImpl"/>
    <property name="connectionFactory" ref="connectionFactory"/>
</bean>

Тестовый код и примеры

/**
 * 暴力测试
 * @param args
 */
public static void main(String[] args) {
    GenericXmlApplicationContext context = new GenericXmlApplicationContext(
            "classpath:/applicationContext-client.xml");
    Service service = (Service) context.getBean("myService");
    new ClientTest().exec(service);
}
public void exec(Service service){
    ExecutorService executorService= Executors.newFixedThreadPool(30);
    for(int i=0;i<=30;i++){
        executorService.submit(new Task(service));
    }
}
private class Task implements Callable {
    private Service service;
    public Task(Service service){
        this.service=service;
    }
    @Override
    public Object call() throws Exception {
        for(int i=0;i<=100000;i++){
            System.out.println("servicEcho当前线程:"+Thread.currentThread().getName()+"| 线程任务数"+i+"| 输出:"+service.echo("Hello AMQP!"));
            System.out.println("serviceStudent当前线程:"+Thread.currentThread().getName()+"| 线程任务数"+i+"| 输出:"+service.getStudent(null).getName());

        }
        return null;
    }
}

Примеры тестов

введите сюда описание изображения введите сюда описание изображения введите сюда описание изображения

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

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

Введение

РобатМQ + Hessian — это RPC-фреймворк, который можно интегрировать в приложения Spring Boot и Spring MVC. Развернуть Свернуть
Apache-2.0
Отмена

Обновления

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

Участники

все

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

Загрузить больше
Больше нет результатов для загрузки
1
https://api.gitlife.ru/oschina-mirror/kailing-springboot-mqrpc.git
git@api.gitlife.ru:oschina-mirror/kailing-springboot-mqrpc.git
oschina-mirror
kailing-springboot-mqrpc
kailing-springboot-mqrpc
master