Spring Boot интегрирует Apache Dubbo

Spring Boot
Spring Boot интегрирует Apache Dubbo

Apache DubboЭто высокопроизводительная и легкая программа с открытым исходным кодом.Java RPCFramework, которая обеспечивает три основные возможности: ориентированный на интерфейс вызов удаленных методов, интеллектуальную отказоустойчивость и балансировку нагрузки, а также автоматическую регистрацию и обнаружение служб.

Примечание, даApache Dubbo,Больше неAlibaba Dubbo. Проще говоряAlibabaбудетDubboсдать вApacheСообщество с открытым исходным кодом для обслуживания. видетьdubbo-spring-boot-project

старая версияDubboсмотрите подробностиSpring Boot Series: интеграция Alibaba Dubbo

1. Примеры этой статьи

1.1 Версия фреймворка

  • DubboВерсия
<dependency>
    <groupId>org.apache.dubbo</groupId>
    <artifactId>dubbo-spring-boot-starter</artifactId>
    <version>2.7.5</version>
</dependency>
  • Spring BootВерсия
<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>2.1.1.RELEASE</version>
    <relativePath/>
</parent>

1.2 Связь модуля

  • корневой проектorder: управлять инженерной информацией;
  • подинжинирингorder-api:определениеRPCИнтерфейс службы, параметры и результирующий набор результатов ответа;
  • подинжинирингorder-provider:RPCпоставщик услуги;
  • подинжинирингorder-consumer:RPCПотребительская сторона сервиса, реальная ситуация в реальном процессе разработки такова, что другие сервисы вызывают заказRPCСлужить

Во-вторых, корневой проект

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

Я здесь ради старой версииalibabaизdubboОтличие проекта, имя файла берется какapache-dubbo-demo,mavenНазвание проектаorder.

Основная функция этого проекта — определение информации о проекте, управление версиями зависимостей всего проекта и т. д., поэтомуsrcСправочник не требуется.

2.2 pom.xml

используется в корневом проекте<dependencyManagement>и<dependencies>Займитесь управлением зависимостями.

  1. <dependencyManagement>: объявить глобальную зависимость, и зависимость будет унаследована, когда подпроект указывает ссылку;
  2. <dependencies>: Объявляйте глобальные зависимости, а подпроекты напрямую и автоматически наследуют зависимости.
<?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>

    <!-- 父级引用 -->
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.1.1.RELEASE</version>
        <relativePath/>
    </parent>

    <!-- 基本信息 -->
    <groupId>cn.van.order</groupId>
    <artifactId>order</artifactId>
    <version>1.0.0-SNAPSHOT</version>
    <name>${project.artifactId}</name>
    <description>Apache Dubbo 根项目</description>

    <!--配置-->
    <properties>
        <java.version>1.8</java.version>
        <dubbo.version>2.7.5</dubbo.version>
        <zookeeper.version>3.4.14</zookeeper.version>
    </properties>

    <!-- 子项目 -->
    <modules>
        <module>order-api</module>
        <module>order-provider</module>
        <module>order-consumer</module>
    </modules>

    <!--声明全局依赖(子项目需要显示的引用才会继承依赖)-->
    <dependencyManagement>
        <dependencies>
            <!-- dubbo-start依赖 -->
            <dependency>
                <groupId>org.apache.dubbo</groupId>
                <artifactId>dubbo-spring-boot-starter</artifactId>
                <version>${dubbo.version}</version>
            </dependency>
            <!--zookeeper 注册中心客户端引入 使用的是curator客户端 -->
            <dependency>
                <groupId>org.apache.dubbo</groupId>
                <artifactId>dubbo-dependencies-zookeeper</artifactId>
                <version>${dubbo.version}</version>
                <type>pom</type>
                <exclusions>
                    <exclusion>
                        <artifactId>slf4j-log4j12</artifactId>
                        <groupId>org.slf4j</groupId>
                    </exclusion>
                </exclusions>
            </dependency>
        </dependencies>
    </dependencyManagement>

    <!--声明全局依赖(子项目不需要显示的引用,自动继承依赖)-->
    <dependencies>
        <!-- spring boot 依赖 -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
            <exclusions>
                <exclusion>
                    <groupId>org.junit.vintage</groupId>
                    <artifactId>junit-vintage-engine</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
    </dependencies>

    <!-- 打包插件 -->
    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>
</project>

три,order-api

3.1 Зависимости проекта

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

<?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>

    <parent>
        <groupId>cn.van.order</groupId>
        <artifactId>order</artifactId>
        <version>1.0.0-SNAPSHOT</version>
    </parent>

    <groupId>cn.van.order</groupId>
    <artifactId>order-api</artifactId>
    <version>1.0.0-SNAPSHOT</version>
    <name>${project.artifactId}</name>
    <description>dubbo公共项目</description>


    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

</project>

3.2 УпаковкаRPCнабор результатов

  • Сначала инкапсулируйте класс перечисления кода возвратаResultCodeEnum.java
