Начало работы с Dubbo (2) — простая практика

задняя часть MySQL ZooKeeper Dubbo

Автор: 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Такой терминал мониторинга также может более интуитивно понимать распределение и работу всей прикладной службы.