网站首页 > 文章精选 正文
为什么写这篇文章
逛了一圈博客,发现SpringBoot整合Dubbo的文章非常之多,但是很多都是照搬官网的模式,更有甚者是直接复制的官网水了一篇文章,可以说对初学者毫无帮助,还误导初学者的方向,并没有真正的落地,官网提供的demo确实只能用于学习,并不能用于实战,毕竟实战不会把服务端和客户端写在同一个工程。官网其实想表达Dubbo的使用方式是:一个微服务下应该包含至少两个模块,一个接口模块,一个实现模块,接口模块暴露给客户端使用。这也就是官网说的接口模块是交互的桥梁。
什么是Dubbo?
Dubbo是阿里开源的一款基于Netty的高性能RPC框架,经历多年的发展,已经在阿里内部全面落地,并在各行各业生根发芽,目前已成为Apache顶级项目。
为什么使用Dubbo?
Dubbo的性能已经在阿里的各项高并发场景下经过检验,并且提供了功能完善的服务治理平台,生态也非常完善,采用RPC进行服务调用,非常适合内部服务的通信。
与SpringCloud相比有如下优势:
- 采用RPC调用,调用远程方法像调用本地方法一样简单易用。SpringCloud采用http调用,用法较Dubbo稍微复杂。
- 在阿里全面落地,经历实战检验,非常稳定。
生产实践
熟悉Spring Cloud的同学,我们在不考虑服务治理,服务熔断,配置中心的场景下,仅服务端,客户端,注册中心就能搭建一个最简单的微服务体系。
- 搭建注册中心
Dubbo支持Nacos和Zookeeper作为注册中心,这里我们采用各位同学使用最多的Zookeeper作为注册中心。我们开始搭建zookeeper。
- 下载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,立马删除。
猜你喜欢
- 2025-05-08 深入理解受控组件、非受控组件(受控和非受控的区别)
- 2025-05-08 安装Dify源码并修改前端发布(源码安装是什么意思)
- 2025-05-08 前端工程师都会遇到的nodejs常见问题和解决方案复盘
- 2025-05-08 RAGFlow:深度文档理解的RAG引擎、大海捞针测试、API集成业务!
- 2025-05-08 Win11和Win10专业版永久激活密钥详细步骤?
- 2025-05-08 微信小程序入门1(微信小程序入门与实践)
- 2025-05-08 树莓派基础安装(树莓派安装zsh)
- 2025-05-08 项目中使用 husky 格式化代码和校验 commit 信息
- 2025-05-08 Node.js 原生支持 TypeScript?开发者需要了解的一切
- 2025-05-08 Nodejs安装、配置与快速入门(nodejs安装步骤)
- 最近发表
- 标签列表
-
- newcoder (56)
- 字符串的长度是指 (45)
- drawcontours()参数说明 (60)
- unsignedshortint (59)
- postman并发请求 (47)
- python列表删除 (50)
- 左程云什么水平 (56)
- 计算机网络的拓扑结构是指() (45)
- 编程题 (64)
- postgresql默认端口 (66)
- 数据库的概念模型独立于 (48)
- 产生系统死锁的原因可能是由于 (51)
- 数据库中只存放视图的 (62)
- 在vi中退出不保存的命令是 (53)
- 哪个命令可以将普通用户转换成超级用户 (49)
- noscript标签的作用 (48)
- 联合利华网申 (49)
- swagger和postman (46)
- 结构化程序设计主要强调 (53)
- 172.1 (57)
- apipostwebsocket (47)
- 唯品会后台 (61)
- 简历助手 (56)
- offshow (61)
- mysql数据库面试题 (57)