先把demo跑起来,再看文档。这一篇先写一个最基本的demo。
Dubbo与Spring Boot的集成,按照最基本的方式,开发了三个模块。
首先创建dubbostudy工程,随后分别创建dubboapis,dubboprovider以及dubboconsumer三个模块,这里面
dubboapis 是对外暴露接口工程,生产者与消费者公用
dubboprovide 生产者服务
dubboconsumer 消费者服务
创建完上面三个模块后,可以先往下走,应用启动过程中可能会报缺curator相关的包的异常。最后出错了再回头来这里看下。如果是报curator相关的缺包异常,那么可以在dubboStudy的pom文件里加上如下三个引用
<dependency>
<groupId>org.apache.curator</groupId>
<artifactId>curator-framework</artifactId>
<version>5.0.0</version>
</dependency>
<dependency>
<groupId>org.apache.curator</groupId>
<artifactId>curator-recipes</artifactId>
<version>5.0.0</version>
</dependency>
<dependency>
<groupId>org.apache.curator</groupId>
<artifactId>curator-x-discovery</artifactId>
<version>5.1.0</version>
</dependency>
一、 dubboapis模块
创建模块后,看下他的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 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent>
<artifactId>dubboStudy</artifactId>
<groupId>com.ward</groupId>
<version>1.0</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>dubboapis</artifactId>
<properties>
<maven.compiler.source>8</maven.compiler.source>
<maven.compiler.target>8</maven.compiler.target>
</properties>
</project>
这里可以不用动,因为这里就是申明接口,暴露出来服务,暂时没有什么依赖jar包。
创建实体类对象UserModel
package com.ward.models;
public class UserModel {
private Integer id;
private String username;
private String password;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
@Override
public String toString() {
return "UserModel{" +
"id=" + id +
", username='" + username + '\'' +
", password='" + password + '\'' +
'}';
}
}
【不建议使用lombok插件,小白想知道具体原因可以详细了解下相关知识。】
创建对外开放的接口UserService
package com.ward.services;
import com.ward.models.UserModel;
/**
* 对User的增删改查操作
*/
public interface UserService {
int saveUser(UserModel userModel);
int deleteUser(Long id);
int updateUser(UserModel userModel);
UserModel getUser(Long id);
}
Demo示例,简单的增删改查操作。
以上,公共的API接口部分就完成了。
二、dubboprovider模块
创建模块,添加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 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent>
<artifactId>dubboStudy</artifactId>
<groupId>com.ward</groupId>
<version>1.0</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>dubboprovider</artifactId>
<properties>
<maven.compiler.source>8</maven.compiler.source>
<maven.compiler.target>8</maven.compiler.target>
</properties>
<dependencies>
<!-- 公共开放Api接口工程 -->
<dependency>
<groupId>com.ward</groupId>
<artifactId>dubboapis</artifactId>
<version>1.0</version>
</dependency>
<!-- spring-boot -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<version>2.4.1</version>
</dependency>
<!-- dubbo 整合 spring-boot -->
<dependency>
<groupId>org.apache.dubbo</groupId>
<artifactId>dubbo-spring-boot-starter</artifactId>
<version>3.0.3</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
添加的几个依赖,看下对应的注释。
配置文件
server:
port: 9001
dubbo:
application:
id: dubbo-provider
name: dubbo-provider
registry:
address: zookeeper://127.0.0.1:2181
#dubbo 协议端口 ,填-1,则自动分配
protocol:
port: 12501
#dubbo 扫描包地址 (一般是@Service 注解使用的包)
scan:
base-packages: com.ward.provide.services
provider:
timeout: 50000
基本的配置如上,(最后这个timeout可加可不加)
这里使用zookeeper作为注册中心,后面启动生产者和消费者的应用前要先启动Zookeeper。
创建启动类
package com.ward.provider;
import org.apache.dubbo.config.spring.context.annotation.EnableDubbo;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
@EnableDubbo
public class ProvideApplication {
public static void main(String[] args) {
SpringApplication.run(ProvideApplication.class, args);
}
}
一定要加EnableDubbo注解,否则接口调用过程中有问题,找不到对应的实现类等等。
创建暴露出来的UserService的具体实现业务类
package com.ward.provider.services;
import com.ward.models.UserModel;
import com.ward.services.UserService;
import org.apache.dubbo.config.annotation.DubboService;
@DubboService
public class UserServiceImpl implements UserService {
@Override
public int saveUser(UserModel userModel) {
System.out.println("Save UserModel Service");
return 0;
}
@Override
public int deleteUser(Long id) {
System.out.println("Delete UserModel Service");
return 0;
}
@Override
public int updateUser(UserModel userModel) {
System.out.println("Update UserModel Service");
return 0;
}
@Override
public UserModel getUser(Long id) {
System.out.println("Get UserModel Service");
return null;
}
}
注意,这里的@DubboService注解。一开始啥也不知道,按照习惯会使用Spring的@Service,可以试下有没有问题。我这里看到了DubboService就直接用了,没有使用Service注解。
以上,生产者provider服务就创建完毕了。
三、dubboconsumer模块
创建模块,添加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 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent>
<artifactId>dubboStudy</artifactId>
<groupId>com.ward</groupId>
<version>1.0</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>dubboconsumer</artifactId>
<properties>
<maven.compiler.source>8</maven.compiler.source>
<maven.compiler.target>8</maven.compiler.target>
</properties>
<dependencies>
<dependency>
<groupId>com.ward</groupId>
<artifactId>dubboapis</artifactId>
<version>1.0</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<version>2.4.1</version>
</dependency>
<dependency>
<groupId>org.apache.dubbo</groupId>
<artifactId>dubbo-spring-boot-starter</artifactId>
<version>3.0.3</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
这里跟provider是一样的。
配置文件
server:
port: 9002
dubbo:
application:
name: dubbo-consumer
id: dubbo-consumer
registry:
address: zookeeper://127.0.0.1:2181
protocol:
port: 12500
consumer:
timeout: 50000
跟provider也是一样的,注意端口号,应用名称和ID。
创建启动类
package com.ward.consumer;
import org.apache.dubbo.config.spring.context.annotation.EnableDubbo;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
@EnableDubbo
public class ConsumerApplication {
public static void main(String[] args) {
SpringApplication.run(ConsumerApplication.class, args);
}
}
记得加EnableDubbo注解。
创建Controller,接受外来请求
package com.ward.consumer.controllers;
import com.ward.models.UserModel;
import com.ward.services.UserService;
import org.apache.dubbo.config.annotation.DubboReference;
import org.springframework.web.bind.annotation.*;
@RestController
@RequestMapping("/user")
public class UserController {
@DubboReference
private UserService userService;
**
* 添加人员
*/
@RequestMapping("/save")
public Object saveUser(@RequestBody UserModel user) {
System.out.println("【消费者服务】>> 添加人员");
return userService.saveUser(user);
}
**
* 获取人员列表
*/
@RequestMapping(value = "/get/{id}", method = RequestMethod.GET)
public String listUser(@PathVariable Long id) {
System.out.println("【消费者服务】>> 获取人员列表");
UserModel userModel = userService.getUser(id);
return "Get UserModel Success!";
}
public UserService getUserService() {
return userService;
}
public void setUserService(UserService userService) {
this.userService = userService;
}
}
注意这里,Controller里引用Service的时候,用的@DubboReference注解,这里可以对比下跟以前的@Autowired注解有什么区别。(最后讲)
以上,就是消费者模块的搭建过程。
四、启动服务,看效果
下载下来zookeeper的包后,解压,进入conf文件夹下面,复制一份zoo_sample.cfg文件,改名为zoo.cfg,才可以启动,否则会报配置文件找不到的问题。
分别启动Zookeeper,Provider,Consumer应用。
使用Postman调用UserController提供出来的接口,结果如下
以上,跟代码里给出的demo结果一致,Demo搭建完毕。
五、相关注解与Spring的区别做个说明
OK,看下两组注解
申明Service的时候,@DubboService与@Service的区别

经过测试,
import org.apache.dubbo.config.annotation.DubboService;
import org.apache.dubbo.config.annotation.Service;
相同包下面的DubboService与Service两个注解没有区别,都可以正常使用。
但是Spring中的Service不可以使用,否则会报Zookeeper服务断开的异常。?
2. 引用Service的时候,@DubboReference与@Autowired的区别
@Autowired是从本地IOC容器中取出注入的对象并使用;
@DubboReference是从远程IOC容器中取出注入的对象并使用。




