使用SpringBoot + Dubbo快速构建Web应用

分类:
JAVA
标签:
SpringBoot
dubbo
分布式服务
作者:
何鑫
创作时间:
2019/08/27 16:03:46

摘要:本文将展示如何使用SpringBoot和Dubbo快速构建分布式服务

关于dubbo

dubbo是阿里开源的Java高性能RPC框架。在springcloud在国内流行开来之前,dubbo一直是国内Java领域分布式应用开发的首选解决方案,可惜因某些原因,dubbo停止维护了一段时间,springcloud也随springboot乘势而起,dubbo开始走向没落。然而让人没想到的是,2017年,阿里又重启了dubbo的维护,并捐献给了apache,dubbo又活了!然而,在springclould逐渐成熟并在国内流行开来之后,dubbo能否重拾辉煌仍然是一个未知数。

基于原生spring框架的dubbo配置起来还是比较麻烦的,然而在springboot时代,一切都发生了改变,下面我们将基于springboot和dubbo快速搭建一个Web应用。

搭建注册中心

dubbo的注册中心选择是多样的,可以使用zookepeer,nacos,redis等,这里我们使用nacos。

nacos是阿里开源的服务注册和配置中心,可用于springcloud。首先我们需要前往版本发布页下载安装包,下载完成后解压,然后前往bin目录。

根据平台选择启动文件启动。我是windows平台,所以直接点开startup.cmd。

启动界面

默认端口是8848(没错,就是某手机品牌) ,我们可以通过127.0.0.1:8848/nacos/index.html访问到控制台,如果我们没有登录,会被拦截到登录页,默认用户名和密码都是nacos。

这样我们的注册中心就准备好了。

搭建框架

我们要搭建一个Maven聚合工程。

首先创建一个父工程,注意打包类型为pom,主要用于依赖管理,对应pom文件如下:

