Ali RPC framework DUBBO первый опыт

задняя часть Java EE Netty Dubbo gRPC

Недавно я изучил dubbo, распределенную RPC-инфраструктуру с открытым исходным кодом от Alibaba.Арендодатель написал демо, чтобы испытать функции dubbo.

быстрый старт

Фактически, официальная документация dubbo предоставила пример кода по использованию этой RPC-инфраструктуры, основанной на длинном соединении Netty. Арендодатель смотрит на эту структуру в основном для того, чтобы сделать некоторые технические резервы и понять структуру распределенной структуры RPC в современных микросервисах и пожарах сервисной сетки.

Конечно, даже если вы напишете даббо-демо, вы не сможете просто написать его невзначай. Если относиться к этому серьезно, может быть, когда-нибудь оно вам пригодится. Ниже приведена структура каталогов кода, написанного арендодателем:
dubboCode图схема dubboCode

Позвольте мне объяснить роль каждой модели один за другим,

  1. micro-service-dubbo-common: это общий инструментальный модуль, на который должны полагаться другие модели.
  2. micro-service-dubbo-dal: это модуль dao всего проекта, и здесь размещаются соответствующие коды для операций с базой данных.
  3. micro-service-dubbo-interface: это модуль общего интерфейса, который специально используется для объявления интерфейса, от которого одновременно зависят потребитель и поставщик.Это для разделенного и распределенного развертывания проекта. .
  4. micro-service-dubbo-model: это общедоступный модуль класса сущностей, не ограничивающийся моделью, соответствующей базе данных, но также DTO, VO и т. д.
  5. micro-service-dubbo-provider: поставщик услуг проекта.
  6. micro-service-dubbo-web: Потребитель проекта также является уровнем контроллера, который напрямую взаимодействует с внешним интерфейсом.

Кроме того, вам нужно добавить связанные зависимости в файл pom


                                                
<!--dubbo-->
<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>dubbo</artifactId>
    <version>${dubbo.version}</version>
</dependency>

<dependency>
    <groupId>com.101tec</groupId>
    <artifactId>zkclient</artifactId>
    <version>${zkclient_version}</version>
</dependency>

<dependency>
    <groupId>org.apache.zookeeper</groupId>
    <artifactId>zookeeper</artifactId>
    <version>${zookeeper_version}</version>
</dependency>

<dependency>
    <groupId>org.apache.curator</groupId>
    <artifactId>curator-framework</artifactId>
    <version>${curator_version}</version>
</dependency>


                                            

создание интерфейса

Поскольку это служба RPC, ей нужен интерфейс и класс реализации. Определение интерфейса здесь находится в нашем micro-service-dubbo-interface, а конкретная реализация создается здесь в провайдере В проекте арендодателя реализация DemoService создается в micro-service-dubbo-provider.


                                                
public interface DemoService {
    String sayHello(String name);

    public List getUsers();
}


                                            

                                                
@Service("demoService")
public class DemoServiceImpl implements DemoService {

    @Override
    public String sayHello(String name) {
        System.out.println("[" + new SimpleDateFormat("HH:mm:ss").format(new Date()) + "] Hello " + name + ", request from consumer: " + RpcContext
                .getContext().getRemoteAddress());
        return "Hello " + name + ", response from provider: " + RpcContext.getContext().getLocalAddress();
    }

    @Override
    public List getUsers() {
        List list = new ArrayList();
        User u1 = new User();
        u1.setName("hejingyuan");
        u1.setAge(20);
        u1.setSex("f");

        User u2 = new User();
        u2.setName("xvshu");
        u2.setAge(21);
        u2.setSex("m");


        list.add(u1);
        list.add(u2);

        return list;
    }
}


                                            

Затем pom.xml потребителя добавляет зависимость от этого интерфейса.Определение интерфейса здесь таково, что наш потребитель — micro-service-dubbo-web.


                                                
<dependency>
  <groupId>com.whforever</groupId>
    <artifactId>micro-service-dubbo-provider</artifactId>
    <version>1.0-SNAPSHOT</version>
</dependency>
<dependency>
    <groupId>com.whforever</groupId>
    <artifactId>micro-service-dubbo-interface</artifactId>
    <version>1.0-SNAPSHOT</version>
</dependency>


                                            

Когда у вас есть интерфейс, вам нужно его настроить.

Конфигурация интерфейса

Сначала опубликуйте интерфейс здесь, в файле provider. Создайте XML-файл с именем: dubbo-provider.xml.

содержание документа:


                                                
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:dubbo="http://code.alibabatech.com/schema/dubbo"
       xmlns="http://www.springframework.org/schema/beans"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.3.xsd
       http://code.alibabatech.com/schema/dubbo http://code.alibabatech.com/schema/dubbo/dubbo.xsd">

    <!-- provider's application name, used for tracing dependency relationship -->
    <dubbo:application name="demo-provider"/>

    <!-- use multicast registry center to export service -->
    <dubbo:registry protocol="zookeeper" address="127.0.0.1:2181" />

    <!-- use dubbo protocol to export service on port 20880 -->
    <dubbo:protocol name="dubbo" port="20880"/>

    <!-- service implementation, as same as regular local bean -->
    <bean id="demoProviderService" class="com.whforever.service.impl.DemoServiceImpl"/>

    <!-- declare the service interface to be exported -->
    <dubbo:service interface="com.whforever.service.DemoService" ref="demoProviderService"/>