public enum ResultCodeEnum {
    /*** 通用部分 100 - 599***/
    // 成功请求
    SUCCESS(200, "successful"),
    
    /*** 这里可以根据不同模块用不同的区级分开错误码,例如:  ***/

    // 1000~1999 区间表示用户模块错误
    // 2000~2999 区间表示订单模块错误
    // 3000~3999 区间表示商品模块错误
    // 。。。

    ORDER_NOT_FOUND(2000, "order not found"),
    ;
    /**
     * 响应状态码
     */
    private Integer code;
    /**
     * 响应信息
     */
    private String message;

    ResultCodeEnum(Integer code, String msg) {
        this.code = code;
        this.message = msg;
    }

    public Integer getCode() {
        return code;
    }

    public String getMessage() {
        return message;
    }

    public void setMessage(String message) {
        this.message = message;
    }
}
  • Сначала инкапсулируйте набор результатов ответа RPC.RpcResult.java
public class RpcResult <T> implements Serializable {

    /**
     * 是否响应成功
     */
    private Boolean success;
    /**
     * 响应状态码
     */
    private Integer code;
    /**
     * 响应数据
     */
    private T data;
    /**
     * 错误信息
     */
    private String message;

    // 构造器开始
    /**
     * 无参构造器(构造器私有,外部不可以直接创建)
     */
    private RpcResult() {
        this.code = 200;
        this.success = true;
    }
    /**
     * 有参构造器
     * @param obj
     */
    private RpcResult(T obj) {
        this.code = 200;
        this.data = obj;
        this.success = true;
    }

    /**
     * 有参构造器
     * @param resultCode
     */
    private RpcResult(ResultCodeEnum resultCode) {
        this.success = false;
        this.code = resultCode.getCode();
        this.message = resultCode.getMessage();
    }
    // 构造器结束

    /**
     * 通用返回成功(没有返回结果)
     * @param <T>
     * @return
     */
    public static<T> RpcResult<T> success(){
        return new RpcResult();
    }

    /**
     * 返回成功(有返回结果)
     * @param data
     * @param <T>
     * @return
     */
    public static<T> RpcResult<T> success(T data){
        return new RpcResult<T>(data);
    }

    /**
     * 通用返回失败
     * @param resultCode
     * @param <T>
     * @return
     */
    public static<T> RpcResult<T> failure(ResultCodeEnum resultCode){
        return  new RpcResult<T>(resultCode);
    }

    public Boolean getSuccess() {
        return success;
    }

    public void setSuccess(Boolean success) {
        this.success = success;
    }

    public Integer getCode() {
        return code;
    }

    public void setCode(Integer code) {
        this.code = code;
    }

    public T getData() {
        return data;
    }

    public void setData(T data) {
        this.data = data;
    }

    public String getMessage() {
        return message;
    }

    public void setMessage(String message) {
        this.message = message;
    }

    @Override
    public String toString() {
        return "RpcResult{" +
                "success=" + success +
                ", code=" + code +
                ", data=" + data +
                ", message='" + message + '\'' +
                '}';
    }
}

3.3 НапишитеRPCинтерфейс

public interface OrderDubboService {
    RpcResult<OrderDomain> getOrder();
}

организацияOrderDomain.javaЭто очень просто, см.Githubсклад.

Четыре,order-provider

Этот подпроект является проектом класса службы, то есть служба интерфейса зарегистрирована вzookeeperЦентр регистрации используется потребителем.

4.1 Зависимости проекта

<?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>
    <parent>
        <groupId>cn.van.order</groupId>
        <artifactId>order</artifactId>
        <version>1.0.0-SNAPSHOT</version>
    </parent>

    <groupId>cn.van.order</groupId>
    <artifactId>order-provider</artifactId>
    <version>1.0-SNAPSHOT</version>
    <name>${project.artifactId}</name>
    <description>Dubbo 服务提供者</description>

    <dependencies>
        <dependency>
            <groupId>cn.van.order</groupId>
            <artifactId>order-api</artifactId>
            <version>1.0.0-SNAPSHOT</version>
        </dependency>
        <dependency>
            <groupId>org.apache.dubbo</groupId>
            <artifactId>dubbo-spring-boot-starter</artifactId>
        </dependency>
        <!-- zookeeper依赖 -->
        <dependency>
            <groupId>org.apache.dubbo</groupId>
            <artifactId>dubbo-dependencies-zookeeper</artifactId>
            <version>${dubbo.version}</version>
            <type>pom</type>
            <exclusions>
                <exclusion>
                    <artifactId>slf4j-log4j12</artifactId>
                    <groupId>org.slf4j</groupId>
                </exclusion>
            </exclusions>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>
</project>

4.2 Интерфейс реализации службы

@Service
public class OrderDubboServiceImpl implements OrderDubboService {
    
    @Override
    public RpcResult<OrderDomain> getOrder() {
        return RpcResult.success(new OrderDomain(1, 10086, LocalDateTime.now()));
    }
}

