跟我学ShardingSphere之ShardingProxy

本文介绍了ShardingProxy作为数据库代理的原理、配置与使用示例,探讨了ShardingSphere的两种应用方式:ShardingJDBC客户端共享与ShardingProxy独立部署。适合理解和对比在不同场景下的数据库分库分表解决方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

ShardingProxy

定位为透明化的数据库代理端,提供封装了数据库二进制协议的服务端版本,用于完成对异构语言的支持

前面我们学习了ShardingJDBC的分库分表用法,Sharding-JDBC的定位是客户端的一个jar包,集成到客户端去就可以进行数据库的连接和操作,而ShardingProxy的定位是一个数据库的代理端,所有访问数据库的操作都统一访问ShardingProxy,由ShardingProxy再根据分片算法操作对应的数据库和表,如下图

在这里插入图片描述

简单示例

1、先下载shardingProxy运行包

在这里插入图片描述

注意,这里下载的是tar.gz压缩包,这种格式的压缩文件需要在linux环境下进行解压,反正我在windows下使用WinRAR解压出现问题,可以正常解压,就是里面很多包有缺失,运行的时候会出问题,我是将压缩文件放到linux系统下解压后再拿回来的

2、修改配置文件

主要是修改server.yaml和config-×××.yaml文件

server.yaml

#权限配置
authentication:
  users:
    root:   # 自定义用户名
      password: root  # 自定义用户名密码
    sharding: # 自定义用户名
      password: sharding   # 自定义用户名
      authorizedSchemas: testdb    # 该用户授权可访问的数据库,多个用逗号分隔。缺省将拥有root权限,可访问全部数据库

props:
  max.connections.size.per.query: 1
  acceptor.size: 16  # 用于设置接收客户端请求的工作线程个数,默认为CPU核数*2
  executor.size: 16  # Infinite by default.
  proxy.frontend.flush.threshold: 128  # The default value is 128.
    # LOCAL: Proxy will run with LOCAL transaction.
    # XA: Proxy will run with XA transaction.
    # BASE: Proxy will run with B.A.S.E transaction.
  proxy.transaction.type: LOCAL   #默认为LOCAL事务,允许LOCAL,XA,BASE三个值,XA采用Atomikos作为事务管理器,BASE类型需要拷贝实现ShardingTransactionManager的接口的jar包至lib目录中
  proxy.opentracing.enabled: false #是否开启链路追踪功能,默认为不开启。详情请参见[链路追踪](/cn/features/orchestration/apm/)
  proxy.hint.enabled: false
  query.with.cipher.column: true   #是否使用密文列查询
  sql.show: true
  allow.range.query.with.inline.sharding: false

config-sharding.yaml

schemaName: testdb
dataSources:
  testdb0:
    url: jdbc:mysql://localhost:3306/testdb0?useUnicode=true&characterEncoding=utf-8
    username: root
    password: 123456
    connectionTimeoutMilliseconds: 30000
    idleTimeoutMilliseconds: 60000
    maxLifetimeMilliseconds: 1800000
    maxPoolSize: 50
  testdb1:
    url: jdbc:mysql://localhost:3306/testdb1?useUnicode=true&characterEncoding=utf-8
    username: root
    password: 123456
    connectionTimeoutMilliseconds: 30000
    idleTimeoutMilliseconds: 60000
    maxLifetimeMilliseconds: 1800000
    maxPoolSize: 50

shardingRule:
  tables:
    tb_user:
      actualDataNodes: testdb$->{0..1}.tb_user
      databaseStrategy:
        inline:
          shardingColumn: user_id
          algorithmExpression: testdb$->{user_id % 2}

另外,如果你配置的数据源是mysql,需要把mysql的驱动包放到lib目录下

3、运行项目

Windows下运行bin目录下的start.bat文件,linux下运行start.sh

在这里插入图片描述

如上图所示说明已经启动成功,在启动日志中可以看到配置的分片策略,默认启动3307端口,也可以自定义端口

4、功能测试

ShardingProxy相当于一个数据库的代理层,统一受理应用的数据库访问请求,应用方可以不用关心数据库的存储,ShardingProxy可以根据路由策略将不同的请求路由到不同的库和表上

我们在testdb0、testdb1两个库中分别创建tb_user表,路由规则如下:

shardingRule:
  tables:
    tb_user:
      actualDataNodes: testdb$->{0..1}.tb_user
      databaseStrategy:
        inline:
          shardingColumn: user_id
          algorithmExpression: testdb$->{user_id % 2}
          

根据路由规则,会将user_id的奇偶分别命中到testdb0、testdb1两个数据库上,下面我们来测试一下

