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中的一些简单配置,我们删除一下注释内容,只剩下以下配置:
# 时间配置最小但域,其他时间配置以整数倍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依赖
<dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter</artifactId> </dependency>
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <!-- https://mvnrepository.com/artifact/org.apache.dubbo/dubbo-spring-boot-starter --> <dependency> <groupId>org.apache.dubbo</groupId> <artifactId>dubbo-spring-boot-starter</artifactId> <version>3.2.10</version> </dependency> <!-- https://mvnrepository.com/artifact/org.apache.dubbo/dubbo-dependencies-zookeeper --> <dependency> <groupId>org.apache.dubbo</groupId> <artifactId>dubbo-dependencies-zookeeper</artifactId> <version>3.2.10</version> <type>pom</type> </dependency>
</dependencies>
3.2、dubbo3-api
这一层我们定义一个公用的接口类和实体类。我们定义了IUserService。
public interface IUserService {
String sayHello(String name);
}
3.3、dubbo3-server
3.3.1、添加依赖
<dependencies>
<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> </dependency> <!-- https://mvnrepository.com/artifact/org.apache.dubbo/dubbo-spring-boot-starter --> <dependency> <groupId>org.apache.dubbo</groupId> <artifactId>dubbo-spring-boot-starter</artifactId> <version>3.2.10</version> </dependency> <!-- https://mvnrepository.com/artifact/org.apache.dubbo/dubbo-dependencies-zookeeper --> <dependency> <groupId>org.apache.dubbo</groupId> <artifactId>dubbo-dependencies-zookeeper</artifactId> <version>3.2.10</version> <type>pom</type> </dependency> <dependency> <groupId>com.example</groupId> <artifactId>dubbo3-api</artifactId> <version>0.0.1-SNAPSHOT</version> </dependency>
</dependencies>
3.3.2、实现IUserService
定义service实现类,实现IUserService接口。这里的Service需要加上@DubboService,声明自己托管给dubbo进行管理。
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 + "say hello, my bro."; }
}
3.3.3、添加配置文件application.properties
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。
@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版本,问题即可解决。
<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。
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency><dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <!-- https://mvnrepository.com/artifact/org.apache.dubbo/dubbo-spring-boot-starter --> <dependency> <groupId>org.apache.dubbo</groupId> <artifactId>dubbo-spring-boot-starter</artifactId> <version>3.2.10</version> </dependency> <!-- https://mvnrepository.com/artifact/org.apache.dubbo/dubbo-dependencies-zookeeper --> <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> <dependency> <groupId>com.example</groupId> <artifactId>dubbo3-api</artifactId> <version>0.0.1-SNAPSHOT</version> </dependency>
</dependencies>
3.4.2、定义Controller
定义controller,调用userService的sayHello()。引用IUserService时,需要使用@DubboReference注入。
@RestController
public class UserController {@DubboReference private IUserService userService; @GetMapping("sayHello/{name}") public String sayHello(@PathVariable String name){ return userService.sayHello(name); }
}
3.4.3、添加配置文件application.properties
server.port=8010
连接注册中心,需要与dubbo3-server的注册中心一致
dubbo.registry.address=zookeeper://127.0.0.1
dubbo.application.name=dubbo3-portal
3.4.4、修改启动类
启动类需要加上EnableDubbo注解,表示开启dubbo。
@EnableDubbo
@SpringBootApplication
public class Dubbo3PortalApplication {public static void main(String[] args) { SpringApplication.run(Dubbo3PortalApplication.class, args); }
}
3.4.5、启动成功,访问测试
4、小结
Dubbo3与Springboot的简单集成几步就可以了,集成还是相当容易的。目前为止Dubbo3和Dubbo2在集成上发现还是有一些区别的。如:
- Server注册到Zookeeper中,Dubbo2的注解为@Service,Dubbo3使用@DubboService。而@Service已经被标注为删除。相比Dubbo2来讲更加有辨识度,相信不少因为@Service用成了Spring的注解,而导致service一致注册失败问题而抓狂的朋友吧。
- Portal注入Service时,Dubbo2注解为@Reference,Dubbo3使用@DubboReference,命名上更加有辨识度。
- 配置上,同样Dubbo2和Dubbo3提供了XML配置方式和注解方式,但是Dubbo3相比Dubbo2,配置起来更加简单
- 依赖不同,Dubbo3特地提供了Springboot集成模块依赖,而不是独立的apache依赖。
简单使用下来发现目前有这几点不同,其他的功能还有待继续深入研究。