11. Springboot集成Dubbo3(二)示例demo

1、前

Dubbo3从Dubbo2演进过来之后,已经从单纯的RPC框架改进成为了一个微服务框架,具备RPC框架能力的同时,还兼备服务治理能力。今天简单介绍下Dubbo3和Springboot的集成过程。

2、注册中心

官方仍然推荐zookeeper作为注册中心。ZooKeeper是一个分布式的,开放源码的分布式应用程序协调服务,是Google的Chubby一个开源的实现,是Hadoop和Hbase的重要组件。它是一个为分布式应用提供一致性服务的软件,提供的功能包括:配置维护、域名服务、分布式同步、组服务等。

先下载Zookeeper:Apache ZooKeeper

下载最新版本后解压。

接着,打开conf文件夹,把zoo_sample.cfg文件复制一份为zoo.cfg。以为zookeeper默认会读取zoo.cfg,zookeeper刚解压出来的版本仅仅提供了一个最简配置文件zoo_sample.cfg,需要我们自行修订。我们不做任何修订,直接复制一份出来。

我们可以观察一下zoo.cfg中的一些简单配置,我们删除一下注释内容,只剩下以下配置:

代码语言:javascript
复制
# 时间配置最小但域,其他时间配置以整数倍tickTime计算
tickTime=2000
#Leader允许Follower启动时在initLimit时间内完成数据同步,单位:tickTime
initLimit=10
# Leader发送心跳包给集群中所有Follower,若Follower在syncLimit时间内没有响应,那么Leader就认为该follower已经挂掉了,单位:tickTime
syncLimit=5
# 配置zookeeper的数据目录
dataDir=/tmp/zookeeper
# 用于接收客户端请求的端口
clientPort=2181

最后,我们直接双击binzkServer.cmd,看下以下内容,就说明启动成功了。

3、快速开始

简单示例场景:项目分Server服务层和Portal消费层。Portal调用Server提供的sayHello方法,输出相应内容,使用dubbo3进行Portal和Server的RPC通信。

3.1、添加dubbo3依赖

代码语言:javascript
复制
<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter</artifactId>
    </dependency>
&lt;dependency&gt;
    &lt;groupId&gt;org.springframework.boot&lt;/groupId&gt;
    &lt;artifactId&gt;spring-boot-starter-web&lt;/artifactId&gt;
&lt;/dependency&gt;

&lt;!-- https://mvnrepository.com/artifact/org.apache.dubbo/dubbo-spring-boot-starter --&gt;
&lt;dependency&gt;
    &lt;groupId&gt;org.apache.dubbo&lt;/groupId&gt;
    &lt;artifactId&gt;dubbo-spring-boot-starter&lt;/artifactId&gt;
    &lt;version&gt;3.2.10&lt;/version&gt;
&lt;/dependency&gt;

&lt;!-- https://mvnrepository.com/artifact/org.apache.dubbo/dubbo-dependencies-zookeeper --&gt;
&lt;dependency&gt;
    &lt;groupId&gt;org.apache.dubbo&lt;/groupId&gt;
    &lt;artifactId&gt;dubbo-dependencies-zookeeper&lt;/artifactId&gt;
    &lt;version&gt;3.2.10&lt;/version&gt;
    &lt;type&gt;pom&lt;/type&gt;
&lt;/dependency&gt;

</dependencies>

3.2、dubbo3-api

这一层我们定义一个公用的接口类和实体类。我们定义了IUserService。

代码语言:javascript
复制
public interface IUserService {
String sayHello(String name);
}

3.3、dubbo3-server

3.3.1、添加依赖
代码语言:javascript
复制
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>

&lt;dependency&gt;
    &lt;groupId&gt;org.springframework.boot&lt;/groupId&gt;
    &lt;artifactId&gt;spring-boot-starter-test&lt;/artifactId&gt;
    &lt;scope&gt;test&lt;/scope&gt;
