Sharding-Proxy简介
Sharding-Proxy是ShardingSphere的第二个产品,定位为透明化的数据库代理端,提供封装了数据库二进制协议的服务端版本,用于完成对异构语言的支持。 目前先提供MySQL版本,它可以使用任何兼容MySQL协议的访问客户端(如:MySQL Command Client, MySQL Workbench等操作数据,对DBA更加友好。
-
向应用程序完全透明,可直接当做MySQL使用
-
适用于任何兼容MySQL协议的客户端
Sharding-Proxy的优势在于对异构语言的支持,以及为DBA提供可操作入口。
Sharding-Proxy使用过程:
注意事项:Sharding-Proxy 需要在JDK8的环境下使用,我在配置过程中使用JDK11启动会报错
- 下载Sharding-Proxy的最新发行版;
下载地址:https://archive.apache.org/dist/shardingsphere/4.1.1/apache-shardingsphere-4.1.1-sharding-proxy-bin.tar.gz - 解压缩后修改conf/server.yaml和以config-前缀开头的文件,进行分片规则、读写分离规则配置
编辑%SHARDING_PROXY_HOME%\conf\config-sharding.yamlschemaName: sharding_db # dataSources: ds_0: url: jdbc:mysql://localhost:3306/sharding1?serverTimezone=UTC&useSSL=false username: root password: 123456 connectionTimeoutMilliseconds: 30000 idleTimeoutMilliseconds: 60000 maxLifetimeMilliseconds: 1800000 maxPoolSize: 50 ds_1: url: jdbc:mysql://localhost:3306/sharding2?serverTimezone=UTC&useSSL=false username: root password: 123456 connectionTimeoutMilliseconds: 30000 idleTimeoutMilliseconds: 60000 maxLifetimeMilliseconds: 1800000 maxPoolSize: 50 shardingRule: tables: position: actualDataNodes: ds_${0..1}.position databaseStrategy: inline: shardingColumn: id algorithmExpression: ds_${id % 2} keyGenerator: type: SNOWFLAKE column: id
编辑%SHARDING_PROXY_HOME%\conf\server.yaml
-
引入依赖jar
如果后端连接MySQL数据库,需要下载MySQL驱动, 解压缩后将mysql-connector-java-5.1.49.jar拷贝到${sharding-proxy}\lib目录。
如果后端连接PostgreSQL数据库,不需要引入额外依赖。 -
Linux操作系统请运行bin/start.sh,Windows操作系统请运行bin/start.bat启动Sharding-Proxy。
使用默认配置启动:${sharding-proxy}\bin\start.sh配置端口启动:${sharding-proxy}\bin\start.sh ${port}
-
使用客户端工具连接。如: mysql -h 127.0.0.1 -P 3307 -u root -p root
结合springboot使用
-
创建工程
基于之前使用的工程,新建一个子工程sharding-proxy-example
-
改破pom文件
<dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-jdbc</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-jpa</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> </dependency> </dependencies>
-
yaml配置文件
spring: datasource: url: jdbc:mysql://192.168.137.144:3307/sharding_db?useSSL=false&characterEncoding=UTF-8 password: root username: root driver-class-name: com.mysql.jdbc.Driver
-
实体类
@Entity @Table(name = "position") public class Position { @Id @Column(name = "id") @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; @Column(name = "name") private String name; @Column(name = "city") private String city; @Column(name = "salary") private Integer salary; public Long getId() { return id; } public void setId(Long id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getCity() { return city; } public void setCity(String city) { this.city = city; } public Integer getSalary() { return salary; } public void setSalary(Integer salary) { this.salary = salary; } }
-
repository资源类
public interface PositionRepository extends JpaRepository<Position, Long> { }
-
启动类
@SpringBootApplication() public class RunBoot { }
-
测试类
import com.elvis.pojo.Position; import com.elvis.repository.PositionRepository; import org.junit.jupiter.api.Test; import org.springframework.boot.test.context.SpringBootTest; import javax.annotation.Resource; import java.util.List; /** * @program: shardingsphere-study * @Description * @author Elvis * @date 2021-07-28 7:31 */ @SpringBootTest public class TestProxy { @Resource private PositionRepository positionRepository; @Test public void test1() { List<Position> list = positionRepository.findAll(); list.forEach(position -> { System.out.println(position.getId() + " " + position.getName() + " " + position.getSalary()); }); } @Test public void test2() { Position position = new Position(); position.setName("tiger"); position.setSalary(30000); position.setCity("shanghai"); positionRepository.save(position); } }