spring-boot集成Apache ShardingSphere 5.0.0 初识

spring-boot集成Apache ShardingSphere 5.0.0 初识

一、前言

官方文档

Apache ShardingSphere 是一套开源的分布式数据库解决方案组成的生态圈,它由 JDBC、Proxy 和 Sidecar(规划中)这 3 款既能够独立部署,又支持混合部署配合使用的产品组成。 它们均提供标准化的数据水平扩展、分布式事务和分布式治理等功能,可适用于如 Java 同构、异构语言、云原生等各种多样化的应用场景。


Apache ShardingSphere 旨在充分合理地在分布式的场景下利用关系型数据库的计算和存储能力,而并非实现一个全新的关系型数据库。 关系型数据库当今依然占有巨大市场份额,是企业核心系统的基石,未来也难于撼动,我们更加注重在原有基础上提供增量,而非颠覆。


Apache ShardingSphere 5.x 版本开始致力于可插拔架构,项目的功能组件能够灵活的以可插拔的方式进行扩展。 目前,数据分片、读写分离、数据加密、影子库压测等功能,以及 MySQL、PostgreSQL、SQLServer、Oracle 等 SQL 与协议的支持,均通过插件的方式织入项目。 开发者能够像使用积木一样定制属于自己的独特系统。Apache ShardingSphere 目前已提供数十个 SPI 作为系统的扩展点,仍在不断增加中。


ShardingSphere 已于2020年4月16日成为 Apache 软件基金会的顶级项目。

二、与spring-boot集成实现(分库、分表)

1.建表语句

