相信大家对于Dubbo都不陌生吧,前段时间看到Dubbo的官网上放出了最新的2.7.5的版本,发现新增了不少特性,这也是自从阿里将Dubbo交给apache维护之后迎来的首次比较大的更新。官网http://dubbo.apache.org。
进入官网之后我们查看文档(http://dubbo.apache.org/zh-cn/docs/user/new-features-in-a-glance.html),首先来看第一个章节:
我们发现最新的版本是2.7.5,由于刚发布不久,所以官方并不建议在生产环境使用 ,今天我们本着学习的心态可以先来尝尝鲜。
首先我们点击文档中左侧的快速启动,进入该章节,
我们发现官方文档上的入门案例使用的是Spring的配置方式,而现在Spring官方推荐广大开发者使用SpringBoot进行开发,因此本文也使用SpringBoot来尝鲜。
首先打开idea,创建一个空项目,如下图所示:
继续点击next, 创建完成之后点击file -> new -> Module 创建一个模块,
为了方便构建应用,我们使用Spring Initializr 来快速构建,我们先创建服务提供者,填入相应的坐标
接着我们点击next
既然Dubbo我们今天玩最新的,那么索性SpringBoot也用最新的吧,截止到今天最新的GA版本是2.2.6,这里我们先直接next.
创建完成之后,我们创建相应的包结构,如下图如所示:
UserServiceImpl 的代码如下:
@Service
@Component
public class UserServiceImpl implements UserService {
@Override
public List<Address> getUserAddressList(String userId) {
Address address1 = new Address(1, "武汉市江汉区建银大厦7楼702", "1", "tom", "027-15416474", "Y");
Address address2 = new Address(2, "武汉市武昌区中铁大厦36楼204", "1", "jerry", "027-56253825", "N");
return Arrays.asList(address1,address2);
}
}
这里需要注意的是@Service 注解我们要使用Dubbo的而不是Spring框架的,为了能加载到Spring容器中,我们同时也加上@Component注解。对于UserService接口这里我将其单独提取出来了,形成一个interface模块,将来所有的接口统一维护在interface模块。
接着我们使用同样的方法,再新建一个模块,模块的结构如下图:
我们将开发者需要使用的实体类和接口划分进该模块中,Address和UserService的代码如下图所示:
public class Address implements Serializable {
private Integer id;
private String userAddress;
private String userId;
private String consignee;
private String phoneNum;
private String isDefault;
public Address() {
super();
// TODO Auto-generated constructor stub
}
public Address(Integer id, String userAddress, String userId, String consignee, String phoneNum,
String isDefault) {
super();
this.id = id;
this.userAddress = userAddress;
this.userId = userId;
this.consignee = consignee;
this.phoneNum = phoneNum;
this.isDefault = isDefault;
}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getUserAddress() {
return userAddress;
}
public void setUserAddress(String userAddress) {
this.userAddress = userAddress;
}
public String getUserId() {
return userId;
}
public void setUserId(String userId) {
this.userId = userId;
}
public String getConsignee() {
return consignee;
}
public void setConsignee(String consignee) {
this.consignee = consignee;
}
public String getPhoneNum() {
return phoneNum;
}
public void setPhoneNum(String phoneNum) {
this.phoneNum = phoneNum;
}
public String getIsDefault() {
return isDefault;
}
public void setIsDefault(String isDefault) {
this.isDefault = isDefault;
}
}
public interface UserService {
/**
* 按照用户id返回所有的用户地址
* @param userId
* @return
*/
public List<Address> getUserAddressList(String userId);
}
好了,我们再回到provider模块中,将interface模块的坐标在pom文件中引入即可。同时我们还要在provider模块中加入Dubbo 的坐标,完整的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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.2.6.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.wcan.dubbo</groupId>
<artifactId>boot-dubbo-provider</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>boot-dubbo-provider</name>
<description>Demo project for Spring Boot</description>
<properties>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<!-- Dubbo Spring Boot Starter -->
<dependency>
<groupId>org.apache.dubbo</groupId>
<artifactId>dubbo-spring-boot-starter</artifactId>
<version>2.7.5</version>
</dependency>
<dependency>
<groupId>com.wcan.dubbo</groupId>
<artifactId>boot-dubbo-interface</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>org.apache.curator</groupId>
<artifactId>curator-recipes</artifactId>
<version>2.8.0</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
<exclusions>
<exclusion>
<groupId>org.junit.vintage</groupId>
<artifactId>junit-vintage-engine</artifactId>
</exclusion>
</exclusions>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
大家可能有疑问Dubbo的Starter坐标从哪里来的,这里我们可以回到管网的首页,如下图:
我们点击左边的github,因为Dubbo项目的源码是托管在github上的,进入github上Dubbo 的项目页面如下图所示,:
上图就是Dubbo项目的所有模块,这里我们直接来到当前页面的末尾:
我们可以看到,在Dubbo ecosystem章节中有一个SpringBoot project for Dubbo的子章节,这里我们点进去,往下拉:
在下面的pom文件中我们就可以看到Dubbo的starter的坐标了。
好了回到我们项目中,这里我们还需要引入操作zookeeper的客户端工具 curator-recipes的坐标,由于我使用的zookeeper是3.4d的版本 ,因此这里curator-recipes 我选择的是2.8,好了,服务提供方的模块基本搭建完成了,这里我们现在控制台安装一下interface模块:
安装成功之后的提示信息如下:
‘
好了,我们的provider模块中应该不会再出现报错信息了,接着我们来配置application.properties 文件,该文件的配置内容如下:
dubbo.application.name=boot-dubbo-provider
dubbo.registry.address=192.168.137.100:2181
dubbo.registry.protocol=zookeeper
dubbo.protocol.name=dubbo
dubbo.protocol.port=20881
dubbo.monitor.protocol=registry
首先我们配置的是服务提供者的映射规则,接着是注册中心的地址和端口,这里我们使用的是zookeeper,因此协议使用的也是zookeeper协议。 这里我们可以查看文档,
好了,后面的配置是关于Dubbo协议的 ,具体的信息可以参考文档。配置文件写好了之后我们还需要在启动类上加上一个@EnableDubbo注解,该注解的功能是指定扫描包路径。这里我们可以直接加载启动类上即可,
@EnableDubbo
@SpringBootApplication
public class BootDubboProviderApplication {
public static void main(String[] args) {
SpringApplication.run(BootDubboProviderApplication.class, args);
}
}
好了,准备工作已经做完了,这时候我们就可以启动服务提供模块了。
当我们出现这个错误信息的时候,一般都是zookeeper出现了问题,仔细检查zookeeper的服务是否正常,端口是否畅通,配置文件中的ip是否正确等等,这里是因为我的zookeeper还没启动,好了,启动zookeeper即可。
provider模块编写完成之后我们再创建一个consumer模块,该模块需要引入web模块,方便测试。创建完成之后的项目结构如下图所示:
接着我们编辑一下pom文件,将Dubbo的坐标和interface的坐标导入项目中即可,完整的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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.2.6.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.wcan.dubbo</groupId>
<artifactId>boot-dubbo-consumer</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>boot-dubbo-consumer</name>
<description>Demo project for Spring Boot</description>
<properties>
<java.version>1.8</java.version>
</properties>
<dependencies>
<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>
<exclusions>
<exclusion>
<groupId>org.junit.vintage</groupId>
<artifactId>junit-vintage-engine</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.apache.dubbo</groupId>
<artifactId>dubbo-spring-boot-starter</artifactId>
<version>2.7.5</version>
</dependency>
<dependency>
<groupId>com.wcan.dubbo</groupId>
<artifactId>boot-dubbo-interface</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.apache.curator/curator-recipes -->
<dependency>
<groupId>org.apache.curator</groupId>
<artifactId>curator-recipes</artifactId>
<version>2.8.0</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
最后分别编写controller和service层的代码:
@Controller
public class UserAddressController {
@Autowired
private UserAddressService userAddressService;
@ResponseBody
@RequestMapping("/getAddressList")
public List<Address> getAddressList(String id){
return userAddressService.getUserAddress(id);
}
}
@Service
public class UserAddressServiceimpl implements UserAddressService {
@Reference
UserService userService;
@Override
public List<Address> getUserAddress(String userId) {
return userService.getUserAddressList(userId);
}
}
同样的,我们将UserAddressService 接口放到interface模块中,
public interface UserAddressService {
/**
* 获取用户地址列表
* @param userId
*/
public List<Address> getUserAddress(String userId);
}
好了,最后我们来配置服务消费者的配置文件,具体信息如下:
server.port=8081
dubbo.application.name=boot-dubbo-consumer
dubbo.registry.address=zookeeper://192.168.137.100:2181
dubbo.monitor.protocol=registry
最后我们启动服务,打开postman访问http://localhost:8081/getAddressList?id=1 即可看到服务调用的效果了
最后我们来看一下最新版Dubbo的控制台,首先我们回到官方文档上,我们查看左下角的运维管理章节:
选择第一个章节,控制太介绍,如下图:
我们打开git终端,执行上述命令即可,启动控制台之后访问的界面如下所示:
可以看到我们发布的服务了。好了关于最新版本的Dubbo整合SpringBoot就先介绍到这里了。下次有空的话我们一起来构建一下Dubbo的源码。