Автор: No Dishwashing Studio - Marklux
Источник:Начало работы с Dubbo (2) — простая практика
Все права принадлежат автору, при перепечатке указывать источник
После понимания того, что такое распределенная структура, нам нужно попрактиковаться, чтобы понять, как работает вся система.
В целях обучения в этой статье делается попытка использовать dubbo для создания простой распределенной службы и использовать dubbokeeper для мониторинга службы.
Ссылка из:болтать о даббоа такжеСамый простой даббо туториал
Готов к работе
Прежде чем официально использовать даббо, вам нужно подготовить две вещи:
1. Служба реестра (ZooKeeper)
И потребительская, и сервисная стороны dubbo должны быть зарегистрированы в едином центре регистрации, прежде чем их можно будет использовать.Просто создайте зоопарк.Конечно, вы также можете использовать другие центры регистрации и интегрировать их.
Процесс строительства зоопарка очень прост, см.эта статьяВот и все (просто самый простой автономный вариант, не сложный).
2. Сервисный центр мониторинга (dubbokeeper)
Для контроля работы всего распределенного сервиса лучше всего иметь приложение для визуального управления и мониторинга, которое разработано командой dubboclub.dubbokeeper, конечно, вы также можете использовать официальный dubbodubboadmin
проект.
Поскольку развертывание dubbokeeper немного сложное, я кратко опишу его здесь.Обратите внимание, что программное обеспечение для мониторинга не обязательно, но для того, чтобы увидеть эффект от работы службы, рекомендуется установить его.
Справочник по процессу развертыванияэта статья
Скачать исходный код
Во-первых, вам нужно получить исходный код dubbokeeper, который можно получить на github, адрес git:
https://github.com/dubboclub/dubbokeeper
Ниже мы предполагаем, что dubbokeeper клонирован в~/dubbokeeper
в этом каталоге.
Изменить настройку
Перед этим вам сначала нужно определить, какую базу данных вы хотите использовать. В настоящее время Dubbokeeper поддерживает три решения для хранения данных: MySQL, MongoDB и Lucene. Мы используем MySQL в качестве примера для развертывания.
Сначала заполните~/dubbokeeper/conf/dubbo-mysql.properties
Файл конфигурации, ниже приводится описание наиболее важных элементов конфигурации:
dubbo.registry.address=zookeeper://localhost:2181 #注册中心地址
dubbo.protocol.name=dubbo
dubbo.protocol.port=20884 #dubbo服务端口
dubbo.monitor.mysql.url=jdbc:mysql://localhost:3306/dubbo-monitor #mysql服务地址
dubbo.monitor.mysql.username=root
dubbo.monitor.mysql.password=secret #用户名及密码
рядом с заполнением~/dubbokeeper/dubbokeeper-ui/src/main/resources/dubbo.properties
Такие параметры, как реестр и тип веб-сервера в файле конфигурации.
Инициализировать базу данных
Создайте базу данных mysql и запустите~/dubbokeeper/doc/storage/mysql/sql/application.sql
Создайте структуру таблицы.
Скомпилировать и упаковать
воплощать в жизнь~/dubbokeeper/install-mysql.sh
упакованный, который в конечном итоге сгенерируетtarget
выходной каталог.
начать развертывание
На этом шаге вам нужно запустить несколько служб перед развертыванием приложения, обратите внимание на порядок
Во-первых, вам нужно запустить службу zookeeper.Обратите внимание, что конфигурация порта должна соответствовать файлу конфигурации.
выполнить следующийtarget
в каталогеmysql-dubbokeeper-server/bin/start-mysql.sh
Запустите службу хранилища.
наконецtarget
в каталогеmysql-dubbokeeper-ui
Скопируйте военный пакет вtomcat(自己部署)
В каталоге webapps start tomcat автоматически распакуется и установится, а затем получит доступhttp://localhost:8080/dubbokeeper-ui-1.0.1
Когда вы увидите следующий интерфейс, установка прошла успешно.
Создать API
Теперь официально приступайте к программированию. Мы будем использовать dubbo для создания очень простого примера только с одним потребителем и одним поставщиком услуг.
Первый шаг — создать определение обмена данными, на которое должны полагаться обе стороны, и реализовать его через интерфейс.
Создать мавен проектmsa-demo-api
,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.marklux</groupId>
<artifactId>msa-demo-api</artifactId>
<version>1.0-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>
</project>
затем вcom.marklux.dubbo.demo
пакет добавленDemoService
интерфейс, код выглядит следующим образом:
package com.marklux.dubbo.demo;
/**
* Created by lumin on 18/5/15.
*/
public interface DemoService {
String sayHello(String name);
}
Последующие поставщики услуг реализуют услуги в соответствии с этим интерфейсом, а потребители вызывают услуги в соответствии с этим интерфейсом. (несколько похоже на файл IDL в Thrift)
Создать поставщика услуг
Создайте новый модуль mavenmsa-demo-provider
, реализоватьDemoService
Служить. Структура модуля следующая:
Проэктpom.xml
необходимо добавить кmsa-demo-api
Зависимости модуля:
<?xml version="1.0" encoding="UTF-8"?>
<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.marklux</groupId>
<artifactId>msa-demo-provider</artifactId>
<version>1.0-SNAPSHOT</version>
<dependencies>
<dependency>
<groupId>com.marklux</groupId>
<artifactId>msa-demo-api</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
</dependencies>
</project>
напиши первымDemoServiceImpl
Для реализации содержимого службы код выглядит следующим образом:
package com.marklux.dubbo.demo.impl;
import com.marklux.dubbo.demo.DemoService;
import org.springframework.stereotype.Service;
/**
* Created by lumin on 18/5/15.
*/
@Service("demoService")
public class DemoServiceImpl implements DemoService {
public String sayHello(String name) {
return "Hello, " + name;
}
}
Заполните следующийmsa-demo-provider.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_provider" />
<!-- 使用zookeeper注册中心暴露服务地址 -->
<dubbo:registry address="zookeeper://127.0.0.1:2181" />
<!-- 用dubbo协议在20880端口暴露服务 -->
<dubbo:protocol name="dubbo" port="20880" />
<!-- 声明需要暴露的服务接口 -->
<dubbo:service interface="com.marklux.dubbo.demo.DemoService" ref="demoService" />
</beans>
затем заполнитеspringmvc.xml
, который используется для предоставления начального классаSpring
Конфигурация сервисного контейнера:
<?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.marklux.dubbo.demo" />
<import resource="classpath:msa-demo-provider.xml" />
</beans>
Наконец вcom.marklux.dubbo.demo.test
Добавьте в пакет тестовый класс запуска, чтобы запустить службу:
package com.marklux.dubbo.demo.test;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import java.io.IOException;
/**
* Created by lumin on 18/5/15.
*/
public class DemoServiceImplTest {
public static void main(String[] args) {
ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("classpath:spring-mvc.xml");
context.start();
System.out.println("Dubbo Service started....");
try {
System.in.read(); // 按任意键退出
} catch (IOException e) {
e.printStackTrace();
}
}
}
запускатьDemoServiceImplTest
После занятия сервис будет зарегистрирован и запущен, в это время вы можетеdubbokeeper
Статус услуги смотрите в:
создать потребителя
Наконец, создайте потребителя, который вызывает службу, и добавьте модуль maven.msa-demo-client
,pom.xml
То же, что и выше, добавив паруmsa-demo-api
зависимости модуля, обратите внимание, что это не требуетсяmsa-demo-provider
зависимость.
Структура модуля следующая:
Есть только один тестовый класс запуска, код такой:package com.marklux.dubbo.demo.test;
import com.marklux.dubbo.demo.DemoService;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import java.io.IOException;
/**
* Created by lumin on 18/5/15.
*/
public class DemoServiceConsumerTest {
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();
}
}
}
Не забудьте добавить файл конфигурации dubbomsa-demo-client.xml
и файл конфигурации Springspringmvc.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.marklux.dubbo.demo.DemoService" />
</beans>
<?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.marklux.dubbo.demo" />
<import resource="classpath:msa-demo-consumer.xml" />
</beans>
Все готово, начинайте сейчасDemoServiceConsumerTest
, вы можете видеть, что вызов прошел успешноDemoService
:
Его связанный статус также можно просмотреть в dubbokeeper:
резюме
На этом простейшая демонстрация вызова службы с использованием протокола dubbo завершена. Видно, что наиболее примечательной особенностью является то, что нет необходимости добавлять дополнительный код для вызова услуги, предоставляемой сервисной стороной в потребителе, и весь процесс вызова полностью прозрачен.
Кроме того, с помощьюdubbokeeper
Такой терминал мониторинга также может более интуитивно понимать распределение и работу всей прикладной службы.