工程概览
duubo-api :工共接口工程,包含pojo
dubbo-consumer-web:服务消费者工程
dubbo-provider-service:服务提供者工程
确认以下主要环境具备
zookeeper (192.168.7.100:2181)
mysql (127.0.0.1:3306)
1.准备测试数据
在mysql数据库新建测试用的数据
执行如下sql脚本,新建employee_tbl
表
SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;
-- ----------------------------
-- Table structure for employee_tbl
-- ----------------------------
DROP TABLE IF EXISTS `employee_tbl`;
CREATE TABLE `employee_tbl` (
`id` int(11) NOT NULL,
`name` char(10) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL DEFAULT '',
`date` datetime(0) NOT NULL,
`singin` tinyint(4) NOT NULL DEFAULT 0 COMMENT '登录次数',
PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic;
-- ----------------------------
-- Records of employee_tbl
-- ----------------------------
INSERT INTO `employee_tbl` VALUES (1, '小明', '2016-04-22 15:25:33', 8);
INSERT INTO `employee_tbl` VALUES (2, '小王', '2016-04-20 15:25:47', 3);
INSERT INTO `employee_tbl` VALUES (3, '小丽', '2016-04-19 15:26:02', 2);
INSERT INTO `employee_tbl` VALUES (4, '小王', '2016-04-07 15:26:14', 4);
INSERT INTO `employee_tbl` VALUES (5, '小明', '2016-04-11 15:26:40', 4);
INSERT INTO `employee_tbl` VALUES (6, '小明', '2016-04-04 15:26:54', 2);
SET FOREIGN_KEY_CHECKS = 1;
示图如下:
2.新建Dubbo公共接口工程
新建普通maven工程
,如下图:
pom.xml文件主要内容:
<?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.yyj</groupId>
<artifactId>dubbo-api</artifactId>
<version>2020-05-23</version>
<packaging>jar</packaging>
<dependencies>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.12</version>
</dependency>
</dependencies>
</project>
EmployeeApi.java
public interface EmployeeApi {
/** 获取employee_tbl表的所有数据 */
List<Employee> getAll();
/**
* 根据id查询employee_tbl表中对应的数据.
* @param id
*/
Employee getById(int id);
}
此接口是Dubbo提供者和消费者公共的接口,提供者会暴露此接口提供服务
Employee.java
/** employee_tbl表实体对象,利用lombok生成了该对象的无/全参、get()、set()等方法 */
@Data
@AllArgsConstructor
@NoArgsConstructor
public class Employee implements Serializable {
private int id;
private String name;
private Date date;
private int singin;
}
注意此对象必须实现序列化接口,否则服务提供者处理的结果经过网络传输给消费者时,消费者展示时会报java.lang.IllegalStateException: Serialized class xx.xx.xx must implement java.io.Serializable异常。
3.新建Dubbo服务提供者工程
新建springboot工程,如下图结构:
pom.xml
<?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.7.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.yyj</groupId>
<artifactId>dubbo-provider-service</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>dubbo-provider-service</name>
<description>Demo project for Spring Boot</description>
<properties>
<java.version>1.8</java.version>
</properties>
<dependencies>
<!-- springboot 整合dubbo依赖 -->
<dependency>
<groupId>org.apache.dubbo</groupId>
<artifactId>dubbo-spring-boot-starter</artifactId>
<version>2.7.6</version>
</dependency>
<dependency>
<groupId>org.apache.curator</groupId>
<artifactId>curator-recipes</artifactId>
<version>4.2.0</version>
</dependency>
<!-- springboot整合mybatis依赖 -->
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>2.1.2</version>
</dependency>
<!-- mysql驱动;高版本的包已经改成com.mysql.cj.jdbc,使用时请注意版本 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
</dependency>
<!-- dubbo消费者、提供者工共接口以及pojo依赖 -->
<dependency>
<groupId>com.yyj</groupId>
<artifactId>dubbo-api</artifactId>
<version>2020-05-23</version>
</dependency>
<!-- 此依赖方便telnet测试dubbo暴露的接口用,不测试暴露的接口的话,可以不添加此依赖 -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.68</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>
EmployeeMapper接口
@Mapper
public interface EmployeeMapper {
/** 获取employee_tbl表的所有数据 */
@Select("select * from employee_tbl")
List<Employee> selectAll();
/**
* 根据id查询employee_tbl表中对应的数据.
* @param id 主键id
*/
@Select("select id, name, date, singin from employee_tbl where id = #{id} ")
Employee selectById(@Param("id") int id);
}
持久层的操作,springboot整合mybatis实现;也可以利用其他ORM框架实现。
EmployeeServiceImpl.java
/** 注意@Service 导包 import org.apache.dubbo.config.annotation.Service */
@Service
public class EmployeeServiceImpl implements EmployeeApi {
@Autowired
private EmployeeMapper employeeMapper;
@Override
public List<Employee> getAll() {
return employeeMapper.selectAll();
}
@Override
public Employee getById(int id) {
return employeeMapper.selectById(id);
}
}
业务逻辑层,实现了服务消费者、提供者公共的接口,注意@Service注解来自包org.apache.dubbo.config.annotation;
EmployeeServiceImpl类的@Service注解来自dubbo,不要和Spring的弄错,导包如下:
import org.apache.dubbo.config.annotation.Service;
启动类
@SpringBootApplication
@MapperScan("com.yyj.mapper")
/** 扫描Dubbo框架的@Service */
@EnableDubbo
public class DubboProviderServiceApplication {
public static void main(String[] args) {
SpringApplication.run(DubboProviderServiceApplication.class, args);
}
}
application.yml
dubbo:
application:
name: dubbo-provider-service
registry:
address: 192.168.7.100:2181
check: false
protocol: zookeeper
protocol:
name: dubbo
port: 28888
monitor:
protocol: register
consumer:
check: false
timeout: 2000
spring:
datasource:
url: jdbc:mysql://127.0.0.1:3306/test?serverTimezone=UTC
driver-class-name: com.mysql.cj.jdbc.Driver
username: 账户
password: 密码
server:
port: 8090
启动服务提供者工程
telnet测试调用提供者暴露的接口
CMD下执行
telnet 127.0.0.1 28888
28888端口为本地配置的dubbo协议端口,输入命令后按2下回车出现如下图:
查看服务列表:
ls -l
结果如下:
dubbo>ls -l
PROVIDER:
com.demo.api.EmployeeApi -> published: Y
显示服务的方法详细信息列表:
ls -l 服务完整全称
如下:
dubbo>ls -l
PROVIDER:
com.demo.api.EmployeeApi -> published: Y
dubbo>ls -l com.demo.api.EmployeeApi
com.demo.api.EmployeeApi (as provider):
java.util.List getAll()
com.demo.pojo.Employee getById(int)
dubbo>
调用服务查询
invoke 服务完整全称.方法
# 示例:invoke com.demo.api.EmployeeApi.getAll()
如下:
dubbo>invoke com.demo.api.EmployeeApi.getAll()
Use default service com.demo.api.EmployeeApi.
result: [{"date":1461338733000,"id":1,"name":"灏忔槑","singin":8},{"date":1461165947000,"id":2,"name":"灏忕帇","singin":3},{"date":1461079562000,"id":3,"name":"灏忎附","singin":2},{"date":1460042774000,"id":4,"name":"灏忕帇","singin":4},{"date":1460388400000,"id":5,"name":"灏忔槑","singin":4},{"date":1459783614000,"id":6,"name":"灏忔槑","singin":2}]
elapsed: 167 ms.
dubbo>invoke com.demo.api.EmployeeApi.getById(1)
Use default service com.demo.api.EmployeeApi.
result: {"date":1461338733000,"id":1,"name":"灏忔槑","singin":8}
elapsed: 3 ms.
dubbo>
说明服务提供者的服务能正常被调用
4.新建Dubbo服务消费者工程
pom.xml
<?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.7.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.yyj</groupId>
<artifactId>dubbo-condumer-web</artifactId>
<version>2020-05-23</version>
<name>dubbo-condumer-web</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>
<!-- springboot 整合dubbo依赖 -->
<dependency>
<groupId>org.apache.dubbo</groupId>
<artifactId>dubbo-spring-boot-starter</artifactId>
<version>2.7.6</version>
</dependency>
<dependency>
<groupId>org.apache.curator</groupId>
<artifactId>curator-recipes</artifactId>
<version>4.2.0</version>
</dependency>
<!-- dubbo消费者、提供者工共接口以及pojo依赖 -->
<dependency>
<groupId>com.yyj</groupId>
<artifactId>dubbo-api</artifactId>
<version>2020-05-23</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>
EmployeeServiceImpl.java
import com.demo.api.EmployeeApi;
import com.demo.pojo.Employee;
import org.apache.dubbo.config.annotation.Reference;
import org.springframework.stereotype.Service;
import java.util.List;
@Service
public class EmployeeServiceImpl implements EmployeeApi {
/** 依赖远程的employeeApi,即提供者暴露的EmployeeApi接口 */
@Reference
private EmployeeApi employeeApi;
@Override
public List<Employee> getAll() {
return employeeApi.getAll();
}
@Override
public Employee getById(int id) {
return employeeApi.getById(id);
}
}
EmployeeController.java
@Controller
public class EmployeeController {
@Autowired
private EmployeeApi employeeApi;
/** 查询所有 */
@GetMapping(value = "/getAll")
@ResponseBody
public List<Employee> getAll(){
return employeeApi.getAll();
}
/** 根据id查询 */
@GetMapping(value = "/getById/{id}")
@ResponseBody
public Employee getById(@PathVariable("id") int id){
return employeeApi.getById(id);
}
}
启动类
@SpringBootApplication
@EnableDubbo
public class DubboCondumerWebApplication {
public static void main(String[] args) {
SpringApplication.run(DubboCondumerWebApplication.class, args);
}
}
application.yml
dubbo:
application:
name: dubbo-consumer-web
registry:
address: 192.168.7.100:2181
protocol: zookeeper
check: false
monitor:
protocol: register
consumer:
check: false
timeout: 2000
server:
port: 8080
5.测试
浏览器访问:http://127.0.0.1:8080/getAll 查询所有
浏览器访问:http://127.0.0.1/getById/1 查询id=1的实体