&lt;/dependency&gt;

&lt;!-- https://mvnrepository.com/artifact/org.apache.dubbo/dubbo-spring-boot-starter --&gt;
&lt;dependency&gt;
    &lt;groupId&gt;org.apache.dubbo&lt;/groupId&gt;
    &lt;artifactId&gt;dubbo-spring-boot-starter&lt;/artifactId&gt;
    &lt;version&gt;3.2.10&lt;/version&gt;
&lt;/dependency&gt;

&lt;!-- https://mvnrepository.com/artifact/org.apache.dubbo/dubbo-dependencies-zookeeper --&gt;
&lt;dependency&gt;
    &lt;groupId&gt;org.apache.dubbo&lt;/groupId&gt;
    &lt;artifactId&gt;dubbo-dependencies-zookeeper&lt;/artifactId&gt;
    &lt;version&gt;3.2.10&lt;/version&gt;
    &lt;type&gt;pom&lt;/type&gt;
&lt;/dependency&gt;

&lt;dependency&gt;
    &lt;groupId&gt;com.example&lt;/groupId&gt;
    &lt;artifactId&gt;dubbo3-api&lt;/artifactId&gt;
    &lt;version&gt;0.0.1-SNAPSHOT&lt;/version&gt;
&lt;/dependency&gt;

</dependencies>

3.3.2、实现IUserService

定义service实现类,实现IUserService接口。这里的Service需要加上@DubboService,声明自己托管给dubbo进行管理。

代码语言:javascript
复制
import com.example.dubbo3api.service.IUserService;
import org.apache.dubbo.config.annotation.DubboService;

@DubboService
public class UserServiceImpl implements IUserService {

@Override
public String sayHello(String name){
    return name + &#34;say hello, my bro.&#34;;
}

}

3.3.3、添加配置文件application.properties
代码语言:javascript
复制
server.port=7010

该服务注册到dubbo中暴露的协议端口

dubbo.protocol.port=20080

该服务注册到dubbo中暴露的协议

dubbo.protocol.name=dubbo

注册中心地址

dubbo.registry.address=zookeeper://127.0.0.1
dubbo.application.name=dubbo3-server

3.3.4、修改Application启动类

启动类需要加上EnableDubbo注解,表示开启dubbo。

代码语言:javascript
复制
@EnableDubbo
@SpringBootApplication
public class Dubbo3ServerApplication {

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

}

接着就可以直接启动server层了。直接启动,发现一直卡在连接zookeeper上,过了一会直接报错了。

3.3.5、出错解决

由于我使用的是JDK17,当Zookeeper对象实例化时,会调用InetSocketAddress的toString方法;而在jdk17中,该方法解析空字符串会拼装/。所以要么降回去使用JDK8,要么修改这个问题。降是不可能降的,一辈子都不可能降的。所以我们开始升级zookeeper版本,由于自带的zookeeper版本为3.4.14,太低了,我们排除后,升级zookeeper版本,问题即可解决。

代码语言:javascript
复制
<dependency>
<groupId>org.apache.dubbo</groupId>
<artifactId>dubbo-dependencies-zookeeper</artifactId>
<version>3.2.10</version>
<type>pom</type>
<exclusions>
<exclusion>
<groupId>org.apache.zookeeper</groupId>
<artifactId>zookeeper</artifactId>
</exclusion>
</exclusions>
</dependency>

<dependency>
<groupId>org.apache.zookeeper</groupId>
<artifactId>zookeeper</artifactId>
<version>3.9.1</version>
</dependency>

继续启动,看到如下输出,启动成功。

3.4、dubbo3-portal

3.4.1、添加依赖

同样需要排除zookeeper版本,自己引入高版本的zookeeper。

代码语言:javascript
复制
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>

&lt;dependency&gt;
    &lt;groupId&gt;org.springframework.boot&lt;/groupId&gt;
    &lt;artifactId&gt;spring-boot-starter-web&lt;/artifactId&gt;
