程序员求职经验分享与学习资料整理平台

网站首页 > 文章精选 正文

SpringBoot整合dubbo生产实践(springboot搭建dubbo)

balukai 2025-05-08 16:43:35 文章精选 4 ℃

为什么写这篇文章

逛了一圈博客,发现SpringBoot整合Dubbo的文章非常之多,但是很多都是照搬官网的模式,更有甚者是直接复制的官网水了一篇文章,可以说对初学者毫无帮助,还误导初学者的方向,并没有真正的落地,官网提供的demo确实只能用于学习,并不能用于实战,毕竟实战不会把服务端和客户端写在同一个工程。官网其实想表达Dubbo的使用方式是:一个微服务下应该包含至少两个模块,一个接口模块,一个实现模块,接口模块暴露给客户端使用。这也就是官网说的接口模块是交互的桥梁。

什么是Dubbo?

Dubbo是阿里开源的一款基于Netty的高性能RPC框架,经历多年的发展,已经在阿里内部全面落地,并在各行各业生根发芽,目前已成为Apache顶级项目。

为什么使用Dubbo?

Dubbo的性能已经在阿里的各项高并发场景下经过检验,并且提供了功能完善的服务治理平台,生态也非常完善,采用RPC进行服务调用,非常适合内部服务的通信。

与SpringCloud相比有如下优势:

  1. 采用RPC调用,调用远程方法像调用本地方法一样简单易用。SpringCloud采用http调用,用法较Dubbo稍微复杂。
  2. 在阿里全面落地,经历实战检验,非常稳定。

生产实践

熟悉Spring Cloud的同学,我们在不考虑服务治理,服务熔断,配置中心的场景下,仅服务端,客户端,注册中心就能搭建一个最简单的微服务体系。

  • 搭建注册中心

