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

OSCHINA-MIRROR/SnailClimb-guide-rpc-framework

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

Руководство по RPC-фреймворку

中文|English

К сожалению, я не полностью перевёл китайский файл README. Я перевёл важные части. Вы можете перевести остальное самостоятельно через Google.

Предисловие

Хотя принцип работы RPC несложен, в процессе реализации я столкнулся со множеством проблем. Guide-RPC-framework реализует только самые основные функции RPC-фреймворка, и некоторые оптимизации упомянуты ниже для тех, кто заинтересован.

С помощью этого простого инструмента вы можете изучить основные принципы и концепции RPC-фреймворков, а также различные практики кодирования на Java.

Вы даже можете использовать guide-rpc-framework в качестве выбора для своего дипломного проекта или опыта работы, что очень здорово! По сравнению с другими соискателями, чей опыт работы основан на различных системах, создание собственных инструментов — это верный способ завоевать расположение интервьюера.

Если вы собираетесь использовать guide-RPC-фреймворк в качестве своего дипломного проекта, я хочу, чтобы вы понимали его, а не просто копировали и вставляли мои идеи. Вы можете разветвить мой проект, а затем оптимизировать его. Если вы считаете оптимизацию ценной, вы можете отправить мне PR, и я рассмотрю его как можно скорее.

Введение

Guide-RPC-Framework — это RPC-фреймворк, основанный на Netty+Kyro+Zookeeper. Подробные комментарии к коду, чёткая структура и интегрированная спецификация кода Check Style делают его идеальным для чтения и изучения.

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

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

Примечание: упомянутый здесь RPC-фреймворк — это фреймворк, который позволяет клиентам напрямую вызывать методы на стороне сервера так же просто, как вызывать локальные методы, подобно Dubbo, Motan и gRPC, которые я представил ранее. Если вам нужно работать с протоколом HTTP, анализировать и инкапсулировать HTTP-запросы и ответы. Типовые фреймворки не считаются «RPC-фреймворками», такие как Feign.

На рисунке ниже показана схема простейшего использования RPC-фреймворка, которая также является текущей архитектурой guide-rpc-фреймворка:

Поставщик услуг Server регистрирует услугу в реестре, а потребитель услуг Client получает информацию, связанную с услугой, через реестр, а затем запрашивает поставщика услуг Server через сеть.

Как лидер в области RPC-фреймворков Dubbo, архитектура показана на рисунке ниже, который примерно такой же, как мы нарисовали выше.

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

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

  1. Центр регистрации: сначала требуется центр регистрации, рекомендуется Zookeeper. Центр регистрации отвечает за регистрацию и поиск адресов служб, что эквивалентно службе каталогов. При запуске сервера имя службы и соответствующий адрес (ip+порт) регистрируются в реестре, и потребитель службы находит соответствующий адрес службы по имени службы. Имея адрес службы, потребитель услуги может запросить сервер через сеть.

  2. Передача по сети: поскольку вы хотите вызвать удалённый метод, вы должны отправить запрос. Запрос должен включать как минимум имя класса, имя метода и связанные с ним данные. Вам рекомендуют использовать фреймворк Netty на основе NIO.

  3. Сериализация: поскольку задействована передача данных по сети, необходима сериализация. Нельзя напрямую использовать сериализацию, которая поставляется с JDK! Сериализация, которая идёт в комплекте с JDK, неэффективна и имеет уязвимости в системе безопасности. Поэтому необходимо рассмотреть, какой протокол сериализации использовать. Наиболее часто используемые — hession2, kyro и protostuff.

  4. Динамический прокси: кроме того, также требуется динамический прокси. Поскольку основная цель RPC — позволить нам вызывать удалённые методы так же легко, как локальные, использование динамического прокси может скрыть детали вызовов удалённых методов, такие как передача данных по сети. То есть когда вы вызываете удалённый метод, сетевой запрос фактически будет передаваться через объект прокси. Иначе как можно было бы напрямую вызвать удалённый метод?

  5. Балансировка нагрузки: также необходима балансировка нагрузки. Почему? Например, определённый сервис в нашей системе имеет очень высокий трафик. Мы развёртываем этот сервис на нескольких серверах. Когда клиент инициирует запрос, несколько серверов могут обработать запрос. Тогда критически важно правильно выбрать сервер, который обрабатывает запрос. Если вам нужен один сервер для обработки запросов к сервису, смысл развёртывания сервиса на нескольких серверах больше не существует. Балансировка нагрузки позволяет избежать ситуации, когда один сервер отвечает на один и тот же запрос, что может привести к простою сервера, сбоям и другим проблемам. Мы можем ясно почувствовать её значение из четырёх слов «балансировка нагрузки».

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

