基于Springboot搭建DUBBO框架(极致教程)
zookeeper下载安装
使用zookeeper作为注册中心,链接:
https://archive.apache.org/dist/zookeeper/zookeeper-3.4.6/
解压安装后在conf下面将zoo_sample.cfg重命名为zoo.cfg(有需要可以的话修改zoo.cfg配置文件的dataDir属性,指定zk文件生成位置)
搭建DUBBO工程
- 打开idea新建maven工程
- 点击finish完成父工程创建(project可以自己起)
- 创建provider服务
新建new module选择springboot项目
选择如下配置(名称可以自己更改),之后全部next到底创建工程为止
创建consumer
同上new module创建服务消费者也是全部next
创建接口服务
创建接口模块(maven)
父工程选择第一次创建的dubbo project, 这个module名称就用rpc_api(因为之后需要引用),点击创建完成
完成配置
- 父工程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">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.2.11.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.syw</groupId>
<artifactId>RPC-DUBBO</artifactId>
<packaging>pom</packaging>
<version>1.0-SNAPSHOT</version>
<!--这个是父工程依赖的子模块名称(写自己的)-->
<modules>
<module>rpc_api</module>
<module>rpc_provider</module>
<module>rpc_consumer</module>
</modules>
<properties>
<java.version>1.8</java.version>
<spring.boot.version>2.2.11.RELEASE</spring.boot.version>
<project.source.encoding>UTF-8</project.source.encoding>
<projectlombok.version>1.18.12</projectlombok.version>
</properties>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
<version>${spring.boot.version}</version>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
<version>${projectlombok.version}</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<version>${spring.boot.version}</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>com.alibaba.boot</groupId>
<artifactId>dubbo-spring-boot-starter</artifactId>
<version>0.2.0</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<version>${spring.boot.version}</version>
</dependency>
</dependencies>
</dependencyManagement>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<excludes>
<exclude>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</exclude>
</excludes>
</configuration>
</plugin>
</plugins>
</build>
</project>
- provider 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>
<artifactId>RPC-DUBBO</artifactId>
<groupId>com.syw</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<groupId>com.syw</groupId>
<artifactId>rpc_provider</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>rpc_provider</name>
<description>Demo project for Spring Boot</description>
<properties>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>com.syw</groupId>
<artifactId>rpc_api</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>com.alibaba.boot</groupId>
<artifactId>dubbo-spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<excludes>
<exclude>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</exclude>
</excludes>
</configuration>
</plugin>
</plugins>
</build>
</project>
- consumer 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>
<artifactId>RPC-DUBBO</artifactId>
<groupId>com.syw</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<groupId>com.syw</groupId>
<artifactId>rpc_consumer</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>rpc_consumer</name>
<description>Demo project for Spring Boot</description>
<properties>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>com.syw</groupId>
<artifactId>rpc_api</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>com.alibaba.boot</groupId>
<artifactId>dubbo-spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<excludes>
<exclude>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</exclude>
</excludes>
</configuration>
</plugin>
</plugins>
</build>
</project>
- api 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>RPC-DUBBO</artifactId>
<groupId>com.syw</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<groupId>com.syw</groupId>
<artifactId>rpc_api</artifactId>
<dependencies>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<excludes>
<exclude>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</exclude>
</excludes>
</configuration>
</plugin>
</plugins>
</build>
</project>
等依赖加载完毕后查看maven生命周期没有飘红说明搭建成功
代码编写
- 首先在api模块下编写接口,实体类,(这边就写user接口了)
@Data
@AllArgsConstructor
@NoArgsConstructor
@ToString(exclude = "id")
public class UserAddress implements Serializable {
private Integer id;
private String userAddress;
private String userId;
private String consignee;
private String phoneNum;
private String isDefault;
}
/**
* @author Syw81
*/
public interface UserService {
List<UserAddress> getUserAll();
UserAddress get(String userId);
}
- 在provider下面创建接口的实现类
package com.syw.provider.service.impl;
import com.syw.api.entity.UserAddress;
import com.syw.api.service.UserService;
import org.springframework.stereotype.Service;
import java.util.Arrays;
import java.util.List;
import java.util.Objects;
import java.util.stream.Collectors;
/**
* <Description> <br>
*
* @author shi.yuwen<br>
* @version 1.0<br>
* @taskId: <br>
* @createDate 2021/03/29 18:35 <br>
* @see com.syw.provider.service.impl <br>
*/
@Service
@com.alibaba.dubbo.config.annotation.Service
public class UserServiceImpl implements UserService {
/**
* <Description> <br>
* 模拟数据
*/
private static List<UserAddress> userAddresses;
static {
UserAddress userAddress1 = new UserAddress(1, "北京朝阳", "user001", "shi.yuwen", "123456", "Y");
UserAddress userAddress2 = new UserAddress(2, "南京江宁", "user002", "wang,wnagwnag", "654321", "N");
userAddresses = Arrays.asList(userAddress1, userAddress2);
}
@Override
public List<UserAddress> getUserAll() {
return userAddresses;
}
@Override
public UserAddress get(String userId) {
List<UserAddress> userAddress = userAddresses.stream()
.filter((e) -> Objects.equals(e.getUserId(), userId))
.collect(Collectors.toList());
return userAddress.get(0);
}
}
同时修改application.yml文件配置(properties文件可以先把后缀改成yml)
spring:
application:
name: rpc_provider
server:
port: 8081
servlet:
context-path: /
dubbo:
application:
name: rpc_provider
registry:
address: zookeeper://127.0.0.1:2181
protocol:
name: dubbo
port: 20881
- consumer代码编写 consumer编写接口调用类和controller测试
package com.syw.consumer.service.impl;
import com.alibaba.dubbo.config.annotation.Reference;
import com.syw.api.entity.UserAddress;
import com.syw.api.service.UserService;
import org.springframework.stereotype.Service;
import java.util.List;
/**
* <Description> <br>
*
* @author shi.yuwen<br>
* @version 1.0<br>
* @taskId: <br>
* @createDate 2021/03/29 19:06 <br>
* @see com.syw.consumer.service.impl <br>
*/
@Service
public class UserAddressServiceImpl implements UserService {
@Reference
private UserService userService;
@Override
public List<UserAddress> getUserAll() {
return userService.getUserAll();
}
@Override
public UserAddress get(String userId) {
return userService.get(userId);
}
}
package com.syw.consumer.controller;
import com.syw.api.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
/**
* <Description> <br>
*
* @author shi.yuwen<br>
* @version 1.0<br>
* @taskId: <br>
* @createDate 2021/03/29 19:12 <br>
* @see com.syw.consumer.controller <br>
*/
@RestController
@RequestMapping("userAddress")
public class UserAddressController {
@Autowired
private UserService userAddressService;
@RequestMapping("get")
public String getUserAddress(String userId) {
return userAddressService.get(userId).toString();
}
}
yml文件:
spring:
application:
name: rpc_consumer
server:
port: 8082
servlet:
context-path: /
dubbo:
application:
name: rpc_consumer
registry:
address: zookeeper://127.0.0.1:2181
protocol:
name: dubbo
port: 20881
测试
- 先启动注册中心zk(进入zookeeper安装的bin目录启动zkServer.cmd) 启动完后窗口别关
- 依次启动provider和consumer服务
- 请求下consumer服务的控制层(consumer服务端口为8082),请求成功
小结
以上是springboot使用注解方式搭建的dubbo项目,但是dubbo还有许多rpc功能如服务高可用配置,和服务发布管理配置,后续会采用xml配置方式搭建并讲解