CREATE TABLE `t_order0` (
                            `order_id` varchar(36) COLLATE utf8_bin NOT NULL,
                            `user_id` varchar(36) COLLATE utf8_bin NOT NULL,
                            `order_name` varchar(100) COLLATE utf8_bin NOT NULL,
                            PRIMARY KEY (`order_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin;

CREATE TABLE `t_order1` (
                            `order_id` varchar(36) COLLATE utf8_bin NOT NULL,
                            `user_id` varchar(36) COLLATE utf8_bin NOT NULL,
                            `order_name` varchar(100) COLLATE utf8_bin NOT NULL,
                            PRIMARY KEY (`order_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin;

CREATE TABLE `t_order2` (
                            `order_id` varchar(36) COLLATE utf8_bin NOT NULL,
                            `user_id` varchar(36) COLLATE utf8_bin NOT NULL,
                            `order_name` varchar(100) COLLATE utf8_bin NOT NULL,
                            PRIMARY KEY (`order_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin;

2.pom.xml

    <properties>
        <java.version>1.8</java.version>
        <mybatis-plus.version>3.4.1</mybatis-plus.version>
        <shardingsphere.version>5.0.0</shardingsphere.version>
    </properties>

        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-boot-starter</artifactId>
            <version>${mybatis-plus.version}</version>
        </dependency>
        <dependency>
            <groupId>org.apache.shardingsphere</groupId>
            <artifactId>shardingsphere-jdbc-core-spring-boot-starter</artifactId>
            <version>${shardingsphere.version}</version>
        </dependency>
  • 避坑指南

不建议直接引入druid-spring-boot-starter,避免由于数据源加载顺序导致的项目无法正常启动。
org.apache.shardingsphere.spring.boot.ShardingSphereAutoConfiguration
com.alibaba.druid.spring.boot.autoconfigure.DruidDataSourceAutoConfigure

3.application.yml

spring:
  shardingsphere:
    props:
      sql-show: true
    datasource:
      ds0:
        driver-class-name: com.mysql.cj.jdbc.Driver
        jdbc-url: jdbc:mysql://localhost:3306/ds0?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=GMT&allowPublicKeyRetrieval=true
        password: 123456
        type: com.zaxxer.hikari.HikariDataSource
        username: root
      ds1:
        driver-class-name: com.mysql.cj.jdbc.Driver
        jdbc-url: jdbc:mysql://localhost:3306/ds1?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=GMT&allowPublicKeyRetrieval=true
        password: 123456
        type: com.zaxxer.hikari.HikariDataSource
        username: root
      names: ds0,ds1
    rules:
      sharding:
        sharding-algorithms:
          custom-db-inline:
            props:
              algorithm-expression: ds$->{Math.abs(user_id.hashCode()%2)}
            type: INLINE
          custom-table-inline:
            props:
              algorithm-expression: t_order$->{Math.abs(order_id.hashCode()%3)}
            type: INLINE
        tables:
          t_order:
            actual-data-nodes: ds$->{0..1}.t_order$->{0..2}
            database-strategy:
              standard:
                sharding-algorithm-name: custom-db-inline
                sharding-column: user_id
            table-strategy:
              standard:
                sharding-algorithm-name: custom-table-inline
                sharding-column: order_id
mybatis-plus:
  global-config:
    db-config:
      id-type: assign_id
  • 避坑指南

sharding-algorithm-name禁止使用下划线_推荐使用短横线-),原因org.springframework.boot.context.properties.source.ConfigurationPropertyName#elementsOf(java.lang.CharSequence, boolean, int),你也别管什么 松散绑定 了,全用短横线-得了。


java.lang.Math.abs(int)当传参为Integer#MIN_VALUE,返回Integer#MIN_VALUE即负值。因此将t_order$->{Math.abs(order_id.hashCode())%3}改为t_order$->{Math.abs(order_id.hashCode()%3)}

4.CURD

  • OrderController.java
package com.example.demo.controller;

import com.example.demo.entity.Order;
import com.example.demo.service.OrderService;
import org.springframework.web.bind.annotation.*;

import javax.annotation.Resource;
import java.util.List;

/**
 * @author ouruyi
 */
@RestController
@RequestMapping("/order")
public class OrderController {

    @Resource
    private OrderService orderService;

    @GetMapping("/{id}")
    public Order getById(@PathVariable String id) {
        return this.orderService.getById(id);
    }

    @GetMapping("")
    public List<Order> list() {
        return this.orderService.list();
    }

    @GetMapping("/count")
    public Integer count() {
        return this.orderService.count();
    }

    @GetMapping("/mock")
    public String mock() {
        for (int i = 0; i < 12; i++) {
            final Order order = new Order();
            final String index = String.valueOf(i + 1);
            order.setUserId(index);
            order.setOrderName(index);
            this.orderService.save(order);
        }
        return "SUCCESS";
    }

}

  • OrderService.java
package com.example.demo.service;

import com.baomidou.mybatisplus.extension.service.IService;
import com.example.demo.entity.Order;

/**
 * (Order)表服务接口
 *
 * @author 
 * @since 2021-12-14 10:53:05
 */
public interface OrderService extends IService<Order> {

}


  • OrderServiceImpl.java
package com.example.demo.service.impl;

import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.example.demo.dao.OrderDao;
import com.example.demo.entity.Order;
import com.example.demo.service.OrderService;
import org.springframework.stereotype.Service;

/**
 * (Order)表服务实现类
 *
 * @author 
 * @since 2021-12-14 10:53:06
 */
@Service("orderService")
public class OrderServiceImpl extends ServiceImpl<OrderDao, Order> implements OrderService {

}


  • OrderDao.java
package com.example.demo.dao;

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.example.demo.entity.Order;

/**
 * (Order)表数据库访问层
 *
 * @author 
 * @since 2021-12-14 10:53:00
 */
public interface OrderDao extends BaseMapper<Order> {

}


  • Order.java
package com.example.demo.entity;

import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import com.baomidou.mybatisplus.extension.activerecord.Model;
import java.io.Serializable;

/**
 * (Order)表实体类
 *
 * @author 
 * @since 2021-12-14 10:53:04
 */
@SuppressWarnings("serial")
@TableName("t_order")
public class Order extends Model<Order> {

    @TableId
    private String orderId;
    
    private String userId;
    
    private String orderName;


    public String getOrderId() {
        return orderId;
    }

    public void setOrderId(String orderId) {
        this.orderId = orderId;
    }

    public String getUserId() {
        return userId;
    }

    public void setUserId(String userId) {
        this.userId = userId;
    }

    public String getOrderName() {
        return orderName;
    }

    public void setOrderName(String orderName) {
        this.orderName = orderName;
    }

    /**
     * 获取主键值
     *
     * @return 主键值
     */
    @Override
    protected Serializable pkVal() {
        return this.orderId;
    }
    }


参考
规则配置

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
### 回答1: vmware-viclient-all-5.0.0是VMware vSphere 5.0的客户端软件包,用于管理和监视虚拟化环境。VMware vSphere是一款企业级虚拟化平台,它允许用户在一台物理服务器上运行多个虚拟机,从而提高服务器资源的利用率。 vmware-viclient-all-5.0.0包含了vSphere客户端的所有组件和插件,可以通过它来访问和管理vSphere环境中的虚拟机、主机和数据存储。客户端提供了图形化的界面,使用户可以轻松进行各种管理操作,例如虚拟机的创建、删除和迁移,资源的配置和监控,以及性能优化和故障排除等。 除了基本的虚拟机管理功能外,vmware-viclient-all-5.0.0还包含了一些高级功能和插件,例如vSphere客户端插件提供了与操作系统无关的本地访问,可以在主机上直接运行客户端,而无需安装任何额外的软件。此外,该软件还支持多种操作系统,包括Windows、Linux和Mac OS。用户可以根据自己的需求选择最适合自己的操作系统进行安装和使用。 总之,vmware-viclient-all-5.0.0是一款功能强大的虚拟化管理软件包,提供了丰富的功能和插件,方便用户对虚拟化环境进行管理和监控。无论是个人用户还是企业用户,都可以通过该软件轻松构建和管理自己的虚拟化环境,提高服务器资源的利用率,降低成本,提高系统的可靠性和可扩展性。 ### 回答2: vmware-viclient-all-5.0.0是VMware vSphere Client 5.0.0的软件包。vSphere Client是一款用于管理和监控虚拟化环境的工具。它提供了一个用户界面,让用户可以轻松地管理虚拟机、数据存储以及网络设置。 vmware-viclient-all-5.0.0包含了vSphere Client的所有功能和组件。通过安装这个软件包,用户可以使用vSphere Client的所有功能,包括创建、克隆和删除虚拟机,监控虚拟机的性能和资源利用情况,以及管理虚拟机的存储和网络设置。 此版本的vSphere Client是为了与VMware vSphere 5.0.0兼容而发布的。vSphere 5.0.0是VMware最早的vSphere版本之一,拥有众多改进和新功能。通过使用vmware-viclient-all-5.0.0,用户可以充分利用vSphere 5.0.0提供的新特性,并从更好的性能和更强大的功能中受益。 总而言之,vmware-viclient-all-5.0.0是一款用于管理和监控虚拟化环境的软件包。它提供了vSphere Client的所有功能和组件,并与VMware vSphere 5.0.0兼容。使用这个软件包,用户可以方便地管理虚拟机、数据存储和网络设置,并享受到vSphere 5.0.0提供的改进和新特性带来的好处。 ### 回答3: vmware-viclient-all-5.0.0是VMware vSphere 5.0的客户端工具包。它是一种用于访问和管理VMware vSphere虚拟化平台的软件。该软件具有用户友好的图形用户界面,可通过客户端连接到vSphere服务器并执行各种操作。 通过vmware-viclient-all-5.0.0,用户可以轻松管理虚拟化基础架构,包括虚拟机的创建、配置和删除,以及资源池和主机的管理。此外,该工具包还提供了诸如虚拟网络和存储的配置和管理功能,使用户能够灵活地管理整个虚拟环境。 vmware-viclient-all-5.0.0还具有监控功能,可以实时监视虚拟机和宿主机的性能指标,如CPU和内存利用率、网络和存储性能等。通过这些监控工具,用户可以及时发现和解决虚拟化环境中的性能瓶颈和故障。 此外,vmware-viclient-all-5.0.0还包括了远程控制功能,允许用户通过客户端远程连接到虚拟机并进行操作,如安装操作系统、修改配置等。 总的来说,vmware-viclient-all-5.0.0是一个功能强大、易于使用的虚拟化管理工具。它为用户提供了对VMware vSphere平台的全面访问和控制,帮助用户轻松管理和监控虚拟化环境,并提供了远程操作功能。无论是个人用户还是企业用户,都可以通过该工具包提升虚拟化环境的管理效率和灵活性。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

搬山境KL攻城狮

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值