本次最佳实践的内容主要包含在微服务应用中使用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,供使用该产品的客户参考。

代码编写

本节介绍如何连接并使用数据库的代码和返回请求的内容。

  1. 代码库连接数据库MySQL。
    1. 在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>
    2. 连接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
  2. 代码实现对数据库新增查询操作。
    1. 编写对MySQL数据库新增、查询操作的接口定义。
      public interface EchoDao{
          public List<Account> findAll();
          public Account findById(int id);
          public int addAccount(Account account);
    2. 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());
          }
       
      }
  3. 返回Web请求的内容。
    1. 暴露浏览器查询数据列表值的请求地址。
      @RequestMapping(value = "/echo-list", method = RequestMethod.GET)
      public List<Account> echoDB() {
      return echoDao.findAll();
      }
    2. 暴露对数据库插入数据操作的请求地址。
      @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;
      }

MySQL数据库运用

本节详细描述专有云企业版V3.9.0云数据库MySQL使用。

  1. 创建实例。
    1. 登录Apsara Stack控制台。
    2. 页面顶部的导航栏中,单击产品,选择云数据库RDS
    3. 云数据库管理页面中,单击右上角的创建实例
      云数据库管理
    4. 设置如下参数。
      类别 名称 描述
      基本配置 部门 实例所属部门。
      项目 实例所属项目。
      区域 实例所属区域。不同区域之间的产品内网不互通,创建实例后不支持更换区域。
      可用区 实例的可用区。RDS常规实例采用双机热备架构,单可用区指主备节点位于同一可用区。
      规格配置 实例名称 RDS实例的名称。以中文、英文字母开头。可以包含中文、英文字符、”_”,” -”,数字。长度为2~64个字符。
      数据库类型 选择MySQL
      数据库版本 数据库的版本。
      CPU/内存 实例的规格,分为以下几种:
      • 独享型:规格后带有“独享型”字样。
      • 独占物理机:规格后带有“独占物理机”字样。
      • 金融版单机房:规格后带有“金融版单机房”字样。
      不同的内存大小对应不同的最大连接数和IOPS,具体请以控制台页面为准。
      存储空间 实例的存储空间,包括数据空间、临时备份和临时归档空间等。
      网络类型 实例类型 实例的类型。根据业务场景选择对内或对外服务的实例,外网实例只支持经典网络。
      网络类型 RDS实例支持的网络类型:
      • 经典网络:经典网络中的云服务在网络上不进行隔离,只能依靠云服务自身的安全组或白名单策略来阻挡非法访问。
      • 专有网络:(Virtual Private Cloud,简称VPC)专有网络帮助用户在阿里云上构建出一个隔离的网络环境。用户可以自定义专有网络里面的路由表、IP地址范围和网关。建议您选择专有网络,更加安全。
      您可以事先创建专有网络,也可以在创建实例后切换网络类型时修改专有网络。
      访问模式 访问模式 RDS支持标准访问模式和高安全访问模式两种访问模式。
      • 标准访问模式:RDS使用负载均衡屏蔽了数据库引擎HA切换对应用层的影响,缩短响应时间,但会小幅度增加连接闪断的概率,失去SQL拦截能力。
      • 高安全访问模式:具有防止90%的连接闪断和SQL拦截的能力(基于SQL语义分析来实现防御SQL注入攻击),但是会增加20%以上响应时间。
      数量 申请台数 可批量创建的RDS实例数量,最多为20台。
      创建实例
    5. 完成上述参数配置后,单击提交
      创建完成
  2. 新建账号并授权。
    1. 在云数据库RDS页面,单击目标实例的ID。
      基本信息
    2. 在基本信息页面左侧导航栏中,选择数据库管理 > 账号列表
    3. 账号列表页面,单击添加账号,根据打开的新建账号页面提示进行参数设置。各项参数配置说明如下表所示。
      名称 描述
      数据库账号 账号命名要求如下:
      • 以小写字母开头,小写字母或者数字结尾。
      • 由小写字母、数字或者下划线组成。
      • 长度为2~16位。
      • 保留关键字不能使用,具体请参见官网版本详细文档。
      账号类型 账号的类型,有以下两种:
      • 普通账号,此处选择该选项。
      • 超级账号。
      请输入密码 该账号对应的密码,要求如下:
      • 以数字或字母开头。
      • 由数字、字母或者下划线组成。
      • 长度为6~32位。
      请再次输入密码 输入与密码一致的字段,要求如下:
      • 以数字或字母开头。
      • 由数字、字母或者下划线组成。
      • 长度为6~32位。
      备注 账号的备注信息,要求如下:
      • 以中文、字母或者数字开头。
      • 由中文、字母、数字、下划线或者中划线组成。
      • 长度为2~256个字符。
      填写信息
    4. 完成上述参数配置后,单击确定
    5. 基本信息页面左侧导航栏中,选择数据库管理 > 数据库列表
    6. 数据库列表页面,单击添加数据库,在新建数据库页面中进行参数设置。各项参数配置说明如下表所示。
      名称 描述
      数据库(DB)名称 数据库名,命名要求如下:
      • 以小写字母开头,小写字母或者数字结尾。
      • 由小写字母、数字、下划线或者中划线组成。
      • 长度为2~64个字符。
      • 保留关键字不能使用,具体请参见官网版本详细文档。
      支持字符集 数据库支持的字符集类型,包括以下几种字符集:
      • utf-8
      • gbk
      • latin1
      • utf8mb4
      账号授权
      • 将可授权账号移动到右边进行只读或读写授权。
      • 只能将数据库授权给普通账号。
      • 高权限账号默认已授权。
      备注说明 备注该数据库的相关信息,便于后续数据库管理,要求如下:
      • 以小写字母或中文开头。
      • 由小写字母、中文、数字、下划线或者中划线组成。
      • 长度为2~256位。
      数据库信息

执行结果

RDS通过数据传输服务(DTS)实现主实例和异地灾备实例之间的实时同步。

主实例和灾备实例均搭建主备高可用架构,当主实例所在区域发生突发性自然灾害等状况,主实例(Master)和备实例(Slave)均无法连接时,可将异地灾备实例切换为主实例,在应用端修改数据库连接地址后,即可快速恢复应用的业务访问。灾备实例设计如下:

灾备实例设计图
灾备实例具有以下特点:
  • 提供独立的数据库连接地址,由用户应用端自助控制连接。
  • 使用主备高可用架构。
  • 支持按小时计费,即开即用、即停即止。
  • 提供独立的白名单配置、账号管理。