Spring Boot — интеграция Dubbo

Spring Boot
Spring Boot — интеграция Dubbo

Официальный сайт Дуббо:dubbo.apache.org/zh-cn/


предисловие

Я буду использовать небольшую демонстрацию, чтобы представить, как интегрироваться со Spring Boot;

Если друзья, прочитавшие мою статью, еще не использовали Spring Boot и Dubbo, то рекомендую вам сначала ознакомиться с ним, потому что в этой статье не рассказывается, как его установить.

Эта демонстрация представляет собой небольшую демонстрацию для получения информации о заказе пользователя.

В настоящее время эта демонстрация находится на моем github:GitHub.com/AAA tao66/степени…

среда разработки

  • win10
  • idea 2019
  • zookeeper
  • dubbo
  • jdk1.8

Создать проект

  • Сначала мы создаем проект maven, который не является проектом Spring Boot, имя этого проекта — xxx-interface.

Я называю это здесь: gmall-интерфейс

Согласно официальному документу Dubbo «Лучшие практики обслуживания»:

Рекомендуется поместить интерфейс службы, модель службы, исключение службы и т. д. в пакет API, поскольку модель службы и исключение также являются частью API, и это также соответствует принципу субподряда: повторное использование принципа эквивалентности выпуска. (REP), общий принцип повторного использования (CRP) ).

Вот почему мы построили gmall-interface, то есть мы должны поместить Java Beans и интерфейсы в этот проект и сделать каждый проект микросервиса зависимым от него.

  • Затем мы создаем два проекта Spring Boot, один поставщик и один потребитель.

Имя проекта провайдера: boot-user-service-provider; (пользователь, можно ничего не проверять)

Имя потребительского проекта: boot-order-service-consumer; (заказ, не забудьте проверить сеть при инициализации)

Программирование

Проект: gmall-интерфейс

  • Сначала создайте JavaBean:
package com.carson.gmall.bean;


import java.io.Serializable;

public class UserAddress implements Serializable {

    private Integer id;
    private String userAddress; // 用户地址
    private String userId; // 用户id
    private String consignee; // 收货人
    private String phoneNum; // 电话号码
    private String isDefault; // 是否为默认地址 yes / no
   
    // 省略get set toString 等方法

Не забудьте реализовать сериализацию

Например, если наш клиент A хочет вызвать метод клиента B, сервер A должен установить соединение с сервером B в это время, и когда сервер A вызывает метод, ему также необходимо передать параметры, и этот параметр должен быть в Чтобы пройти между сетями, нам нужно сериализоваться.

Затем сервер Б обнаружил, что внешний сервер хочет вызвать мой метод, а также передал мне параметры, так как он был сериализован, сервер Б должен десериализовать параметры.

Затем, после вызова метода, есть возвращаемое значение.На этот раз в основном то же самое, что и раньше.Сначала оно сериализуется, а затем A десериализует его, чтобы можно было получить возвращаемый результат.

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

ЗаказСервис:

import com.carson.gmall.bean.UserAddress;

import java.util.List;

/**
 *  用户服务接口
 * */
public interface UserService {

    /*
    按照用户id返回所有收获地址
    * */
    List<UserAddress> getUserAddressList(String userId);
}

Пользовательская служба:

import com.carson.gmall.bean.UserAddress;

import java.util.List;

/**
 *  用户服务接口
 * */
public interface UserService {

    /*
    按照用户id返回所有收获地址
    * */
    List<UserAddress> getUserAddressList(String userId);
}
  • файл pom.xml
<?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.carson.gmall</groupId>
  <artifactId>gmall-interface</artifactId>
  <version>1.0-SNAPSHOT</version>

<dependencies>
    
  <dependency>
    <groupId>org.projectlombok</groupId>
    <artifactId>lombok</artifactId>
    <version>1.18.8</version>
  </dependency>
    
  <dependency>
    <groupId>org.apache.curator</groupId>
    <artifactId>curator-framework</artifactId>
    <version>2.8.0</version>
  </dependency>
    
  <dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>dubbo</artifactId>
    <version>2.6.2</version>
  </dependency>
    
</dependencies>
</project>

Проект провайдера: boot-user-service-provider

  • pom.xml

В дополнение к той, что идет с Spring Boot, необходимо добавить эти две версии dubbo 0.2.0 для Spring Boot 2.x.

Если Spring Boot имеет версию 1.x, то dubbo должен использовать 0.1.0.

		与 gmall-interface 进行关联。       
		<dependency>
            <groupId>com.carson.gmall</groupId>
            <artifactId>gmall-interface</artifactId>
            <version>1.0-SNAPSHOT</version>
        </dependency> 
		dubbo依赖
        <dependency>
            <groupId>com.alibaba.boot</groupId>
            <artifactId>dubbo-spring-boot-starter</artifactId>
            <version>0.2.0</version> 
        </dependency>

Затем есть файл конфигурации Spring Boot:

