Терпеливо полировал 2 месяца!Простой RPC фреймворк написал сам!

Java RPC
"

Адрес на гитхабе:GitHub.com/snail Climb/…(Добро пожаловать в звезду, добро пожаловать, чтобы совершенствоваться вместе! Давайте подбадривать друг друга!)

предисловие

Месяца 2 назад я сказал, что в свободное время напишу простой RPC-фреймворк, сегодня (05.06.2020) я его наконец-то открыл, надеюсь, он будет полезен моим друзьям.

Хотя принцип RPC на самом деле не сложен, в процессе реализации он столкнулся со многими проблемами. Guide-RPC-Framework в настоящее время реализует только самые основные функции инфраструктуры RPC, некоторые оптимизированные моменты упомянуты ниже, и заинтересованные небольшие партнеры могут быть улучшены.

вводить

guide-rpc-framework — это RPC-фреймворк, основанный на Netty+Kyro+Zookeeper. Комментарии к коду подробны, ясны по структуре и интегрированы со структурой кода Check Style, что очень удобно для чтения и изучения.

Из-за ограниченной энергии и возможностей Brother Guide, если вы считаете, что есть области, которые необходимо улучшить и усовершенствовать, вы можете клонировать этот проект в свою локальную область, отправить мне PR после локальной модификации, и я пересмотрите свой код как можно скорее.

Давайте начнем с базовой идеи дизайна фреймворка RPC!

Основная идея дизайна инфраструктуры RPC

Типичный сценарий использования RPC выглядит следующим образом.В общем, инфраструктура RPC должна не только предоставлять функции обнаружения сервисов, но также предоставлять такие функции, как балансировка нагрузки и отказоустойчивость.Эта инфраструктура RPC действительно квалифицирована.

一个完整的RPC框架使用示意图
Схематическая диаграмма использования полной инфраструктуры RPC

Кратко расскажем об идее проектирования базового RPC-фреймворка:

  1. Регистрационный центр: сначала требуется центр регистрации, рекомендуется Zookeeper. Реестр в основном используется для хранения связанной информации, такой как адрес удаленного метода.
  2. передача по сети: Поскольку вы хотите вызвать удаленный метод, вы должны отправить запрос.Запрос должен как минимум содержать имя класса, имя метода и соответствующие параметры, которые вы вызываете! Рекомендуется использовать платформу Netty на основе NIO.
  3. Сериализация: Поскольку это связано с передачей по сети, должна быть задействована сериализация.Вы не можете напрямую использовать сериализацию, поставляемую с JDK! Сериализация, поставляемая с JDK, неэффективна и имеет дыры в безопасности. Поэтому вам также необходимо подумать о том, какой протокол сериализации использовать.Наиболее часто используются hession2, kyro и protostuff.
  4. Динамический прокси: Кроме того, требуется динамический прокси. Поскольку основная цель RPC — позволить нам вызывать удаленные методы так же легко, как и локальные, используйте динамические прокси-серверы для защиты деталей вызовов удаленного интерфейса, таких как сетевые передачи.
  5. балансировки нагрузки: Балансировка нагрузки также требуется. Зачем? Например, служба в нашей системе имеет особенно большое количество посещений. Мы развертываем эту службу на нескольких серверах. Когда клиент инициирует запрос, несколько серверов могут обработать запрос. Затем, как правильно выбрать сервер, который обрабатывает запрос, имеет решающее значение. Если вам нужен один сервер для обработки запроса сервиса, то смысла развертывать сервис на нескольких серверах уже нет. Балансировка нагрузки предназначена для предотвращения ответа одного сервера на один и тот же запрос, что может легко вызвать такие проблемы, как простои сервера и сбой Мы можем ясно почувствовать его значение из этих четырех слов балансировки нагрузки.
  6. ......

Базовая ситуация проекта и точки оптимизации

Для того, чтобы шаг за шагом, изначально было время, я основывался на традиционномBIOПутьSocketпередачи по сети, а затем использоватьСобственный механизм сериализации JDKА память напрямую хранит соответствующую информацию, связанную с услугами, для реализации этой структуры RPC.

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

Зачем перечислять оптимизируемые точки?В основном я хочу дать несколько идей тем, кто хочет оптимизировать эту структуру RPC. Вы можете клонировать этот репозиторий и оптимизировать его самостоятельно.

Обзор модуля проекта

запустить проект

1. Импортируйте проект

Клонируйте проект в свою локальную папку:git clone git@github.com:Snailclimb/guide-rpc-framework.git

Затем откройте его с помощью IDEA и дождитесь завершения инициализации проекта.

2. Инициализируйте git-хуки

Этот шаг в основном предназначен для запуска проверки стиля перед фиксацией кода, чтобы убедиться, что формат кода правильный.Если есть проблема, ее нельзя отправить.