Импортировать проект

Форкните проект в свой собственный репозиторий, затем клонируйте его в свою локальную среду: git clone git@github.com:username/guide-rpc-framework.git. Используйте Java IDE, такую как IDEA, чтобы открыть и дождаться завершения инициализации проекта.

Инициализировать git hooks

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

Далее показано выполнение, соответствующее Mac/Linux. Пользователи Windows должны вручную скопировать файл pre-commit из каталога config/git-hooks в каталог .git/hooks/ проекта.

Выполните следующие команды:

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

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

Скачать и настроить плагин CheckStyle

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

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

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

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

Загрузить и запустить zookeeper

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

Скачать:

docker pull zookeeper:3.5.8

Запустить:

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

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

Сервер (поставщик услуг)

Реализация интерфейса:

@Slf4j
@RpcService(group = "test1", version = "version1")
public class HelloServiceImpl implements HelloService {
    static {
        System.out.println("HelloServiceImpl被创建");
    }

    @Override
    public String hello(Hello hello) {
        log.info("HelloServiceImpl收到: {}.", hello.getMessage());
        String result = "Hello description is " + hello.getDescription();
        log.info("HelloServiceImpl返回: {}.", result);
        return result;
    }
}
    
@Slf4j
public class HelloServiceImpl2 implements HelloService {

    static {
        System.out.println("HelloServiceImpl2被创建");
    }

    @Override
    public String hello(Hello hello) {
        log.info("HelloServiceImpl2收到: {}.", hello.getMessage());
        String result = "Hello description is " + hello.getDescription();
        log.info("HelloServiceImpl2返回: {}.", result);
``` ```
return result;
    }
}

Публикация сервисов (транспорт с использованием Netty):

/**
 * Сервер: служба автоматической регистрации через аннотацию @RpcService
 *
 * @author shuang.kou
 * @createTime 2020年05月10日 07:25:00
 */
@RpcScan(basePackage = {"github.javaguide.serviceimpl"})
public class NettyServerMain {
    public static void main(String[] args) {
        // Регистрация службы через аннотацию
        new AnnotationConfigApplicationContext(NettyServerMain.class);
        NettyServer nettyServer = new NettyServer();
        // Ручная регистрация службы
        HelloService helloService2 = new HelloServiceImpl2();
        RpcServiceProperties rpcServiceConfig = RpcServiceProperties.builder()
                .group("test2").version("version2").build();
        nettyServer.registerService(helloService2, rpcServiceConfig);
        nettyServer.start();
    }
}

Клиент (потребитель сервиса)

@Component
public class HelloController {

    @RpcReference(version = "version1", group = "test1")
    private HelloService helloService;

    public void test() throws InterruptedException {
        String hello = this.helloService.hello(new Hello("111", "222"));
        // Если необходимо использовать assert для проверки, нужно добавить параметр -ea в VM options
        assert "Hello description is 222".equals(hello);
        Thread.sleep(12000);
        for (int i = 0; i < 10; i++) {
            System.out.println(helloService.hello(new Hello("111", "222")));
        }
    }
}
ClientTransport rpcRequestTransport = new SocketRpcClient();
RpcServiceProperties rpcServiceConfig = RpcServiceProperties.builder()
        .group("test2").version("version2").build();
RpcClientProxy rpcClientProxy = new RpcClientProxy(rpcRequestTransport, rpcServiceConfig);
HelloService helloService = rpcClientProxy.getProxy(HelloService.class);
String hello = helloService.hello(new Hello("111", "222"));
System.out.println(hello);

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

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

Введение

Реализована настраиваемая RPC-структура на основе Netty, Kyro и Zookeeper (прилагается подробное описание процесса реализации и соответствующие обучающие материалы). Развернуть Свернуть
MulanPSL-1.0
Отмена

Обновления

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

Участники

все

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

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