  • application.yml
dubbo:
  application:
    name: boot-order-service-consumer
  registry:
    address: zookeeper://127.0.0.1:2181
  monitor:
    protocol: registry
server:
  port: 8081

Если вы им не пользовались, то этот раздел конфигурации вам может быть непонятен, он соответствует разделу provider.xml официального документа dubbo:

Конкретный URL:Хироши Ватанабэ.apache.org/this-capable/docs/…

Но в моем конфиге такого нетОбъявите интерфейс службы, который необходимо открыть, это ждать скажут почему.

  • Класс реализации UserService

import com.alibaba.dubbo.config.annotation.Service;
import com.carson.gmall.bean.UserAddress;
import com.carson.gmall.bootuserserviceprovider.service.UserService;
import org.springframework.stereotype.Component;

import java.util.Arrays;
import java.util.List;

@Service // 暴露服务
@Component
public class UserServiceImpl implements UserService {

    public List<UserAddress> getUserAddressList(String userId) {

        UserAddress address1 = new UserAddress(1, "河北省衡水市", "1", "carson","12345678911","Y");
        UserAddress address2 = new UserAddress(1, "山东省德州市", "2", "eason", "4562144", "Y");

        return Arrays.asList(address1,address2);
    }
}

Обратите внимание на мою аннотацию @Service, эта аннотация не из Spring, а из dubbo:

import com.alibaba.dubbo.config.annotation.Service;

Эта аннотация означает:Объявите интерфейс службы, который необходимо открыть;

В этом методе мы видим, что я устанавливаю два адреса сбора и возвращаю их в виде списка.

  • Основной класс Spring Boot

import com.alibaba.dubbo.config.spring.context.annotation.EnableDubbo;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;


@EnableDubbo // 开启基于注解的dubbo功能
@SpringBootApplication
public class BootUserServiceProviderApplication {

    public static void main(String[] args) {
        SpringApplication.run(BootUserServiceProviderApplication.class, args);
    }

}

Потребительский проект: boot-order-service-consumer

pom такой же, как у провайдера.

  • application.yml
dubbo:
  application:
    name: boot-order-service-consumer
  registry:
    address: zookeeper://127.0.0.1:2181
  monitor:
    protocol: registry
server:
  port: 8081

Для конкретной конфигурации вы можете обратиться к быстрому началу официальной документации duboo, которая находится чуть выше:

Хироши Ватанабэ.apache.org/this-capable/docs/…

  • OrderServiceImpl
package com.carson.gmall.bootorderserviceconsumer.service.impl;

import com.alibaba.dubbo.config.annotation.Reference;
import com.carson.gmall.bean.UserAddress;
import com.carson.gmall.bootuserserviceprovider.service.OrderService;
import com.carson.gmall.bootuserserviceprovider.service.UserService;
import com.sun.org.apache.bcel.internal.generic.RETURN;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.List;
/**
 *  1. 将服务提供者注册到注册中心(暴漏服务)
 *      1) 导入 dubbo 依赖
 *      2) 配置服务提供者
 *
 *  2. 让服务消费者去注册中心订阅服务提供者的服务地址
 * */
@Service
public class OrderServiceImpl implements OrderService {

    @Reference
    UserService userService;

    public List<UserAddress> initOrder(String userId) {
        System.out.println("用户id:"+userId);
        // 1. 查询用户的收货地址
        List<UserAddress> userAddressList = userService.getUserAddressList(userId);
        return userAddressList;
    }
}

Примечание @Reference: при удаленном вызове UserService вы перейдете к реестру, чтобы узнать

  • OrderController
@Controller
public class OrderController {

    @Autowired
    private OrderService orderService;

    @ResponseBody
    @RequestMapping("/initOrder")
    public List<UserAddress> initOrder(@RequestParam("uid") String userId) {
        return orderService.initOrder(userId);
    }
}

@ResponseBody: ответ на полученный результат в виде json

  • стартовый класс
@EnableDubbo // 开启基于注解的dubbo功能
@SpringBootApplication
public class BootOrderServiceConsumerApplication {
    public static void main(String[] args) {
        SpringApplication.run(BootOrderServiceConsumerApplication.class, args);
    }
}

то же, что провайдер


Запустите zookeeper и dubbo и эти два проекта, вы можете увидеть в консоли dubbo, там уже есть потребители и провайдеры

Затем в Spring Boot, который мы только что запустили, есть веб-проект с установленным портом 8081. Давайте попробуем получить доступ к этому порту 8081 с параметрами:

Успешно получена информация о заказе;