</beans>


                                            

Очень просто, опубликуйте интерфейс, похожий на bean-компонент Spring.

Точно так же создайте файл dubbo-consumer.xml в файле ресурсов потребителя, то есть micro-service-dubbo-web. Содержание немного отличается.


                                                
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:dubbo="http://code.alibabatech.com/schema/dubbo"
       xmlns="http://www.springframework.org/schema/beans"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.3.xsd
       http://code.alibabatech.com/schema/dubbo http://code.alibabatech.com/schema/dubbo/dubbo.xsd">

    <!-- consumer's application name, used for tracing dependency relationship (not a matching criterion),
    don't set it same as provider -->
    <dubbo:application name="demo-consumer"/>

    <!-- use multicast registry center to discover service -->
    <!--<dubbo:registry address="multicast://224.5.6.7:1234"/>-->
    <dubbo:registry protocol="zookeeper" address="127.0.0.1:2181" />

    <!-- generate proxy for the remote service, then demoService can be used in the same way as the
    local regular interface -->
    <dubbo:reference id="demoConsumerService" check="false" interface="com.whforever.service.DemoService"/>

</beans>


                                            

Из приведенного выше видно, что протокол обнаружения регистрации этих двух файлов — zookeeper, поэтому вам необходимо запустить zookeeper до запуска службы.Начнется установка реестра Zookeeper

Подготовьтесь к тесту

Перед тестированием еще нужно немного поработать.

Для запуска провайдера требуется часть программы начальной загрузки, см. следующий код:


                                                    
public class ProviderMain {
    public static void main(String[] args) throws IOException {
        System.setProperty("java.net.preferIPv4Stack", "true");
        ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("dubbo-provider.xml");
        context.start();

        System.in.read(); // press any key to exit
    }
}


                                                

потребительский код


                                                    

@Controller
@RequestMapping("/")
public class IndexController {

    @Autowired
    DemoService demoService;

    @RequestMapping("/echo")
    @ResponseBody
    public String echo() {
        System.out.println(">>>>>>echo");
        return JSON.toJSONString(demoService.getUsers());
    }
}


                                                

бегать

Сначала запустите провайдер:


                                                    
[06/06/18 11:56:29:029 CST] main  INFO config.AbstractConfig:  [DUBBO] The service ready on spring started. service: com.whforever.service.DemoService, dubbo version: 2.6.1, current host: 192.168.1.120
[06/06/18 11:56:30:030 CST] main  INFO config.AbstractConfig:  [DUBBO] Export dubbo service com.whforever.service.DemoService to local registry, dubbo version: 2.6.1, current host: 192.168.1.120
[06/06/18 11:56:30:030 CST] main  INFO config.AbstractConfig:  [DUBBO] Export dubbo service com.whforever.service.DemoService to url dubbo://192.168.1.120:20880/com.whforever.service.DemoService?anyhost=true&application=demo-provider&bind.ip=192.168.1.120&bind.port=20880&dubbo=2.6.1&generic=false&interface=com.whforever.service.DemoService&methods=sayHello,getUsers&pid=13992&side=provider×tamp=1528300589682, dubbo version: 2.6.1, current host: 192.168.1.120
[06/06/18 11:56:30:030 CST] main  INFO config.AbstractConfig:  [DUBBO] Register dubbo service com.whforever.service.DemoService url dubbo://192.168.1.120:20880/com.whforever.service.DemoService?anyhost=true&application=demo-provider&bind.ip=192.168.1.120&bind.port=20880&dubbo=2.6.1&generic=false&interface=com.whforever.service.DemoService&methods=sayHello,getUsers&pid=13992&side=provider×tamp=1528300589682 to registry registry://127.0.0.1:2181/com.alibaba.dubbo.registry.RegistryService?application=demo-provider&dubbo=2.6.1&pid=13992®istry=zookeeper×tamp=1528300589673, dubbo version: 2.6.1, current host: 192.168.1.120
[06/06/18 11:56:30:030 CST] main  INFO transport.AbstractServer:  [DUBBO] Start NettyServer bind /0.0.0.0:20880, export /192.168.1.120:20880, dubbo version: 2.6.1, current host: 192.168.1.120


                                                

Снова запустите sonsumer:

consumer图потребительский граф

Просматривая центр мониторинга dubbo, вы можете увидеть ситуацию, как показано ниже. Пожалуйста, перейдите к тому, как установить и развернуть центр мониторинга dubbo.Простая установка Центра мониторинга

dubboAdmin图схема dubboAdmin

резюме

К dubbo я уже давно прислушиваюсь к его названию, и только недавно написал несколько демок.Вообще говоря, начать относительно легко.Официальная также предоставляет более подробные документы, да и сообщество тоже более активное. Что касается кода в этом блоге, арендодатель разместил его на GitHub, Для тех, кто заинтересован, пожалуйста, переместитеПервый опыт Dubbo Демонстрационный код шаблона

Дополнительный

Арендодатель построил колесо. LIGHTCONF — это платформа управления конфигурацией, основанная на Netty. Ее основная цель — «предоставить унифицированную услугу управления конфигурацией для бизнеса», которую можно использовать «из коробки».