<?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>cn.besthexin</groupId>
    <artifactId>dubbo-project</artifactId>
    <packaging>pom</packaging>
    <version>1.0-SNAPSHOT</version>

    <properties>
        <spring-boot.version>2.1.1.RELEASE</spring-boot.version>
        <dubbo.version>2.7.3</dubbo.version>
        <nacos.version>1.1.1</nacos.version>
    </properties>

    <dependencyManagement>
        <dependencies>
            <!-- Spring Boot -->
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-dependencies</artifactId>
                <version>${spring-boot.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>

            <!-- Aapche Dubbo  -->
            <dependency>
                <groupId>org.apache.dubbo</groupId>
                <artifactId>dubbo-dependencies-bom</artifactId>
                <version>${dubbo.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>

            <!-- dubbo springboot starter -->
            <dependency>
                <groupId>org.apache.dubbo</groupId>
                <artifactId>dubbo-spring-boot-starter</artifactId>
                <version>${dubbo.version}</version>
            </dependency>

            <!-- nacos注册中心支持 -->
            <dependency>
                <groupId>org.apache.dubbo</groupId>
                <artifactId>dubbo-registry-nacos</artifactId>
                <version>${dubbo.version}</version>
            </dependency>

            <!-- 注册中心客户端 -->
            <dependency>
                <groupId>com.alibaba.nacos</groupId>
                <artifactId>nacos-client</artifactId>
                <version>${nacos.version}</version>
            </dependency>

            <dependency>
                <groupId>org.apache.dubbo</groupId>
                <artifactId>dubbo</artifactId>
                <version>${dubbo.version}</version>
                <exclusions>
                    <exclusion>
                        <groupId>org.springframework</groupId>
                        <artifactId>spring</artifactId>
                    </exclusion>
                    <exclusion>
                        <groupId>javax.servlet</groupId>
                        <artifactId>servlet-api</artifactId>
                    </exclusion>
                    <exclusion>
                        <groupId>log4j</groupId>
                        <artifactId>log4j</artifactId>
                    </exclusion>
                </exclusions>
            </dependency>
        </dependencies>
    </dependencyManagement>


</project>

新建子工程api,用于封装公共接口pom先保持默认即可。

新建springboot子工程dubbo-provider,用于提供服务。pom文件如下:

<?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">
    <parent>
        <artifactId>dubbo-project</artifactId>
        <groupId>cn.besthexin</groupId>
        <version>1.0-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>

    <artifactId>dubbo-provider</artifactId>

    <properties>
        <java.version>1.8</java.version>
    </properties>

    <dependencies>

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

        <dependency>
            <groupId>org.apache.dubbo</groupId>
            <artifactId>dubbo</artifactId>
        </dependency>

        <!-- Dubbo Registry Nacos -->
        <dependency>
            <groupId>org.apache.dubbo</groupId>
            <artifactId>dubbo-registry-nacos</artifactId>
        </dependency>

        <dependency>
            <groupId>com.alibaba.nacos</groupId>
            <artifactId>nacos-client</artifactId>
        </dependency>

        <!-- 模块依赖 -->
        <dependency>
            <groupId>cn.besthexin</groupId>
            <artifactId>api</artifactId>
            <version>1.0-SNAPSHOT</version>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>

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

</project>

注意该工程需依赖api子工程,便于我们调用接口。

新建springboot子工程dubbo-consumer,用于调用服务,pom文件与dubbo-provider基本一致,这里就不列出了。

最终工程结构如下:

在api工程中添加一个接口TestService,并添加一个sayHello方法

package cn.besthexin.api;

/**
 * Title        : TestService
 * Description       : 测试服务
 * DevelopTools   : IDEA
 * DevelopSystem  : Windows 10
 * websiteAddress : besthexin.cn
 * @author          : hexin
 * @date        : 2019/8/27 19:06
 * @version      : 5.0
 */

public interface TestService {

    /**
     * 说你好
     * @param name 名称
     * @return 你好
     */
    String sayHello(String name);

}

在dubbo-provider中新建类TestServiceImpl实现TestService,重写sayHello方法

package cn.besthexin.provider.service;

import cn.besthexin.api.TestService;
import org.apache.dubbo.config.annotation.Service;

/**
 * Title        : TestServiceImpl
 * Description       : 测试服务实现
 * DevelopTools   : IDEA
 * DevelopSystem  : Windows 10
 * websiteAddress : besthexin.cn
 * @author          : hexin
 * @date        : 2019/8/27 17:12
 * @version      : 5.0
 */

@Service(version = "1.0.0")
public class TestServiceImpl implements TestService {

    /**
     * 说你好
     * @param name 名称
     * @return hello
     */
    @Override
    public String sayHello(String name) {
        return "Hello," + name;
    }

}

注意此处的service注解不是spring的servcie注解而是dubbo。

在该工程的application.properties中添加配置如下

server.port=8080
# Spring boot application
spring.application.name=dubbo-provider
# Base packages to scan Dubbo Component: @org.apache.dubbo.config.annotation.Service
dubbo.scan.base-packages=cn.besthexin.provider

# Dubbo Application
## The default value of dubbo.application.name is ${spring.application.name}
## dubbo.application.name=${spring.application.name}

# Dubbo Protocol
dubbo.protocol.name=dubbo
dubbo.protocol.port=-1

## Dubbo Registry
dubbo.registry.address=nacos://127.0.0.1:8848

注意其中几个配置:

server.port   服务器端口,注意避免冲突。

dubbo.scan.base-packages dubbo扫描包,dubbo会自动扫描对应包下的dubbo注解以配置服务。

dubbo.registry.address 注册中心地址,我们这里填写的是nacos的地址。

在dubbo-consumer工程中新建一个Testcontroller:

package cn.besthexin.consumer.controller;

import cn.besthexin.api.TestService;
import org.apache.dubbo.config.annotation.Reference;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

/**
 * Title        : TestConroller
 * Description       :
 * DevelopTools   : IDEA
 * DevelopSystem  : Windows 10
 * websiteAddress : besthexin.cn
 * @author          : hexin
 * @date        : 2019/8/27 19:35
 * @version      : 5.0
 */

@RestController
public class TestController {

    @Reference(version = "1.0.0")
    private TestService testService;


    @RequestMapping("/test")
    public String test() {
        return testService.sayHello("dubbo");
    }

}

用Reference注解注入服务。

配置该工程application.properties:

server.port=8081
# Spring boot application
spring.application.name=dubbo-consumer
# Base packages to scan Dubbo Component: @org.apache.dubbo.config.annotation.Service
dubbo.scan.base-packages=cn.besthexin.consumer

# Dubbo Application
## The default value of dubbo.application.name is ${spring.application.name}
## dubbo.application.name=${spring.application.name}

# Dubbo Protocol
dubbo.protocol.name=dubbo
dubbo.protocol.port=-1

## Dubbo Registry
dubbo.registry.address=nacos://127.0.0.1:8848

注意避免端口冲突。

至此工程就搭建完毕了,下面我们来进行测试。

测试

依次启动dubbo-provider和dubbo-consumer。

启动完成后,我们看一下nacos控制台有没有注册成功服务。

服务者和消费者均注册成功!

我们用请求来测试一下:

访问http://127.0.0.1:8081/test

调用成功!至此一个基本的dubbo工程就搭建完毕并成功运行了!


码云地址:https://gitee.com/besthexin/dubbo-project

发表评论

温馨提示: 评论先审核后发布, 请勿发表不良言论

所有评论