因为已经改造了登录平台,实现了集群统一部署,然后后续就是继续弄集中统一部署服务改造(这里的集中统一部署的意思是区别于每个区域私有部署,服务本身还是可以弹性伸缩的),首先改造一个比较简单的白名单微服务,只涉及到三张表,业务逻辑也简单就是CRUD以及关联查询。

因为当初这个服务是由其他人实现交给我这边部署维护一下,具体的业务逻辑和代码我也没看过,所以改造的时候就想着尽量不动代码,无侵入式的或者低侵入式的实现集中部署,同时又要进行数据隔离,每个区域只能查询到对应区域的数据,因为之前在每个区域的网关层面已经加上了一个请求头(区域code),所以白名单服务可以利用这个流量标识来区别流量,来增删改查对应的数据。

有几个方案,比如在数据库表里加一个字段,然后操作的时候通过该字段进行区别,但是此方案需要对之前的所有操作都进行修改,改动太大,于是我想到了shardingsphere的数据分片功能,利用数据分片一样可以实现数据的隔离,通过逻辑表和事实表,程序sql操作逻辑表,shardingsphere实际操作具体的事实表,不需要修改任何旧代码即可达到数据隔离的效果。

shardingsphere数据分片有几种自带算法,且支持自定义算法,因为我表里是没有一个分片字段的,所以是采用的hint算法,并且自定义实现了hint算法,在springmvc拦截器层面会获取到请求头里面的code,然后设置事实表为logicTableName + '_' + code,具体代码如下:

然后最开始我配置的是手动定义事实表actualDataNodes,后面改成了autoTables,不过这个都行,就是在使用autoTable的时候,需要注意一下,shardingsphere只实现了五种分片算法,Mod、HashMod、AutoInterval、VolumeBasedRange、BoundaryBasedRange,因为我想使用hint算法,只能自定义实现了,而且autoTable的算法类必须实现ShardingAutoTableAlgorithm接口,实现类如下:

可以看到ShardingAutoTableAlgorithm有个需要实现的方法,getAutoTablesAmount();这个返回一个int类型值,作用是shardingsphere拿到这个值,然后会自动帮你创建(手动定义事实表actualDataNodes),比如你返回一个3,那么shardingsphere会帮你自动定义table_0,table_1,table_2三张事实表。
可以看到我这里定义了一个1000000,为啥呢,因为我的区域编码最多有6位,为了让shardingsphere能识别到我的任意区域编码,索性我这里直接定义这么大的范围,而不是每个区域编码手动定义了。性能的话,shardingsphere会在第一次初始化,有点慢,后续的请求我看了一下就很快了,所以可以在启动程序的时候模拟请求一次,跟预热差不多的操作就行了。

实现了该算法后,需要把该类让shardingsphere读取到,因为shardingsphere使用了SPI机制获取实现,所以我们需要在/resource/META-INF/services下创建一个名为org.apache.shardingsphere.sharding.spi.ShardingAlgorithm的文件,文件内容就是你实现类的reference

然后是yml配置如下:


我不是码农
3 声望1 粉丝

java开发码农