&lt;/dependency&gt;

&lt;!-- https://mvnrepository.com/artifact/org.apache.dubbo/dubbo-spring-boot-starter --&gt;
&lt;dependency&gt;
    &lt;groupId&gt;org.apache.dubbo&lt;/groupId&gt;
    &lt;artifactId&gt;dubbo-spring-boot-starter&lt;/artifactId&gt;
    &lt;version&gt;3.2.10&lt;/version&gt;
&lt;/dependency&gt;

&lt;!-- https://mvnrepository.com/artifact/org.apache.dubbo/dubbo-dependencies-zookeeper --&gt;
&lt;dependency&gt;
    &lt;groupId&gt;org.apache.dubbo&lt;/groupId&gt;
    &lt;artifactId&gt;dubbo-dependencies-zookeeper&lt;/artifactId&gt;
    &lt;version&gt;3.2.10&lt;/version&gt;
    &lt;type&gt;pom&lt;/type&gt;
    &lt;exclusions&gt;
        &lt;exclusion&gt;
            &lt;groupId&gt;org.apache.zookeeper&lt;/groupId&gt;
            &lt;artifactId&gt;zookeeper&lt;/artifactId&gt;
        &lt;/exclusion&gt;
    &lt;/exclusions&gt;
&lt;/dependency&gt;

&lt;dependency&gt;
    &lt;groupId&gt;org.apache.zookeeper&lt;/groupId&gt;
    &lt;artifactId&gt;zookeeper&lt;/artifactId&gt;
    &lt;version&gt;3.9.1&lt;/version&gt;
&lt;/dependency&gt;

&lt;dependency&gt;
    &lt;groupId&gt;com.example&lt;/groupId&gt;
    &lt;artifactId&gt;dubbo3-api&lt;/artifactId&gt;
    &lt;version&gt;0.0.1-SNAPSHOT&lt;/version&gt;
&lt;/dependency&gt;

</dependencies>

3.4.2、定义Controller

定义controller,调用userService的sayHello()。引用IUserService时,需要使用@DubboReference注入。

代码语言:javascript
复制
@RestController
public class UserController {

@DubboReference
private IUserService userService;

@GetMapping(&#34;sayHello/{name}&#34;)
public String sayHello(@PathVariable String name){
    return userService.sayHello(name);
}

}

3.4.3、添加配置文件application.properties
代码语言:javascript
复制
server.port=8010

连接注册中心,需要与dubbo3-server的注册中心一致

dubbo.registry.address=zookeeper://127.0.0.1
dubbo.application.name=dubbo3-portal

3.4.4、修改启动类

启动类需要加上EnableDubbo注解,表示开启dubbo。

代码语言:javascript
复制
@EnableDubbo
@SpringBootApplication
public class Dubbo3PortalApplication {

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

}

3.4.5、启动成功,访问测试

4、小结

Dubbo3与Springboot的简单集成几步就可以了,集成还是相当容易的。目前为止Dubbo3和Dubbo2在集成上发现还是有一些区别的。如:

  1. Server注册到Zookeeper中,Dubbo2的注解为@Service,Dubbo3使用@DubboService。而@Service已经被标注为删除。相比Dubbo2来讲更加有辨识度,相信不少因为@Service用成了Spring的注解,而导致service一致注册失败问题而抓狂的朋友吧。
  2. Portal注入Service时,Dubbo2注解为@Reference,Dubbo3使用@DubboReference,命名上更加有辨识度。
  3. 配置上,同样Dubbo2和Dubbo3提供了XML配置方式和注解方式,但是Dubbo3相比Dubbo2,配置起来更加简单
  4. 依赖不同,Dubbo3特地提供了Springboot集成模块依赖,而不是独立的apache依赖。

简单使用下来发现目前有这几点不同,其他的功能还有待继续深入研究。