大多数系统趋于服务化涉及,目前主流的就是 Dubbo 与 Spring could 本文主要介绍 Dubbo与Spring Boot 整合使用。
1.准备阶段
1.1Dubbo环境搭建
Dubbo环境搭建(ZooKeeper+Dubbo Admin)
1.2技术栈:
- Spring-boot
- JDK 8
- Dubbo
- Zookeeper
2.整合实例
dubbo服务作为一款分布式开源框架,其最大的特色是采用了一种分层的架构,来达到解耦的目的。
其服务主要是围绕着两个节点:服务提供方和服务消费方,服务提供方实现服务,而服务消费方调用服务。
因此,我们需要在springboot中分别搭建服务的提供者和消费者。
工程结构示意图
dubbo-facafe-api 对外暴露接口工程,生产者与消费者公用
dubbo-provide 生产者服务
dubbo-consumer 消费者服务
2.1 创建对外接口API工程
注:工程名 -> dubbo-facafe-api
2.1.1 添加 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>
<groupId>com.example</groupId>
<artifactId>dubbo-facafe-api</artifactId>
<version>1.0.0</version>
<packaging>jar</packaging>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>1.8</java.version>
</properties>
<dependencies>
<!-- lombok -->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.16.18</version>
<scope>provided</scope>
</dependency>
</dependencies>
</project>
2.1.2 测试参数Bean
package com.example.api.model;
import lombok.*;
import java.io.Serializable;
/**
* 参数类 - 人员
*
* @author 码农猿
*/
@Data
public class UserInfoVO implements Serializable {
private Integer id;
private String username;
private String password;
public UserInfoVO(Integer id, String username, String password) {
this.id = id;
this.username = username;
this.password = password;
}
public UserInfoVO() {
}
@Override
public String toString() {
return "UserInfoVO{" +
"id=" + id +
", username='" + username + '\'' +
", password='" + password + '\'' +
'}';
}
}
2.1.3 对外开放接口
package com.example.api.service;
import com.example.api.model.UserInfoVO;
import java.util.List;
/**
* 公共对外接口 - 人员管理
*
* @author 码农猿
*/
public interface UserApiService {
/**
* 添加人员
*/
UserInfoVO saveUser(UserInfoVO user);
/**
* 获取人员列表
*/
List<UserInfoVO> listUser();
}
2.2 创建生产者服务
注:即服务提供者,项目名 -> dubbo-provide
2.2.1 添加 pom 文件
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.0.3.RELEASE</version>
</parent>
<dependencies>
<!-- 公共开放Api接口工程 -->
<dependency>
<groupId>com.example</groupId>
<artifactId>dubbo-facafe-api</artifactId>
<version>1.0.0</version>
</dependency>
<!-- spring-boot -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-log4j2</artifactId>
</dependency>
<!-- dubbo 整合 spring-boot -->
<dependency>
<groupId>com.alibaba.boot</groupId>
<artifactId>dubbo-spring-boot-starter</artifactId>
<version>0.2.0</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
2.2.2 创建配置文件
application.properties
server.port=9000
#dubbo 配置
#当前应用标识
dubbo.application.id=dubbo-provide
#当前应用名称
dubbo.application.name=dubbo-provide
#注册中心地址,多个可逗号分隔
dubbo.registry.address=zookeeper://192.168.0.153:2181
#dubbo 协议端口 ,填-1,则自动分配
dubbo.protocol.port=12501
#dubbo 扫描包地址 (一搬是@Service 注解使用的包)
dubbo.scan.basePackages=com.example.provide.service
2.2.3 创建启动类
/**
* 服务提供者 应用启动类
*
* @author 码农猿
*/
@SpringBootApplication
public class ProvideApplication {
public static void main(String[] args) {
SpringApplication.run(ProvideApplication.class, args);
}
}
2.2.4 创建常量类
注:这里是有常量类,模拟一些测试数据
/**
* 常量-模拟测试数据
*
* @author 码农猿
*/
public class MockDataConstant {
/**
* 模拟参数
*/
public static List<UserInfoVO> userMockList = new ArrayList<>();
static {
UserInfoVO user1 = new UserInfoVO(1, "张三", "111111");
UserInfoVO user2 = new UserInfoVO(2, "李四", "222222");
UserInfoVO user3 = new UserInfoVO(3, "王五", "333333");
userMockList.add(user1);
userMockList.add(user2);
userMockList.add(user3);
}
}
2.2.5 创建接口实现
注意: 这里的注解 @Service 是包 com.alibaba.dubbo.config.annotation 下的;
package com.example.provide.service.impl;
import com.alibaba.dubbo.config.annotation.Service;
import com.example.api.model.UserInfoVO;
import com.example.api.service.UserApiService;
import com.example.provide.constant.MockDataConstant;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.util.List;
/**
* 人员接口-实现
*
* @author 码农猿
*/
@Service
public class UserServiceImpl implements UserApiService {
/**
* 日志
*/
private static final Logger LOGGER = LoggerFactory.getLogger(UserServiceImpl.class);
/**
* 添加人员
*/
@Override
public UserInfoVO saveUser(UserInfoVO user) {
long timeMillis = System.currentTimeMillis();
LOGGER.info("【{}】>> 添加人员接口 >> 执行开始 , user={}", timeMillis, user);
user.setId(MockDataConstant.userMockList.size() + 1);
MockDataConstant.userMockList.add(user);
LOGGER.info("【{}】>> 添加人员接口 >> 执行结束 , user={}", timeMillis, user);
return user;
}
/**
* 获取人员列表
*/
@Override
public List<UserInfoVO> listUser() {
LOGGER.info("【{}】>> 获取人员列表 >> 接口", System.currentTimeMillis());
return MockDataConstant.userMockList;
}
}
2.3 创建消费者服务
注:项目名 - > dubbo-consumer
2.3.1 添加 pom 文件
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.0.3.RELEASE</version>
</parent>
<dependencies>
<!-- 公共开放Api接口工程 -->
<dependency>
<groupId>com.example</groupId>
<artifactId>dubbo-facafe-api</artifactId>
<version>1.0.0</version>
</dependency>
<!-- spring-boot -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- dubbo 整合 spring-boot -->
<dependency>
<groupId>com.alibaba.boot</groupId>
<artifactId>dubbo-spring-boot-starter</artifactId>
<version>0.2.0</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
2.3.2 创建配置文件
application.properties
server.port=9001
#dubbo 配置
#当前应用标识
dubbo.application.id=dubbo-consumer
#当前应用名称
dubbo.application.name=dubbo-consumer
#注册中心地址
dubbo.registry.address=zookeeper://192.168.0.153:2181
#dubbo 协议端口 ,填-1,则自动分配
dubbo.protocol.port=12500
2.3.3 创建启动类
/**
* 消费者服务 应用启动类
*
* @author 码农猿
*/
@SpringBootApplication
public class ConsumerApplication {
public static void main(String[] args) {
SpringApplication.run(ConsumerApplication.class, args);
}
}
2.3.3 创建Controller
package com.example.consumer.controller;
import com.alibaba.dubbo.config.annotation.Reference;
import com.example.api.model.UserInfoVO;
import com.example.api.service.UserApiService;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
/**
* 消费者服务 测试
*
* @author 码农猿
*/
@RestController
@RequestMapping("/user")
public class UserController {
/**
* 日志
*/
private static final Logger LOGGER = LoggerFactory.getLogger(UserController.class);
/**
* 引用服务
*/
@Reference
private UserApiService userApiService;
/**
* 添加人员
*/
@RequestMapping("/save")
public Object saveUser(@RequestBody UserInfoVO user) {
LOGGER.info("【消费者服务】>> 添加人员");
return userApiService.saveUser(user);
}
/**
* 获取人员列表
*/
@RequestMapping("/list")
public Object listUser() {
LOGGER.info("【消费者服务】>> 获取人员列表");
return userApiService.listUser();
}
}
2.4 服务启动与调试
先启动生产者 dubbo-provide
在启动消费者 dubbo-consumer
在Dubbo admin 观察服务注册情况
访问消费者的Controller 调试
附录
关注程序员小强公众号更多编程趣事,知识心得与您分享