"

Далее демонстрируется работа Mac/Linux, а пользователям Window требуется ручноеconfig/git-hooksв каталогеpre-commitСкопируйте файл в проект.git/hooks/содержание.

Выполните эти команды:

➜  guide-rpc-framework git:(master) ✗ chmod +x ./init.sh
➜  guide-rpc-framework git:(master) ✗ ./init.sh

Кратко объясните, как это сделать!

init.shОсновная функция этого скрипта — скопировать хук git commit в проект..git/hooks/Каталог, поэтому каждый раз, когда вы фиксируете время, будет выполняться.

cp config/git-hooks/pre-commit .git/hooks/
chmod +x .git/hooks/pre-commit
"

Жалоба: В проекте используется Gradle, а Maven давно не использовался. Я чувствую, что Gradle лучше Maven во многих аспектах! Например, файлы зависимостей проекта Gradlebuild.gradleчем Мейвенpom.xmlБолее ясный и лаконичный (Maven из-за горшка xml), Gradel также может использовать groovy язык...

pre-commitСодержание выглядит следующим образом, основная функция - запустить перед отправкой кода.Check StyleПроверьте наличие проблем с форматированием кода.

#!/bin/sh
#set -x

echo "begin to execute hook"
mvn checkstyle:check

RESULT=$?

exit $RESULT

3. Загрузка и настройка плагина CheckStyle

IntelliJ IDEA->Preferences->Plugins->Search и загрузите плагин CheckStyle, а затем настройте его следующим образом.

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

4. Скачайте и запустите zookeeper.

Docker используется здесь для загрузки и установки.

скачать:

docker pull zookeeper:3.4.14

бегать:

docker run -d --name zookeeper -p 2181:2181 zookeeper:3.4.14

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

поставщик услуг

Реализовать интерфейс:

public class HelloServiceImpl implements HelloService {
   @Override
    public String hello(Hello hello) {
      ......
    }
}

Служба публикации (используя Netty для транспорта):

HelloService helloService = new HelloServiceImpl();
NettyServer nettyServer = new NettyServer("127.0.0.1", 9999);
nettyServer.publishService(helloService, HelloService.class);

потребитель услуг

ClientTransport rpcClient = new NettyClientTransport();
RpcClientProxy rpcClientProxy = new RpcClientProxy(rpcClient);
HelloService helloService = rpcClientProxy.getProxy(HelloService.class);
String hello = helloService.hello(new Hello("111", "222"));

Похожие вопросы

Зачем строить это колесо? Разве Дуббо не вкусный?

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

На самом деле проще реализовать простую структуру RPC, но все же немного сложнее, чем писать АОП и IoC вручную, при условии, что вы понимаете основные принципы RPC.

Ранее я рассказывал на своей планете знаний, как реализовать RPC на теоретическом уровне. Однако вещи на теоретическом уровне — это только поддержка, вы можете только запутать интервьюера, если вы понимаете теорию. Нам, программистам, по-прежнему нужны практические навыки, даже если вы персонаж уровня архитектора. Когда вы начнете что-то практиковать и применять теорию на практике, вы обнаружите, что вас ждет много ям.

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

Что мне нужно знать заранее, если я хочу написать свой собственный?

Java:

  1. Механизм динамического прокси;
  2. Механизм сериализации и сравнение различных фреймворков сериализации, таких как hession2, kyro, protostuff.
  3. использование пула потоков;
  4. CompletableFutureиспользование
  5. ......

Netty:

  1. Используйте Netty для сетевой передачи;
  2. ByteBufвводить
  3. Нетти липкая распаковка
  4. Длинное соединение Netty и механизм сердцебиения

Zookeeper :

  1. Базовые концепты;
  2. структура данных;
  3. Как использовать клиентскую среду Zookeeper с открытым исходным кодом от Netflix Curator для добавления, удаления, изменения и проверки;

Рекомендуемое чтение

  1. Краткое изложение общих аннотаций Spring/SpringBoot из почти 8000 слов! договариваться!
  2. Интервьюер спросил меня, каковы важные новые функции Java 8~14, я заплакал~~~
  3. Первый выстрел! договариваться! Amway 10 обязательных плагинов IDEA, которые сделают вас такими крутыми!
  4. Завершите цветочную композицию! JavaGuide面试突击版来啦!

об авторе:Звездный проект Github 80kJavaGuide(Публичный аккаунт с таким же именем) Автор. Каждую неделю я буду обновлять некоторые из моих собственных оригинальных галантерейных товаров в общественном аккаунте. За кулисами общественность ответила «1», чтобы получить необходимые учебные материалы для инженеров Java + интервью-сюрприз в формате pdf.

В этой статье используетсяmdniceнабор текста