Dubbo支持Nacos和Zookeeper作为注册中心,这里我们采用各位同学使用最多的Zookeeper作为注册中心。我们开始搭建zookeeper。

  1. 下载zookeeper(建议各位同学不要直接下载最新版,最新版可能解决了很多问题,但是也可能带来更多的问题,最重要的是最新版的可能与其他组件不兼容,导致出现一些莫名其妙的问题

下载地址:
https://archive.apache.org/dist/zookeeper/

我们以windows下的zookeeper-3.6.3为例。下载完成后解压。

我们编辑zoo.cfg文件,并将dataDir改成我们自定义目录,我这边则设置为: E:\zookeeper\
apache-zookeeper-3.6.3-bin\data。这里各位同学应该还看到一个配置就是clientPort,这也就是配置zookeeper启动的端口,这个端口也支持自定义,默认是2181,只要不和当前主机已经被占用的端口冲突即可。

做完这一切之后我们使用zkServer.cmd进行启动:

点击之后我们会看到启动成功的日志:

到此,我们已经把zookeeper搭建好了。现在我们来搭建服务端。

  • 搭建服务端

开头我们就说了使用dubbo我们一个微服务下一般会包含两个模块,interface(接口层), service(实现层),接口层作为服务暴露出去给客户端使用。当然你也可以把所有的interface写在同一个工程,但是非常不建议这么干,太难维护了。


我们建立如下工程目录:

├─dubbo-demo-server
│  ├─.idea
│  ├─interface
│  │  └─src
│  │      ├─main
│  │      │  ├─java
│  │      │  │  └─com
│  │      │  │      └─github
│  │      │  │          └─server
│  │      │  │              ├─facade
│  │      │  │              ├─req
│  │      │  │              └─resp
│  │      │  └─resources
│  │      └─test
│  │          └─java
│  └─service
│      └─src
│          ├─main
│          │  ├─java
│          │  │  └─com
│          │  │      └─github
│          │  │          └─server
│          │  │              ├─facade
│          │  │              └─service
│          │  └─resources
│          └─test
│              └─java

建立interface和service模块,包名我们一般会将当前服务名囊括进去,例如我们这里的根包名com.github.server,因为不这么区分的话,可能会因为与其他服务中接口重名,而导致接口的全例名是一样的。

我们的接口一般写在facade下面,当然各位同学也可以自定义目录,这无伤大雅。

我们在service的pom文件中引入SpringBoot、Dubbo、Zookeeper的依赖如下:

<?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.github</groupId>
    <artifactId>dubbo-demo-server.service</artifactId>
    <version>1.0-SNAPSHOT</version>

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.2.1.RELEASE</version>
        <relativePath/>
    </parent>

    <properties>
        <java.version>8</java.version>
        <spring-boot.version>2.2.1.RELEASE</spring-boot.version>
        <dubbo.version>2.7.7</dubbo.version>
        <maven.compiler.source>11</maven.compiler.source>
        <maven.compiler.target>11</maven.compiler.target>
    </properties>

    <dependencies>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter</artifactId>
        </dependency>

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

        <dependency>
            <groupId>org.apache.dubbo</groupId>
            <artifactId>dubbo-dependencies-zookeeper</artifactId>
            <version>${dubbo.version}</version>
            <type>pom</type>
        </dependency>

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

        <dependency>
            <groupId>com.github</groupId>
            <artifactId>dubbo-demo-server.interface</artifactId>
            <version>1.0-SNAPSHOT</version>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>3.8.1</version>
                <configuration>
                    <source>1.8</source>
                    <target>1.8</target>
                    <encoding>UTF-8</encoding>
                </configuration>
            </plugin>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-jar-plugin</artifactId>
                <version>3.0.2</version>
            </plugin>

            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <executions>
                    <execution>
                        <goals>
                            <goal>repackage</goal>
                        </goals>
                    </execution>
                </executions>
                <configuration>
                    <finalName>dubbo-demo-server</finalName>
                </configuration>
                <version>${spring-boot.version}</version>
            </plugin>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-surefire-plugin</artifactId>
                <version>2.9</version>
                <configuration>
                    <!-- 每个测试类一个进程 -->
                    <forkMode>always</forkMode>
                </configuration>
            </plugin>
        </plugins>
    </build>

</project>

在service的resources\application.yml中添加Dubbo链接zookeeper的配置如下:

server:
  port: 8080
dubbo:
  application:
    name: dubbo-demo-server
  registry:
    address: zookeeper://127.0.0.1:2181
    protocol: zookeeper
  protocol:
    name: dubbo
    port: 20881
  monitor:
    protocol: registry

我们在interface的facade下新建IHelloServiceFacade,然后在service模块新建HelloServiceFacadeImpl实现该接口(因为我们已经在service模块引用interface模块),并在HelloServiceFacadeImpl标注@DubboService来暴露此服务。

然后在service新建SpringBoot启动器并运行(假设各位同学已经启动zookeeper):

看到控制台输出: [Dubbo] Current Spring Boot Application is await...说明我们服务端已经启动成功了。这里需要注意的是在启动器加上@EnableDubbo注解,来启动Dubbo自动装配。

  • 搭建客户端

同服务端,我们也按照interface和service两个模块创建客户端,引入相应的pom依赖与yml配置,我们在客户端编写接口如下:

我们在客户端通过@DubboReference引用服务端提供的接口IHelloServiceFacade。我们在客户端编写测试用例如下:

@RunWith(SpringRunner.class)
@SpringBootTest(classes = ClientBootApplication.class)
public class ISayHelloServiceFacadeTest {

    @Resource
    private ISayHelloServiceFacade sayHelloServiceFacade;

    @Test
    public void testRpc() {
        System.out.println(sayHelloServiceFacade.sayHelloRemote("world"));
    }
}

得到输出结果:hello,world。也就是客户端发起RPC调用服务端获取的结果。

Dubbo管理平台搭建

最后我们来搭建下Dubbo提供的管理平台,让我们的服务端和客户端相关信息可视化,首先我们下载dubbo管理平台相关代码:

git clone https://github.com/apache/dubbo-admin.git

用开发工具打开该项目,使用maven进行构建,如果各位同学在编译时出现如下错误:

npm ERR! code CERT_HAS_EXPIRED

检查下你本地是否安装了nodejs,该错误显示你本地安装了nodejs,并且证书已经过期了,可以在dos执行如下命令,找到.npmrc将其删除。

然后重新下载nodejs@v9.11.1版本,因为Dubbo管理后台页面依赖这个版本。

编译完成后,我们使用java -jar 执行以下编译的jar包,启动管理平台:

启动完成后,我们访问如下地址:http://localhost:38080/,输入账号密码,默认为root/root,也可以在此配置:

进入系统后,我们就能看到我们的服务端已经展示了。管理平台还提供了非常多的功能,后续我们再详细了解管理平台的功能。


以上就是SpringBoot整合Dubbo的所有内容,完全按照企业级开发标准编写,尽量做到开箱即用,如果各位同学觉得对你有所帮助,请关注、点赞、评论、收藏来支持我,未来为大家带来更好的创作。

版权声明:以上引用信息以及图片均来自网络公开信息,如有侵权,请留言或联系

504401503@qq.com,立马删除。

Tags:

最近发表
标签列表