CREATE TABLE `tb_user` (
  `user_id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '用户ID',
  `user_name` varchar(20) NOT NULL COMMENT '用户名称',
  `user_address` varchar(100) NOT NULL COMMENT '用户地址',
  `age` int(11) NOT NULL COMMENT '年龄',
  `create_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  `update_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
  PRIMARY KEY (`user_id`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8 COMMENT='用户信息表';

在testdb0和testdb1分别创建tb_user表

在这里插入图片描述

现在通过ShardingProxy暴露出来的3307端口连上去,如下图看到的数据库名称是testdb,只有一张表tb_user

在这里插入图片描述

现在我们插入两笔数据

insert into tb_user(user_id,user_name,user_address,age) values(1,'张三','武汉市',20);
insert into tb_user(user_id,user_name,user_address,age) values(2,'李四','上海市',18);

可以查看在testdb0和testdb1两个库的tb_user表中各插入了一笔数据,说明ShardingProxy是通过我们配置的路由规则进行操作的

该如何选择

ShardingSphere提供了两种分库分表的方式,Sharding-JDBC集成在客户端,通过与应用程序共享资源的方式来实现分库分表,而Sharding-Proxy提供了统一的访问入口,可以让客户端像访问正常的数据库连接一样来访问Sharding-Proxy,对客户端屏蔽了分库分表的路由规则,那么我们在实际工作中该如何选择呢?小孩子才做选择,成年人都要!!!

在这里插入图片描述

如上图的混合架构,将ShardingJDBC和ShardingProxy结合起来使用

ShardingJDBC 采用无中心化架构,与应用程序共享资源,适用于 Java 开发的高性能的轻量级 OLTP 应用;

ShardingProxy 提供静态入口以及异构语言的支持,独立于应用程序部署,适用于 OLAP 应用以及对分片数据库进行管理和运维的场景。

通过混合使用 ShardingJDBC 和 ShardingProxy,并采用同一注册中心统一配置分片策略,能够灵活的搭建适用于各种场景的应用系统,使得架构师更加自由地调整适合与当前业务的最佳系统架构

如果感觉对你有些帮忙,请收藏好,你的关注和点赞是对我最大的鼓励!
如果想跟我一起学习,坚信技术改变世界,请关注【Java天堂】公众号,我会定期分享自己的学习成果,第一时间推送给您

在这里插入图片描述

<think>好的,我需要回答用户关于使用ShardingSphere-Proxy时是否需要修改Spring Boot和MyBatis代码的问题。首先,我得回顾一下用户提供的引用内容。 根据引用[3],用户提到在整合ShardingSphere-Proxy时,只需要修改数据库连接配置,将库名改为Proxy生成的readwrite_splitting_db,其他配置保持不变。这明大部分代码不需要改动,只需要调整数据源指向Proxy的地址。引用[1]中的配置示例也显示,主要修改的是数据库的URL、用户名和密码,而MyBatis的mapper和config位置没有变化。这说明MyBatis本身的配置不需要调整,只需要数据源指向Proxy。 另外,引用[4]提到了分库策略的实现,但这是针对ShardingSphere-JDBC的情况,而用户现在问的是Proxy。ShardingSphere-Proxy作为一个独立的服务,处理分片和读写分离的逻辑,应用层只需要连接Proxy,不需要在代码中实现分片算法。因此,和ShardingSphere-JDBC不同,使用Proxy时不需要在Spring Boot或MyBatis中添加分片策略的代码。 需要确认的是,是否所有分片逻辑都由Proxy处理,应用层是否完全透明。根据ShardingSphere的文档,Proxy确实负责解析SQL并路由到正确的数据库,所以应用层代码无需感知分片细节。这意味着现有的MyBatis映射和Spring Boot业务逻辑可以保持不变。 总结下来,用户只需要修改数据源配置,指向Proxy的地址和认证信息,不需要修改业务代码或MyBatis的mapper文件。同时,需要注意Proxy的版本兼容性,确保驱动和配置参数正确。可能的例外是如果Proxy的版本与原有依赖冲突,可能需要调整依赖版本,但用户提供的引用[2]显示使用的是5.4.1版本,应保持依赖一致。 最后,生成相关问题时要围绕配置修改、Proxy与JDBC的区别、兼容性等方面,帮助用户进一步理解。</think>在使用ShardingSphere-Proxy时,**对SpringBoot和MyBatis的业务代码几乎无需修改**,主要调整集中在配置层面。以下是具体说明: --- ### 一、代码层 1. **业务逻辑代码无需改动** 原有的MyBatis接口(Mapper)、实体类、Service层代码**保持原样**,仅需保证SQL语句符合ShardingSphere-Proxy的语法规则即可[^3]。 2. **数据分片/读写分离逻辑转移至Proxy** 分库分表策略、读写分离规则等**不再通过SpringBoot代码实现**(如引用[4]中的分库算法代码),而是通过ShardingSphere-Proxy的YAML配置文件定义[^3]。 --- ### 二、配置层 需要修改**数据源配置**以指向ShardingSphere-Proxy服务: ```yaml spring: datasource: url: jdbc:mysql://[Proxy地址]:3307/[Proxy虚拟库名] # 例如readwrite_splitting_db[^3] username: [Proxy配置的用户名] password: [Proxy配置的密码] driver-class-name: com.mysql.cj.jdbc.Driver ``` - **关键变化**:URL中的数据库名需改为Proxy定义的虚拟逻辑库(如`sharding_db`或`readwrite_splitting_db`)[^1][^3] - **MyBatis配置保留**:XML映射文件路径、别名包等原有配置无需修改[^1] --- ### 三、注意事项 1. **SQL兼容性** Proxy支持标准SQL语法,但需避免使用数据库方言特性(如MySQL的`ON DUPLICATE KEY UPDATE`)[^3]。 2. **依赖版本对齐** 需确保ShardingSphere-Proxy服务端与客户端的JDBC驱动版本兼容(推荐使用5.x版本)[^2]。 3. **性能监控** 可添加`spring-boot-starter-actuator`监控Proxy连接池状态[^3]。 --- ### 配置对比格 | 组件 | ShardingSphere-JDBC方案 | ShardingSphere-Proxy方案 | |----------------------|----------------------------------|----------------------------------| | 分片逻辑实现位置 | 应用层代码 + SpringBoot配置[^4] | Proxy服务端配置文件 | | 数据源配置复杂度 | 需定义多个数据源[^1] | 单一逻辑数据源指向Proxy[^3] | | 代码侵入性 | 需编写分片算法类[^4] | 完全零侵入 | ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值