阿里云首页 金融分布式架构 SOFAStack

配置连接器

本文介绍如何在现有的应用工程中配置数据访问代理连接器。

操作步骤

注意:下列各步骤中的配置仅供参考,您需要根据实际情况进行必要的修改。

1、在工程根目录的 pom.xml 文件中,根据需要添加以下 Maven 依赖:

<dependency>
      <groupId>com.alipay.sofa</groupId>
      <artifactId>dbp-connector-java</artifactId>
      <version>1.0.9</version>
</dependency>

2、在 Spring 配置文件中,增加连接器配置和数据源连接池 bean,如下所示:

<!-- 增加连接器配置 –->
 <bean id="simpleDataSourceConnector" class="com.alipay.sofa.dbp.DbpDataSource" init-method="init">
    <property name="delegate" ref="simpleDataSource"/>
    <property name="dbpInstanceId" value="${yourODPInstanceId}"/>
    <property name="appName" value="${yourAppName}"/>
    <property name="database" value="${yourDatabaseName}"/>
 </bean>
 <!-- 连接器配置结束 –->
 <!-- 数据源连接池配置 -->
<bean id="simpleDataSource" class="com.alibaba.druid.pool.DruidDataSource" init-method="init">
<property name="driverClassName" value="com.mysql.jdbc.Driver"/>
<!-- ODP实例地址,形如sofaodpojiss8o73o5la.sofaodp.aliyuncs.com      -->
<property name="url" value="jdbc:mysql://${yourODPConnectionURL}:8306/${yourDatabaseName}"/>
<property name="username" value="${user}"/>
<property name="password" value="${password}"/>
</bean>
<!-- 数据源连接池配置结束 –->

密码解密

数据库密码是比较敏感的信息,在配置文件中推荐使用加密后的密文提高安全性;dbp-connector 中提供了 SecuritySpec 接口实现密码的加解密的功能,您需要实现这个接口自定义加解密的算法。

<!-- 增加连接器配置 –->
 <bean id="simpleDataSourceConnector" class="com.alipay.sofa.dbp.DbpDataSource" init-method="init">
    <property name="delegate" ref="simpleDataSource"/>
    <property name="dbpInstanceId" value="${yourODPInstanceId}"/>
    <property name="appName" value="${yourAppName}"/>
    <property name="database" value="${yourDatabaseName}"/>
    <!-- 增加密码解密配置 –->
    <property name="securitySpec" ref="securitySpecImpl"/>
 </bean>
 <!-- 连接器配置结束 –->
 <!-- 数据源连接池配置 -->
<bean id="simpleDataSource" class="com.alibaba.druid.pool.DruidDataSource" init-method="init">
      <property name="driverClassName" value="com.mysql.jdbc.Driver"/>
      <property name="url" value="jdbc:mysql://${yourODPConnectionURL}:8306/${yourDatabaseName}"/>
      <property name="username" value="${user}"/>
      <property name="password" value="${password}"/>
</bean>
<!-- 数据源连接池配置结束 –->

 <!-- 自定义密码解密实现,实现接口 com.alipay.sofa.extds.SecuritySpec-->
<bean id="securitySpecImpl" class="x.x.x.SecuritySpecImpl"/>
<!-- 密码解密结束-->

支持 SQL 链路追踪

dbp-connector 支持 SQL 链路追踪功能,dbp-connector 会将 traceId 通过 MySQL 的自定义 HINT 语法传给 dbpserver,从而打通应用到 dbpserver 的链路,方便通过链路追踪应用快速定位 SQL 执行耗时。

HINT语法格式如下:

/*+DBP: $SYS={TRACE(0a0fe91c1514974353459100919649#0.1)}*/select * from test

HINT语法格式说明:

/*+DBP: $SYS={TRACE(TraceId#RpcId)}*/select * from test

dbp-connector 会将 SQL 执行信息包括 trace 信息打印在本地日志 sql-digest.log 中。默认情况下,执行时间小于 3ms 且执行成功的 SQL 按照 10/1 的比例抽样打印;执行失败和执行时间大于 3ms 的 SQL 全量打印。

日志格式如下:

2018-06-2023:42:10.280,testApp,0a4192811529509329989100469009,0.1,testDbpInstanceId,dbpclient_db,select*from mars,success,289ms,274ms,15ms,DBP,11.239.141.253:8306,main

