分析型数据库Apache-Doris实战03-Spring微服务中应用

分析型数据库Apache-Doris实战03-Spring微服务中应用

Posted by 十渊 on 2025-07-08

分析型数据库Apache-Doris实战03-Spring微服务中应用

对于Spring Cloud应用和MyBatis-Plus来说,连接Doris集群就像连接一个普通的MySQL数据库一样简单。 不需要任何特殊的依赖或配置。

1. Spring Cloud 配置 (application.yml)

在的Spring Boot/Spring Cloud项目的 application.yml (或 .properties) 文件中,只需要配置一个标准的数据源(Datasource)即可。

关键点: 需要配置FE(Frontend)节点的地址,因为FE是整个集群的统一SQL入口。

场景A:连接单个FE节点 (简单,但不高可用)

这是最简单的配置,适用于开发测试环境。只需要指向当前搭建的那个FE节点即可。

1
2
3
4
5
6
7
8
9
10
spring:
datasource:
# 使用标准的MySQL JDBC驱动
driver-class-name: com.mysql.cj.jdbc.Driver
# JDBC URL指向的FE节点的IP和SQL端口(9030)
# 只需要填一个FE的地址
url: jdbc:mysql://172.22.0.10:9030/your_database_name?useUnicode=true&characterEncoding=UTF-8
# 使用创建的Doris用户和密码
username: root
password: "" # 或者为root设置的密码,或创建的其他用户的密码
  • 172.22.0.10:9030: 这是FE节点的IP和对外暴露的MySQL协议端口。
  • your_database_name: 需要在Doris中创建的数据库名,比如 test_db
  • username/password: 用于连接Doris的用户凭证。

场景B:配置FE集群实现高可用 (生产环境推荐)

Doris的JDBC驱动程序(本质上就是MySQL的JDBC驱动)原生支持故障转移 (Failover)。可以把所有FE节点(Master, Follower, Observer都可以)的地址都写在JDBC URL里,当一个FE挂掉时,驱动会自动尝试连接下一个。

假设部署了一个高可用的FE集群:

  • FE1 (Master/Follower): 172.22.0.10:9030
  • FE2 (Follower): 172.22.0.11:9030
  • FE3 (Observer): 172.22.0.12:9030

application.yml 配置应该这样写:

1
2
3
4
5
6
7
8
9
spring:
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver
# 在URL中列出所有FE节点,用逗号分隔
# roundRobinLoadBalance=true 表示驱动会轮询尝试连接,实现负载均衡
# a.b.c.d, e.f.g.h 是fe的ip
url: jdbc:mysql://a.b.c.d:9030,e.f.g.h:9030/your_database_name?useUnicode=true&characterEncoding=UTF-8&roundRobinLoadBalance=true
username: admin
password: your_password

这种配置的好处:

  • 高可用: 如果 172.22.0.10 这个FE节点宕机了,的Spring应用不会报错,JDBC驱动会自动切换到 172.22.0.11172.22.0.12,服务不中断。
  • 负载均衡: roundRobinLoadBalance=true 参数会让应用在创建新连接时,轮流地连接到不同的FE节点,将查询解析的压力均匀地分摊到整个FE集群。

2. MyBatis-Plus 的使用

MyBatis-Plus可以100%无缝地与Doris一起工作。

因为Doris兼容MySQL协议和大部分MySQL的SQL语法,所以对于MyBatis-Plus来说,它根本“不知道”自己连接的是Doris还是MySQL。可以像往常一样使用MyBatis-Plus的所有功能:

a. 添加依赖

在的 pom.xml 中,确保有这两个依赖:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
<!-- MyBatis-Plus Starter -->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.5.3.1</version> <!-- 请使用项目匹配的版本 -->
</dependency>

<!-- MySQL Connector/J 驱动 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.28</version> <!-- 建议使用较新版本 -->
<scope>runtime</scope>
</dependency>

b. 定义实体类 (Entity)

和操作MySQL完全一样,使用 @TableName, @TableId, @TableField 等注解。

1
2
3
4
5
6
7
8
9
10
11
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;

@Data
@TableName("user_profile") // 对应Doris中的表名
public class UserProfile {
private Long userId;
private String userName;
private String email;
// ... 其他字段
}

c. 定义Mapper接口

继承 BaseMapper 即可拥有所有CRUD能力。

1
2
3
4
5
6
7
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import org.apache.ibatis.annotations.Mapper;

@Mapper
public interface UserProfileMapper extends BaseMapper<UserProfile> {
// 也可以写自定义的XML或注解SQL
}

d. 在Service中调用

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
@Service
public class UserProfileService {

@Autowired
private UserProfileMapper userProfileMapper;

public void testDoris() {
// 插入数据
UserProfile user = new UserProfile();
user.setUserId(1L);
user.setUserName("DorisFan");
userProfileMapper.insert(user);

// 根据ID查询
UserProfile foundUser = userProfileMapper.selectById(1L);
System.out.println(foundUser);

// 使用Wrapper进行条件查询
QueryWrapper<UserProfile> wrapper = new QueryWrapper<>();
wrapper.like("user_name", "Doris");
List<UserProfile> userList = userProfileMapper.selectList(wrapper);
System.out.println(userList);
}
}

总结

将Doris集成到Spring Cloud + MyBatis-Plus项目中,只需要做两件事:

  1. application.yml 中配置一个指向FE节点的、标准的MySQL数据源。为了生产环境的健壮性,推荐在JDBC URL中列出所有FE节点以实现高可用。
  2. 像操作MySQL一样,正常使用MyBatis-Plus的所有功能,不需要做任何代码层面的改动

这就是Doris对应用开发者如此友好的原因——它提供了强大的分布式能力,却没有增加上层应用开发的复杂性。

引用资料