Чтобы поговорить о dubbo, давайте сначала разберемся с RPC:
концепция:
RPC (удаленный вызов процедур): удаленный вызов процедур — это протокол, который запрашивает услуги из удаленной компьютерной программы через сеть, не зная базовой сетевой технологии. Это делает вызов удаленной программы локальным, как если бы он вызывал локальную программу.
Протокол RPC предполагает, что существует какой-то транспортный протокол, такой как TCP или UDP, для передачи информационных данных между взаимодействующими программами. В модели сетевой связи OSI (семиуровневая модель) RPC охватывает транспортный уровень и прикладной уровень. RPC упрощает разработку приложений, включая сетевое распределенное мультипрограммирование.
Процесс вызова RPC:
-
Клиент вызывает службу как локальную службу
-
Клиентская заглушка действует как прокси, а затем обрабатывает вызов и параметры вызова.
-
Клиентская заглушка отправляет вызовы удаленной системе по TCP или UDP.
-
Серверная заглушка обрабатывает вызовы и параметры, отправленные клиентской заглушкой.
-
Заглушка сервера вызывает реальную услугу, предоставляемую
-
Заглушка сервера обрабатывает ответ и отправляет его клиенту.
Dubbo
1. Что такое даббо:
Dubbo — это базовая структура решения Alibaba по управлению на основе сервисов SOA.Это распределенная платформа сервисов, предназначенная для предоставления высокопроизводительных и прозрачных решений удаленного вызова RPC-сервисов и решений по управлению сервисами SOA.
soa: «Сервис-ориентированная архитектура», которая обеспечивает архитектурный стиль и концепцию, а не технологию или продукт. SOA выступает за инкапсуляцию бизнес-функций различных приложений в «сервисы» и их размещение, которые обычно предоставляются в виде интерфейсов и контрактов и предоставляются внешним приложениям (посредством обмена сообщениями) для достижения цели повторного использования различных систем.
2. Схема технической архитектуры Dubbo выглядит следующим образом:
Давайте объясним эту архитектурную диаграмму:
-
а. Потребители потребительских услуг (платят деньги), поставщики услуг (дают деньги) и Контейнерные сервисные контейнеры (где получают деньги).
-
б) сначала запускает сервис-провайдер, а потом регистрирует сервис (реестр).
-
в) Монитор Это мониторинг. Пунктирная линия на рисунке показывает, что Потребитель и Провайдер отправляют сообщения на Монитор асинхронно. Потребитель и Провайдер будут хранить информацию на локальном диске, и информация будет отправляется один раз в среднем 1 минуту. Мониторы являются необязательными для всей архитектуры.
-
г. Функцию Монитор нужно настраивать отдельно.Если она не настроена или не настроена, если Монитор зависнет, это не повлияет на вызов службы.
3. Процесс вызова потребителя услуги Dubbo
На приведенном выше рисунке показан основной процесс потребления услуги:
Во-первых, метод private void init() класса ReferenceConfig сначала проверит и инициализирует всю информацию о конфигурации, а затем вызовет private T createProxy(Map map) для создания прокси.Покупатель, наконец, получает прокси службы, который реализуется путем вызова интерфейса протокола в createProxy.Метод Invoker refer(тип класса, URL-адрес) генерирует экземпляр Invoker (как показано красным на рисунке выше), который является ключом к потреблению службы. Затем пропустите Invoker через ProxyFactory. Фабрика прокси преобразуется в интерфейс, требуемый клиентом (например, HelloWorld ), создает прокси службы и возвращает его.
Процесс инициализации потребителя
-
1. Инкапсулировать информацию, на которую ссылается сервис, в URL-адрес и зарегистрировать его в центре регистрации zk;
-
2. Мониторинг онлайн и оффлайн сервисов регистрационного центра;
-
3. Подключитесь к поставщику услуг и создайте объект NettyClient;
-
4. Упаковать информацию в цепочку вызовов потребителя DubboInvoker, создать служебный прокси экземпляра потребителя Invoker и вернуть его;
Процесс ссылки на услугу на стороне потребителя
-
1. После стратегии балансировки нагрузки звоните провайдеру;
-
2. Выберите URL-адрес одного из сервисов, чтобы установить соединение с провайдером netty, используйтеProxyFactory создает удаленную связь или локальную связь, Invoker отправляет ее на сетевой сервер.;
-
3. После получения сервером информации об Invoker он находит соответствующий локальный Invoker и обрабатывает запрос Invocation;
-
4. Получить результаты асинхронной или синхронной обработки;
-
Асинхронный Возвращаемое значение не требуется: вызовите метод ExchangeClient.send() напрямую;
-
Синхронизация требует возвращаемого значения: используйте метод ExchangeClient.request(), верните ResponseFuture и заблокируйте, пока сервер не вернет результат ответа;
Самый простой пример даббо
Пакеты, требуемые как поставщиком услуг, так и потребителем (здесь мой новый проект maven — это проект pom, а общие зависимости проекта записываются в pom.xml)
Общая структура проекта
Содержимое файла pom.xml:
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.test</groupId>
<artifactId>dubbo-demo</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>pom</packaging>
<properties>
<motan.version>0.3.0</motan.version>
<!-- 在阿里巴巴内部广泛使用的GA版本为:2.4.9,强烈推荐此版本 -->
<dubbo.version>2.5.3</dubbo.version>
<dubbox.version>2.8.4</dubbox.version>
<spring.version>4.3.6.RELEASE</spring.version>
<java.version>1.7</java.version>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<dependencies>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>dubbo</artifactId>
<version>2.5.3</version>
<exclusions>
<exclusion>
<groupId>org.springframework</groupId>
<artifactId>spring</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>com.github.sgroschupf</groupId>
<artifactId>zkclient</artifactId>
<version>0.1</version>
</dependency>
<!-- spring相关 -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-beans</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aop</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-tx</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-orm</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context-support</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-test</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jms</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjrt</artifactId>
<version>1.6.11</version>
</dependency>
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjweaver</artifactId>
<version>1.6.11</version>
</dependency>
</dependencies>
<modules>
<module>demo-api</module>
<module>dubbo-consumer</module>
<module>dubbo-provider</module>
</modules>
</project>
скопировать код
Определите интерфейс службы в demo-api (обратите внимание, что и поставщик услуг, и потребитель должны зависеть от этого проекта).
package com.test;
public interface DemoService{
String sayHello(String name);
}
скопировать код
реализация поставщика услуг
Структура проекта
реализовать интерфейс
package com.test;
import org.springframework.stereotype.Service;
import com.test.DemoService;
@Service("demoService")
public class DemoServiceImpl implements DemoService{
@Override
public String sayHello(String name) {
// TODO Auto-generated method stub
return name;
}
}
скопировать код
Объявите открытую службу:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:dubbo="http://code.alibabatech.com/schema/dubbo"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://code.alibabatech.com/schema/dubbo
http://code.alibabatech.com/schema/dubbo/dubbo.xsd">
<!-- 提供方应用信息,用于计算依赖关系 -->
<dubbo:application name="dubbo_provider" />
<!-- 使用zookeeper注册中心暴露服务地址 -->
<dubbo:registry address="zookeeper://127.0.0.1:2181" />
<!-- 用dubbo协议在20880端口暴露服务 -->
<dubbo:protocol name="dubbo" port="20880" />
<!-- 声明需要暴露的服务接口 -->
<dubbo:service interface="com.test.DemoService" ref="demoService" />
</beans>
скопировать код
Отсканируйте аннотацию службы в springmvc.xml и импортируйте соответствующую конфигурацию dubbo в dubbo-provider.xml.
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans" xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:util="http://www.springframework.org/schema/util" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-4.0.xsd
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-4.0.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-4.0.xsd
http://www.springframework.org/schema/util
http://www.springframework.org/schema/util/spring-util-4.0.xsd"
default-autowire="byName">
<aop:aspectj-autoproxy />
<context:component-scan base-package="com.test" />
<import resource="classpath:dubbo-provider.xml" />
</beans>
скопировать код
Загрузите конфигурацию Spring и запустите службу:
package com.test;
import java.io.IOException;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class Test {
public static void main(String[] args) throws Exception {
ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("classpath:springmvc.xml");
context.start();
System.out.println("Dubbo provider start...");
try {
System.in.read(); // 按任意键退出
} catch (IOException e) {
e.printStackTrace();
}
}
}
скопировать код
реализация потребителя услуг
Структура проекта
Объявите службы, которые будут использоваться, в dubbo-consumer.xml.
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:dubbo="http://code.alibabatech.com/schema/dubbo"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://code.alibabatech.com/schema/dubbo
http://code.alibabatech.com/schema/dubbo/dubbo.xsd ">
<!-- 消费方应用名,用于计算依赖关系,不是匹配条件,不要与提供方一样 -->
<dubbo:application name="dubbo_consumer" />
<!-- 使用multicast广播注册中心暴露发现服务地址 -->
<dubbo:registry protocol="zookeeper" address="zookeeper://127.0.0.1:2181" />
<!-- 生成远程服务代理,可以和本地bean一样使用demoService -->
<dubbo:reference id="demoService" interface="com.test.DemoService" />
</beans>
скопировать код
Отсканируйте аннотацию службы в springmvc.xml и импортируйте соответствующую конфигурацию dubbo в dubbo-consumer.xml.
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans" xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:util="http://www.springframework.org/schema/util" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-4.0.xsd
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-4.0.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-4.0.xsd
http://www.springframework.org/schema/util
http://www.springframework.org/schema/util/spring-util-4.0.xsd"
default-autowire="byName">
<aop:aspectj-autoproxy />
<context:component-scan base-package="com.test" />
<import resource="classpath:/dubbo-consumer.xml" />
</beans>
скопировать код
Загрузите конфигурацию Spring и вызовите службу:
package com.test;
import java.io.IOException;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class Test {
public static void main(String[] args) {
ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext(new String[] { "classpath:springmvc.xml" });
context.start();
DemoService demoService = (DemoService) context.getBean("demoService");
System.out.println(demoService.sayHello("哈哈哈"));
try {
System.in.read();
} catch (IOException e) {
e.printStackTrace();
}
}
}
скопировать код
Вызов завершается успешно, если появляются следующие результаты
Через фон управления dubbo-admin вы можете увидеть поставщика и потребителя услуги.
провайдер:
потребитель:
Рекомендуемое чтение
-
Полный набор обучающих видеоресурсов на 2018 год собран! Поделитесь бесплатно!
-
[Совместное использование ресурсов] Видеоруководство по базовой технологии Docker
-
[Совместное использование ресурсов] Ant Class 2 без шифрования — видеоруководство по Java
-
[Совместное использование ресурсов] Практический видеокурс Spring Cloud Microservices
Эта официальная учетная запись время от времени будет давать вам преимущества, включая учебные ресурсы и т. д., так что следите за обновлениями!
Если push-контент сейчас не нужен для работы, вы можете сначала перенаправить его в «Моменты» или «Избранное», чтобы легко найти его при использовании.
Также добро пожаловатьОбратите внимание на публичный аккаунт илиДобавить WeChat Друзья, учитесь друг у друга.