基于Springboot+Dubbo+Nacos 注解方式实现微服务调用
一、项目结构
源码下载
启动nacos服务
二、spring-boot-dubbo-base工程
1、pom.xml
<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>
</plugin>
</plugins>
</build>
2、ProviderDTO(RPC接口DTO)
/**
* RPC接口DTO
* 注意这里要实现序列化接口
* @author zhang
*/
@Data
@Builder
public class ProviderDTO implements Serializable {
/**
* ID
*/
private Integer id;
/**
* 名字
*/
private String name;
/**
* 序号
*/
private Integer number;
}
3、IProviderService(RPC接口)
/**
* RPC接口
* @author zhang
*/
public interface IProviderService {
/**
* 查询接口
* @return List
*/
List<ProviderDTO> queryList();
}
4、ResultVO(返回结果类)
/**
* 返回结果类
* 这里采用构建者模式构建
* 优点:1.私有化构造器访问范围小 2.参数可灵活设置便于管理
* @author zhang
*/
@Getter
public class ResultVO<T> implements Serializable {
/**
* 返回码
*/
private Integer code;
/**
* 返回信息
*/
private String message;
/**
* 返回数据
*/
private T data;
/** 私有化构造器 **/
private ResultVO() {}
private ResultVO(ResultVO<T> resultVO) {
this.code = resultVO.code;
this.message = resultVO.message;
this.data = resultVO.data;
}
/**
* Build
*/
public static class Builder<T>{
private ResultVO<T> resultVO;
public Builder() {
resultVO = new ResultVO<>();
}
public Builder code(Integer code){
resultVO.code = code;
return this;
}
public Builder message(String message){
resultVO.message = message;
return this;
}
public Builder data(T data){
resultVO.data = data;
return this;
}
public ResultVO<T> build(){
return new ResultVO<>(resultVO);
}
}
}
三、spring-boot-dubbo-consumer工程
1、pom.xml
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- Base依赖 -->
<dependency>
<groupId>com.sans</groupId>
<artifactId>spring-boot-dubbo-base</artifactId>
<version>0.0.1-SNAPSHOT</version>
</dependency>
<!-- Dubbo依赖 -->
<dependency>
<groupId>org.apache.dubbo</groupId>
<artifactId>dubbo-spring-boot-starter</artifactId>
<version>2.7.0</version>
</dependency>
<dependency>
<groupId>org.apache.dubbo</groupId>
<artifactId>dubbo</artifactId>
<version>2.7.0</version>
</dependency>
<!-- Nacos依赖 -->
<dependency>
<groupId>org.apache.dubbo</groupId>
<artifactId>dubbo-registry-nacos</artifactId>
<version>2.7.1</version>
</dependency>
<dependency>
<groupId>com.alibaba.nacos</groupId>
<artifactId>nacos-client</artifactId>
<version>1.0.0</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
2、application.yml
server:
port: 8862
dubbo:
# 配置服务信息
application:
name: dubbo-consumer
# 禁用QOS同一台机器可能会有端口冲突现象
qos-enable: false
qos-accept-foreign-ip: false
# 配置注册中心
registry:
address: nacos://127.0.0.1:8848
# 设置超时时间
consumer:
timeout: 4000
spring:
main:
# 解决Bean重复定义问题
allow-bean-definition-overriding: true
3、ConsumerApplication(消费主启动类)
/**
* 开启dubbo的注解支持
* @author zhang
*/
@EnableDubbo
@SpringBootApplication
public class ConsumerApplication {
public static void main(String[] args) {
SpringApplication.run(ConsumerApplication.class, args);
}
}
4、ConsumerController(消费测试接口)
/**
* 消费测试接口
* @author zhang
*/
@RestController
@RequestMapping("/consumer")
public class ConsumerController {
/**
* Dubbo远程调用注解
* */
@Reference
private IProviderService providerService;
@GetMapping ("/list")
public ResultVO getList(){
// 远程调用
List<ProviderDTO> providerDTOList = providerService.queryList();
return new ResultVO.Builder().code(200).message("success").data(providerDTOList).build();
}
}
四、spring-boot-dubbo-provider工程
1、pom.xml
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- Base依赖 -->
<dependency>
<groupId>com.sans</groupId>
<artifactId>spring-boot-dubbo-base</artifactId>
<version>0.0.1-SNAPSHOT</version>
</dependency>
<!-- Dubbo依赖 -->
<dependency>
<groupId>org.apache.dubbo</groupId>
<artifactId>dubbo-spring-boot-starter</artifactId>
<version>2.7.0</version>
</dependency>
<dependency>
<groupId>org.apache.dubbo</groupId>
<artifactId>dubbo</artifactId>
<version>2.7.0</version>
</dependency>
<!-- Nacos依赖 -->
<dependency>
<groupId>org.apache.dubbo</groupId>
<artifactId>dubbo-registry-nacos</artifactId>
<version>2.7.1</version>
</dependency>
<dependency>
<groupId>com.alibaba.nacos</groupId>
<artifactId>nacos-client</artifactId>
<version>1.0.0</version>
</dependency>
</dependencies>
2、application.yml
server:
port: 8861
dubbo:
# 配置服务信息
application:
name: dubbo-provider
# 禁用QOS同一台机器可能会有端口冲突现象
qos-enable: false
qos-accept-foreign-ip: false
# 配置注册中心
registry:
address: nacos://127.0.0.1:8848
# 设置协议-协议由提供方指定消费方被动接受
protocol:
name: dubbo
port: 20880
spring:
main:
# 解决Bean重复定义问题
allow-bean-definition-overriding: true
3、ProviderServiceImpl(生产者Dubbo接口实现)
/**
* 生产者Dubbo接口实现
* @author zhang
*/
@Service
public class ProviderServiceImpl implements IProviderService {
@Override
public List<ProviderDTO> queryList() {
// 初始化数据,模拟从数据库获取数据,组装数据
List<ProviderDTO> list = new ArrayList<>();
list.add(ProviderDTO.builder().id(1).name("张三丰").number(100).build());
list.add(ProviderDTO.builder().id(2).name("张翠山").number(101).build());
list.add(ProviderDTO.builder().id(3).name("张无忌").number(102).build());
return list;
}
}
4、ProviderApplication(生产主启动类)
/**
* 开启Dubbo的注解支持
* @author zhang
*/
@EnableDubbo
@SpringBootApplication
public class ProviderApplication {
public static void main(String[] args) {
SpringApplication.run(ProviderApplication.class, args);
}
}
五、顺序启动ProviderApplication、ConsumerApplication发现服务已经注册到nacos
利用postman测试