本次最佳实践的内容主要包含在微服务应用中使用MySQL数据库、把数据持久化到数据库和从数据库中读取数据。
前提条件
本实践中所涉及到程序的应用环境:
- EDAS基于专有云企业版V3.9.0版本。
- Spring Cloud框架基于Finchley.SR1版本。
- EDAS注册中心:Nacos为V1.1.3版本。
- 目标MySQL为V5.6.0版本。
背景信息
- 最佳实践概述:
本文将通过Java代码详细描述在专有云V3.9.0环境中RDS产品MySQL的开发过程,并讲解在专有云V3.9.0环境中,在云数据库中创建MySQL数据库账户、数据库、数据库表及授权等操作指导。
- 最佳实践价值:
MySQL是一种关系型数据库管理系统,关系数据库是将数据保存在不同的表中,而不是将所有数据集中存储,具有更快的速度和灵活性。而RDS MySQL版基于阿里巴巴的MySQL源码分支,经过双十一高并发、大数据量的考验,拥有优良的性能。RDS
MySQL版支持实例管理、账号管理、数据库管理、备份恢复、白名单、透明数据加密以及数据迁移等功能,因此可以减少数据库的搭建及运维工作,不必担心自己应用在高并发场景导致数据库崩溃不可用的隐患。同时可以使用RDS
MySQL版提供的功能,简化自己手工进行数据库备份和数据迁移时的繁琐操作。本次最佳实践指导实现Java代码简化操作云数据库RDS,供使用该产品的客户参考。
代码编写
本节介绍如何连接并使用数据库的代码和返回请求的内容。
- 代码库连接数据库MySQL。
- 在pom.xml文件的导入依赖包。
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>
<dependency>
<groupId>MySQL</groupId>
<artifactId>MySQL-connector-java</artifactId>
<scope>runtime</scope>
</dependency>
- 连接MySQL数据库的信息配置。
spring.datasource.url=jdbc:MySQL://rm-vk448p8x0r4k7p040.MySQL.rds.ops.poc2.com:3306/account_01
spring.datasource.driverClassName=com.MySQL.jdbc.Driver
spring.datasource.username=clouddb_01
spring.datasource.password=pdsa_poc
- 代码实现对数据库新增查询操作。
- 编写对MySQL数据库新增、查询操作的接口定义。
public interface EchoDao{
public List<Account> findAll();
public Account findById(int id);
public int addAccount(Account account);
- MySQL数据库新增、查询操作接口的实现类及查询数据库的sql语句。
@Component
@Qualifier("echoDao")
public class EchoDaoImpl implements EchoDao {
@Autowired
JdbcTemplate jdbcTemplate;
@Override
public List<Account> findAll() {
RowMapper<Account> rowMapper = new BeanPropertyRowMapper<Account>(Account.class);
return jdbcTemplate.query("select id, user_name, user_age from account", rowMapper);
}
@Override
public Account findById(int id) {
RowMapper<Account> rowMapper = new BeanPropertyRowMapper<Account>(Account.class);
return jdbcTemplate.queryForObject("select id, user_name, user_age from account where id = ?", rowMapper, id);
}
@Override
public int addAccount(Account account) {
return jdbcTemplate.update("INSERT INTO `account`(`user_name`,`user_age`) VALUES(?,?)", account.getUserName(),
account.getUserAge());
}
}
- 返回Web请求的内容。
- 暴露浏览器查询数据列表值的请求地址。
@RequestMapping(value = "/echo-list", method = RequestMethod.GET)
public List<Account> echoDB() {
return echoDao.findAll();
}
- 暴露对数据库插入数据操作的请求地址。
@RequestMapping(value = "/echo-db", method = RequestMethod.GET)
public String echoDB(@RequestParam("str") String str) {
//写数据库
Account account = new Account();
account.setUserName(str);
account.setUserAge(++i);
int n;
if ("tom".equals(str)) {
n = echoDao.addAccountException(account);
} else {
n = echoDao.addAccount(account);
}
String msg;
if (n > 0) {
msg = "插入" + n + "条数据成功!";
} else {
msg = "插入失败!";
}
return msg;
}
执行结果
RDS通过数据传输服务(DTS)实现主实例和异地灾备实例之间的实时同步。
主实例和灾备实例均搭建主备高可用架构,当主实例所在区域发生突发性自然灾害等状况,主实例(Master)和备实例(Slave)均无法连接时,可将异地灾备实例切换为主实例,在应用端修改数据库连接地址后,即可快速恢复应用的业务访问。灾备实例设计如下:
灾备实例具有以下特点:
- 提供独立的数据库连接地址,由用户应用端自助控制连接。
- 使用主备高可用架构。
- 支持按小时计费,即开即用、即停即止。
- 提供独立的白名单配置、账号管理。