Ставьте лайк и смотрите снова, формируйте привычку и ищите в WeChat [Третий принц Ао Бин] Подпишитесь на этого программиста, который любит писать о чувствах.
эта статьяGitHub github.com/JavaFamilyВключено, и есть полные тестовые площадки, материалы и мой цикл статей для интервью с производителями первой линии.
предисловие
В ближайшее время Ао Бин отправит вас в увлекательное путешествие в Даббо! Да, я собираюсь начать писать серию статей для Dubbo. Ранее я писал статью об эволюции архитектуры, в которой также объясняется популярность и важность микросервисов. Далее в сервис-ориентированном сценарии следует взаимодействие между сервисами. заключается в том, что связь между сервисами - это RPC, когда дело доходит до RPC, мы не можем обойтись без нашего Dubbo.
В этой статье Ао Бин приведет вас сюда первым.ОбзорВообще говоря, если вы знакомы с фреймворком, вы должны сначала узнать, что эта штука делает, какие болевые точки она может решить, каковы основные модули и каков общий рабочий процесс.
Как только вы придете, вы застрянете в деталях и не сможете выбраться.Вероятность того, что волна DFS будет уволена напрямую, достигает 99,99%, поэтому этот теплый человек Ао Бинг проведет вас через это первым.Введение в Dubbo, общее разделение, основные компоненты и общий процесс вызова.
Мало того, я проведу вас через все это, если вы хотите, чтобы выРазработайте инфраструктуру RPC и посмотрите, какие функции вам нужны? После этой волновой операции вы обнаружите, как Dubbo разработан с тем, что я думаю? Это действительно герой!
И я также напишу простую версию реализации RPC Framework, чтобы все понять, как работает RPC.
Если вы все еще не знаете, что такое Dubbo после прочтения этой статьи, я могу уговорить меня бросить курить.
Давайте сначала поговорим о том, что такое RPC Я обнаружил, что многие студенты не очень хорошо понимают эту концепцию, а некоторые люди сравнивают RPC и HTTP. Итак, давайте сначала поговорим о том, что такое RPC.
Что такое RPC
RPC, удаленный вызов процедур — это удаленный вызов процедуры. Удаленный вызов процедуры — это, по сути, локальный вызов процедуры. Знакомы ли вы с локальным вызовом процедуры?
Думая о тех зеленых годах, вы были заняты последним домашним заданием в университете, и вы покоряли систему управления библиотекой Звонок называется локальным вызовом процедуры.
Если вы скажете мне, что ваша система в библиотеке была ориентирована на обслуживание, и вы совершали удаленные звонки, я могу только сказать вам, что у вас что-то есть.
Проще говоря, внутренние вызовы методов на локальном компьютере можно назвать локальными вызовами процедур, а удаленный вызов процедуры на самом деле относится к тому факту, что вы локально вызываете метод на удаленном компьютере, что является удаленным вызовом процедуры.
Таким образом, RPC нацелен на локальные вызовы процедур.Что касается того, как RPC вызывает удаленные методы, он может использовать HTTP или пользовательский протокол на основе TCP.
Таким образом, ваше обсуждение RPC и HTTP не является иерархическим.
иПлатформа RPC предназначена для реализации чего-то вроде этого маленького помощника, цель которого состоит в том, чтобы мы могли использовать удаленные вызовы так же просто и удобно, как и локальные вызовы, и решить некоторые проблемы, которые возникнут при удаленных вызовах., чтобы пользователи могли использовать его без восприятия, комфорта, спокойствия и удовлетворения.
Как спроектировать инфраструктуру RPC
После того, как вы поняли, что такое RPC и для чего предназначена RPC-инфраструктура, давайте подумаем, если вы позволите вам создать RPC-инфраструктуру, как вы ее спроектируете?
потребители услуг
Сначала мы смотрим на то, что нужно со стороны потребителя (т. е. вызывающей стороны).Прежде всего, потребитель программирует интерфейс, поэтому нам нужно знать, какие интерфейсы можно вызывать.общественный пакет jarспособ поддерживать интерфейс.
Теперь я знаю какие интерфейсы можно вызывать, а есть только интерфейсы.Откуда конкретная реализация? Этим вопросом должен заниматься фреймворк! Поэтому такжеНужен класс прокси, пусть потребители просто приспосабливаются и оставляют все в покое, яАгент сделает это за вас.
Кстати, вам также нужно сообщить прокси, какой метод вы вызываете и какое значение параметра.
Хотя агент делает это за вас, ему также необходимо знать, на какой машине он должен вызвать удаленный метод, поэтомуТребуется реестр,чтобы звонящий знал к каким провайдерам можно звонить из реестра.Вообще говоря провайдеров больше одного.Ведь если повесить трубку только один,то его уже нет.
Таким образом, провайдер, как правило, представляет собой развертывание кластера, и вызывающая сторона должна передатьбалансировки нагрузкидля выбора вызова, что можно сделать с помощьюопределенные стратегииНапример, тот же компьютерный зал называется первым.
Конечно, должны бытьОтказоустойчивость, в конце концов, это удаленный вызов, сеть ненадежна, поэтому может потребоваться повторная попытка или что-то в этом роде.
и поставщик услугзаключить соглашение, например, мы просто используем HTTP для общения, то есть все должны говорить одно и то же, иначе они могут не понять.
Конечно, сериализация необходима, ведь наша локальная структура «стерео» и должна быть сериализована, прежде чем ее можно будет передать, поэтому нам также нужноОбычный формат сериализации.
И некоторые фильтры, возможно, потребуется добавить в середине процесса, чтобы выполнить волну унифицированной обработки, например подсчет вызовов и т. д.
Это все, что должна делать инфраструктура, чтобы потребители не знали, что они вызывают нативные методы.
поставщики услуг
поставщики услуг должныРеализовать соответствующий интерфейсЭто не подлежит сомнению.
Затем вам нужно открыть свои собственные интерфейсы дляЗарегистрируйтесь в реестре, демонстрируя услуги, которые он может предоставить.
Затем есть запрос потребителя, который нужно обработать, провайдер должен использовать, а потребительСогласованное соглашениечтобы обработать этот запрос, затем выполнитедесериализовать.
Сериализованный запрос долженБросьте его в пул потоков для обработки, поток находит соответствующий вызов реализации после получения этого запроса, а затемвернуть результат.
Регистрационный центр
На самом деле центр регистрации мы все упоминали выше, эта штука равнозначна платформе, на ней каждый выставляет свои сервисы, а также знает, какие сервисы с него можно вызывать.
Конечно, его также можно использовать в качестве центра конфигурации для централизации обработки конфигурации и уведомления подписчиков о динамических изменениях.
Мониторинг эксплуатации и обслуживания
Перед лицом многочисленных сервисов точный мониторинг и удобная эксплуатация и техническое обслуживание имеют важное значение.
Многие разработчики не осознают этого во время разработки.Когда вы действительно подключаетесь к сети и начинаете эксплуатацию и техническое обслуживание, если у вас нет хороших мер мониторинга и быстрых методов эксплуатации и обслуживания, вы будете слепы! В растерянности, жду критики!
Такая боль, не спрашивайте меня, почему я знаю, я просто знаю!
Резюме
Подведем итоги. Примерно то, что должна сделать инфраструктура RPC, — это согласовать протокол связи, сериализованный формат, некоторые механизмы отказоустойчивости, стратегии балансировки нагрузки, операции мониторинга и реестр!
Простая реализация фреймворка RPC
Правильно, это простая реализация. Мы много думали, когда думали о том, как спроектировать RPC-фреймворк. Это функциональные требования производственной среды. Мы Демонстрация, цель состоит в том, чтобы выделить ключевые функции RPC-фреймворка -Реализовать удаленные звонки.
Так что нет ничего, и я использую псевдокод, чтобы показать это, на самом деле я удалил некоторые защитные и ограничительные коды, потому что это слишком выглядит и не интуитивно понятно, и для этого нужна куча try-catch или что-то в этом роде. Я вырезал некоторые, чтобы сразу перейти к делу.
Давай сделаем это!
Сначала мы определяем интерфейс и простую реализацию.
public interface AobingService {
String hello(String name);
}
public class AobingServiceImpl implements AobingService {
public String hello(String name) {
return "Yo man Hello,I am" + name;
}
}
Затем мы реализуем функцию поставщика услуг, предоставляющую услугу.
public class AobingRpcFramework {
public static void export(Object service, int port) throws Exception {
ServerSocket server = new ServerSocket(port);
while(true) {
Socket socket = server.accept();
new Thread(new Runnable() {
//反序列化
ObjectInputStream input = new ObjectInputStream(socket.getInputStream());
String methodName = input.read(); //读取方法名
Class<?>[] parameterTypes = (Class<?>[]) input.readObject(); //参数类型
Object[] arguments = (Object[]) input.readObject(); //参数
Method method = service.getClass().getMethod(methodName, parameterTypes); //找到方法
Object result = method.invoke(service, arguments); //调用方法
// 返回结果
ObjectOutputStream output = new ObjectOutputStream(socket.getOutputStream());
output.writeObject(result);
}).start();
}
}
public static <T> T refer (Class<T> interfaceClass, String host, int port) throws Exception {
return (T) Proxy.newProxyInstance(interfaceClass.getClassLoader(), new Class<?>[] {interfaceClass},
new InvocationHandler() {
public Object invoke(Object proxy, Method method, Object[] arguments) throws Throwable {
Socket socket = new Socket(host, port); //指定 provider 的 ip 和端口
ObjectOutputStream output = new ObjectOutputStream(socket.getOutputStream());
output.write(method.getName()); //传方法名
output.writeObject(method.getParameterTypes()); //传参数类型
output.writeObject(arguments); //传参数值
ObjectInputStream input = new ObjectInputStream(socket.getInputStream());
Object result = input.readObject(); //读取结果
return result;
}
});
}
}
Что ж, эта RPC-инфраструктура настолько хороша, неужели она очень проста? этоВызывающий передает имя метода, тип параметра и значение параметра, после получения таких параметров провайдер вызывает соответствующий метод и возвращает результат.! Это удаленный вызов процедуры.
Давайте посмотрим, как использовать
//服务提供者只需要暴露出接口
AobingService service = new AobingServiceImpl ();
AobingRpcFramework.export(service, 2333);
//服务调用者只需要设置依赖
AobingService service = AobingRpcFramework.refer(AobingService.class, "127.0.0.1", 2333);
service.hello();
Это выглядит хорошо, но очень грубо, и здорово использовать его в качестве демонстрации, чтобы лучше понять его!
Давайте посмотрим на Dubbo дальше! Подавайте основное блюдо!
Знакомство с Даббо
Dubbo — это RPC-фреймворк на основе Java, исходный код которого был открыт Alibaba в 2011 году. Какое-то время все было тихо, но некоторые другие компании все еще используют Dubbo и сами расширяют его, например, Dangdang Dubbox и Netease Koala’s Dubbok.
Но в 2017 году Alibaba возобновила обслуживание Dubbo. В 2017 году оно вошло в тройку самых популярных китайских программ с открытым исходным кодом в Open Source China 2017.
В 2018 году он объединился с Dubbox и вошел в инкубатор Apache, а после выпуска в 2019 году официально стал проектом верхнего уровня Apache.
В настоящее время основным обслуживанием сообщества Dubbo являются версии 2.6.x и 2.7.x. Версия 2.6.x в основном основана на исправлениях ошибок и небольшом количестве функциональных улучшений. Это стабильная версия.
В то время как 2.7.x является основной разрабатываемой версией, новые функции и оптимизации обновляются и добавляются, а выпуск версии 2.7.5 считается вехой для Dubbo, и мы проанализируем его позже.
Он реализует прокси-вызовы RPC, ориентированные на интерфейс, и может взаимодействовать с такими компонентами, как ZooKeeper, для достижения функций регистрации и обнаружения служб, а также имеет механизмы балансировки нагрузки и отказоустойчивости.
Общая архитектура Дуббо
Давайте сначала посмотрим на картинку с официального сайта.
Ben C тепло объяснил роль каждого узла на приведенном выше рисунке.
узел | Описание роли |
---|---|
Consumer | Потребители услуг, которым необходимо вызывать удаленные службы |
Registry | Регистрационный центр |
Provider | поставщик услуг |
Container | Контейнер, в котором работает служба |
Monitor | Центр мониторинга |
Позвольте мне кратко рассказать об общем процессе.Прежде всего, поставщик услугПровайдер запускается и регистрируется в реестреуслуги, которые вы можете предоставить.
потребители услугПотребитель инициирует подписку на рееструслуги, которые вам нужны. Затем реестр уведомляет потребителя о метаинформации поставщика, после чего потребитель может получить адрес поставщика из реестра.Выберите провайдера для прямого вызова через балансировку нагрузки.
Если метаданные поставщика услуг изменятся позжеРеестр передаст изменения потребителям услуг..
И поставщики услуг, и потребители будут записывать в память количество и время вызовов, а затемРегулярно отправлять статистические данные в центр мониторинга.
некоторые примечания
во-первыхЦентр регистрации и центр мониторинга не являются обязательными, можно прописать прямо в конфигурационном файле без центра мониторинга и регистрации, а потом соединить провайдера и потребителя напрямую.
Тогда реестр, провайдер и потребитель — это длинные соединения, а не длинные соединения со стороной мониторинга, иПотребитель напрямую звонит провайдеру, минуя реестр.
даже еслиВремя простоя центра регистрации и центра мониторинга не повлияет на провайдеров и потребителей, которые уже работают в штатном режиме., так как потребитель имеет локально кэшированную информацию о поставщике.
Многоуровневая архитектура Дуббо
Как правило, Dubbo делится на три слоя, если разделить каждый слой, то всего получается десять слоев. Не бойтесь, это всего лишь десять слоев. Бен С проведет вас через это. Сначала у вас будет общее впечатление, а затем статья С поведет вас глубже.
Три основных уровня — это бизнес (бизнес-уровень), уровень RPC и удаленное взаимодействие, которые также делятся на уровень API и уровень SPI.
Разделение на три слоя на самом деле означает то же самое, что и известная нам сетевая многоуровневость.Только при наличии четкой иерархии и четких границ ответственности возможно более эффективное расширение..
И разделение уровня API и уровня SPI является одним из успехов Dubbo.Принять дизайн микроядра + расширение SPI, чтобы стороны доступа с особыми потребностями могли настраивать расширения и выполнять индивидуальную вторичную разработку.
Далее давайте посмотрим, что делает каждый слой.
-
Сервис, бизнес-уровень — это уровень бизнес-логики, который мы разработали.
-
Config, уровень конфигурации, в основном вращается вокруг ServiceConfig и ReferenceConfig для инициализации информации о конфигурации.
-
Прокси, прокси-уровень, поставщик услуг или потребитель будут генерировать прокси-класс, чтобы сделать интерфейс службы прозрачным, а прокси-уровень выполняет удаленные вызовы и возвращает результаты.
-
Регистрация, уровень регистрации, инкапсулирует регистрацию и обнаружение службы.
-
Кластер, уровень маршрутизации и отказоустойчивости кластера, отвечает за выбор конкретного узла вызова, обработку особых требований к вызову и принятие мер отказоустойчивости при сбоях удаленных вызовов.
-
Монитор, уровень мониторинга, отвечает за мониторинг времени и количества статистических вызовов.
-
Portocol, уровень удаленных вызовов, в основном инкапсулирует вызовы RPC и в основном отвечает за управление Invoker.Invoker представляет собой абстрактно инкапсулированный исполнительный орган, который будет подробно объяснен позже.
-
Exchange, уровень обмена информацией, используется для инкапсуляции модели запрос-ответ, от синхронной до асинхронной.
-
Транспорт, сетевой транспортный уровень, абстрагирует унифицированный интерфейс сетевой передачи, так что пользователи могут использовать Netty, если они хотят использовать Netty, и использовать Mina, если они хотят использовать Mina.
-
Serialize, слой сериализации, сериализует данные в двоичные потоки и, конечно же, десериализует.
SPI
Позвольте мне упомянуть SPI (интерфейс поставщика услуг), который представляет собой механизм обнаружения служб, встроенный в JDK.Это полностью разделяет интерфейс и конкретную реализацию.. Мы только объявляем интерфейс, а конкретный класс реализации выбирается в конфигурации.
В частности, вы определяете интерфейс, а затем вMETA-INF/services
Под содержаниемПоместите текстовый файл с тем же именем, что и интерфейс, содержимое файлаКласс реализации интерфейса, несколько классов реализации разделяются символами новой строки.
Таким образом, конфигурация определяет, какую реализацию использовать!
И в Dubbo SPI также внесены некоторые улучшения, о которых мы поговорим позже из-за ограниченного места.
Процесс вызова Даббо
Я уже рассказал, для чего предназначен каждый уровень. Теперь давайте снова пройдемся по процессу вызова, углубим ваше понимание Dubbo и позволим соединить точки знаний воедино.
Давайте начнем с поставщика услуг и посмотрим, как он работает.
процесс предоставления услуги
Сначала запускается Провайдер через компонент Proxy по заданному протоколу. Протокол инкапсулирует интерфейс, который должен быть представлен в Invoker.Invoker является основным компонентом Dubbo и представляет собой исполняемый файл.
Затем заверните его через Экспортер, который должен выставить свой собственный слой в реестре, а затем зарегистрируйте Экспортер в реестре через Реестр. Это общий процесс раскрытия услуги.
процесс потребления
Далее давайте посмотрим на процесс вызова потребителя (процесс предоставления доступа к серверу также показан на рисунке, который на самом деле представляет собой довольно полную блок-схему).
Сначала потребитель начинает тянуть метаинформацию поставщика услуг из реестра, а затем процесс вызова также начинается с Прокси, ведь прокси требуется, чтобы он был незаметен.
Прокси содержит объект Invoker. После вызова Invoker ему необходимо получить список Invoker всех вызываемых удаленных служб из Каталога через Кластер. Если настроены некоторые правила маршрутизации, например, интерфейс может вызывать только определенный узел, затем фильтровать список вызывающих.
Остальные Invokers выбираются для балансировки нагрузки через LoadBalance. Затем выполните некоторую статистику через фильтр, а затем выполните передачу данных через клиент, например, используя Netty для передачи.
Передача должна быть построена через интерфейс кодека, а затем сериализована. Наконец отправлены в соответствующий поставщик услуг.
Поставщик услуг также обработает протокол кодека после его получения, а затем десериализует и отправит запрос в пул потоков для обработки. Поток найдет соответствующий экспортер в соответствии с запросом, и поиск экспортера на самом деле находит Invoker, но также будут слои фильтров.После послойных цепочек фильтров, наконец, вызывается класс реализации, и результат вернулся таким же образом.
Завершите весь процесс вызова!
Суммировать
На этот раз Ao Bing заставил всех понять, что такое RPC, а затем спланировал, какие компоненты нужны для волны RPC-фреймворков, а затем реализовал простой RPC-фреймворк с кодом.
Затем я провел всех, чтобы понять историю разработки, общую архитектуру, многоуровневую архитектуру проектирования и то, что делает каждый компонент Dubbo, а затем провел всех через общий процесс вызова.
мне так тепло!
Dubbo Я сделаю несколько глав, чтобы продолжить в ближайшее время, и, наконец, будет версия dubbo с интервью, мы подождем и увидим.
Я Ао Бин, чем больше ты знаешь, тем больше ты не знаешь, увидимся в следующий раз!
талантнаш【Три подряд】Это самая большая движущая сила для создания Ao Bing.Если в этом блоге есть какие-либо ошибки и предложения, вы можете оставить сообщение!
Статья постоянно обновляется, вы можете искать в WeChat "Третий принц Ао Бин"Прочтите это в первый раз, ответьте [материал] Подготовленные мной материалы интервью и шаблоны резюме крупных заводов первой линии, эта статьяGitHub github.com/JavaFamilyОн был включен, и есть полные тестовые сайты для интервью с крупными заводами.Добро пожаловать в Star.