Уведомление: @ServiceдаdubboАннотация под пакетом неSpringПримечания внутри.

4.3 Конфигурация проекта

  1. dubboКонфигурация используется напрямуюdubbo, уже не сSpringначало;
  2. base-packages: указывает путь, по которому находится реализация интерфейса.
server:
  # 服务端口
  port: 7777
spring:
  application:
    name: order-provider
# dubbo 相关配置(dubbo 的配置不再以 Spring 开头)
dubbo:
  application:
    # 应用名称
    name: order-provider
  scan:
    # 接口实现者(服务实现)包
    base-packages: cn.van.order.service.impl
  # 注册中心信息
  registry:
    address: zookeeper://127.0.0.1:2181
  protocol:
    # 协议名称
    name: dubbo
    # 协议端口
    port: 20880

пять,order-consumer

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

5.1 Зависимости проекта

<?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>

    <parent>
        <groupId>cn.van.order</groupId>
        <artifactId>order</artifactId>
        <version>1.0.0-SNAPSHOT</version>
    </parent>

    <groupId>cn.van.order</groupId>
    <artifactId>order-consumer</artifactId>
    <version>1.0-SNAPSHOT</version>
    <name>${project.artifactId}</name>
    <description>Dubbo 消费者</description>


    <dependencies>
        <dependency>
            <groupId>cn.van.order</groupId>
            <artifactId>order-api</artifactId>
            <version>1.0.0-SNAPSHOT</version>
        </dependency>

        <!-- web项目依赖 -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <!-- dubbo依赖 -->
        <dependency>
            <groupId>org.apache.dubbo</groupId>
            <artifactId>dubbo-spring-boot-starter</artifactId>
        </dependency>

        <!-- dubbo的zookeeper依赖 -->
        <dependency>
            <groupId>org.apache.dubbo</groupId>
            <artifactId>dubbo-dependencies-zookeeper</artifactId>
            <version>${dubbo.version}</version>
            <type>pom</type>
            <exclusions>
                <exclusion>
                    <artifactId>slf4j-log4j12</artifactId>
                    <groupId>org.slf4j</groupId>
                </exclusion>
            </exclusions>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>
</project>

5.2 Тестовый интерфейс

Смоделируйте интерфейс, чтобы получить информацию о заказе.

@RestController
@RequestMapping("/order")
public class OrderConsumerController {
    @Reference
    OrderDubboService orderDubboService;

    @GetMapping("getOrder")
    public RpcResult getOrder() {
        return orderDubboService.getOrder();
    }
}

Уведомление:@ReferenceПредставленоDubboинтерфейс так себеDubboаннотации.

5.3 Файлы конфигурации

server:
  port: 7000
spring:
  application:
    name: order-consumer
# dubbo 相关配置
dubbo:
  application:
    name: order-consumer
  registry:
    address: zookeeper://127.0.0.1:2181

6. Тест

все готово, если вorder-consumerТестовый интерфейс может успешно запрашивать данные, это доказывает, чтоDubboСлужба была успешно построена.

6.1 Запускzookeeper

мы выбираемzookeeperКак реестр, его необходимо запустить перед запуском проекта.

6.2 dubbo-admin

dubbo-adminлегко наблюдатьorder-providerЕсли интерфейс успешно зарегистрирован, пожалуйста, обратитесь к конкретным шагам установки.apache/dubbo-admin

Порт по умолчанию:8080.

6.3 Запускdubbo-provider

После успешного запуска вы можетеdubbo-admin: Интерфейс был успешноOrderServiceзарегистрироваться наzookeeperВышеизложенное выглядит следующим образом:

图一

Успешно зарегистрировал оправдание в реестре, заявивdubbo-providerВы успешно зарегистрировались.

6.4 Запускorder-cosumer

Запустите потребительский проект и запросите потребительский интерфейс в браузере:http://localhost:7000/order/getOrder, успешные возвращаемые данные выглядят следующим образом:

{
    "success":true,
    "code":200,
    "data":{
        "id":1,
        "orderNum":10086,
        "gmtCreate":"2020-05-06T11:59:45.535"
    },
    "message":null
}

успешно запрошенorder-providerДанные предоставлены, заявивDubboСтройте успешно!

7. Резюме

Полный код выше, который я загрузил наGithub, вы можете пройти тест самостоятельно, если вам это нужно, добро пожаловатьstar!

7.1 Секреты предков

Blogger Pass CheatsВесенняя коллекция подсолнуховОткрытый исходный код, добро пожаловать, чтобы пожаловаться, упомянутьissues, сообщите блогеру, какую статью обновить следующей,Vanтвердо верю:1 + 1 > 2!

7.2 Культурный обмен

  1. Пыль Блог
  2. Блог Пыли - Самородки
  3. Пыль Блог - Блог Парк
  4. Пыль Блог — CSDN
  5. Github

Последняя статья, добро пожаловать на внимание: публичный аккаунт-блог fengchen; обмен мнениями, добро пожаловать на добавление: личный WeChat