日志格式说明:

日志打印时间,AppName,TraceId,RpcId,DBP,dbp实例id,schema,SQL,执行结果(success/failed),执行耗时(ms),链接建立时间,数据库执行时间,DBP,dbp实例Ip,当前线程名
<!-- 增加连接器配置 –->
 <bean id="simpleDataSourceConnector" class="com.alipay.sofa.dbp.DbpDataSource" init-method="init">
    <property name="delegate" ref="simpleDataSource"/>
    <property name="dbpInstanceId" value="${yourODPInstanceId}"/>
    <property name="appName" value="${yourAppName}"/>
    <property name="database" value="${yourDatabaseName}"/>
    <!-- 增加链路追踪配置 –->
    <property name="clientTracer" ref="clientTracer"/>
 </bean>
 <!-- 连接器配置结束 –->
 <!-- 数据源连接池配置 -->
<bean id="simpleDataSource" class="com.alibaba.druid.pool.DruidDataSource" init-method="init">
         <property name="driverClassName" value="com.mysql.jdbc.Driver"/>
         <property name="url" value="jdbc:mysql://${yourODPConnectionURL}:8306/${yourDatabaseName}"/>
         <property name="username" value="${user}"/>
         <property name="password" value="${password}"/>
</bean>
<!-- 数据源连接池配置结束 –->

 <bean id="clientTracer" class="com.alipay.sofa.dbp.DbpClientTracer">
       <!-- 设置客户端日志才样的阈值,默认3ms(3ms内成功的sql按10%采样),设置为0 全部打印 -->
       <property name="sampleThreshold" value="3"/>
</bean>

阿里云双机房配置

要求 dbp-connector 的版本号为 1.1.1 及以上。ODP 阿里云实例的域名格式为:阿里云 ODP 实例 ID(去掉中划线)+zone 按中划线分割的最后一部分.[public.]sofaodp.aliyuncs.com,如 sofaodpojiss8o73o5la.sofaodp.aliyuncs.com

<!-- 增加连接器配置 –->
 <bean id="simpleDataSourceConnector" class="com.alipay.sofa.dbp.DbpDataSource" init-method="init">
    <property name="delegate" ref="simpleDataSource"/>
    <property name="dbpInstanceId" value="${yourODPInstanceId}"/>
    <property name="appName" value="${yourAppName}"/>
    <property name="database" value="${yourDatabaseName}"/>
 </bean>
 <!-- 连接器配置结束 –->
 <!-- 数据源连接池配置 -->
<bean id="simpleDataSource" class="com.alibaba.druid.pool.DruidDataSource" init-method="init">
     <property name="driverClassName" value="com.mysql.jdbc.Driver"/>
     <!-- 形如jdbc:mysql://sofaodp-ojiss8o73o5l@zone@.[public.]sofaodp.aliyuncs.com:8306/testdb -->
     <property name="url" value="jdbc:mysql://${yourODPInstanceId}@zone@.sofaodp.aliyuncs.com:8306/${yourDatabaseName}"/>
     <property name="username" value="${user}"/>
     <property name="password" value="${password}"/>
</bean>
<!-- 数据源连接池配置结束 –->

专有云双机房配置

修改 Spring 配置文件如下:

<!-- vip寻址-->
<bean id="dbpDiscovery" class="com.alipay.sofa.dbp.discovery.DbpDiscovery"/>

<!-- dbp-connector代理-->
<bean id="delegatingDataSource" class="com.alipay.sofa.dbp.DbpDataSource" init-method="init">
      <property name="delegate" ref="simpleDataSource"/>
      <property name="appName" value="${yourAppName}"/>
      <property name="database" value="${yourDatabase}"/>
      <property name="dbpInstanceId" value="${yourDbpInstanceId}"/>
      <property name="clientTracer" ref="clientTracer"/>
</bean>

<!-- 连接池配置,以druid为例 -->
<bean id="simpleDataSource" class="com.alibaba.druid.pool.DruidDataSource" init-method="init">
     <property name="driverClassName" value="com.mysql.jdbc.Driver"/>
     <property name="url" value="jdbc:mysql://${yourDbpInstanceId}:8306/${yourDatabase}"/>
     <property name="username" value="${username}"/>
     <property name="password" value="${password}"/>
</bean>

<bean id="clientTracer" class="com.alipay.sofa.dbp.DbpClientTracer"/>