camellia动态操作redis配置实现单租户和多租户
为了方便使用redis单机版做演示只提供关键点搭建具体细节下载源码源码在最下方第一步搭建redis服务第二步搭建mysql服务第三步执行所需脚本https://github.com/netease-im/camellia/blob/master/docs/camellia-dashboard/table.sql第四步创建空springboot服务 需要集成mysql和redis第五步引入相关依赖第六步启动类加上注解EnableCamelliaDashboard SpringBootApplication(scanBasePackages {com.example.camellia, com.netease.nim.camellia.dashboard})扫描包需要加上否则调用服务接口出现404第七步启动camllia dashboard此项目由于java版本兼容性问题启动时需加上 VM参数 --add-opens java.base/java.langALL-UNNAMED第八步官网拉取camellia源码https://github.com/netease-im/camellia进入camellia-redis-proxy-bootstrap应用中配置transpond: type: remote remote: url: http://127.0.0.1:8080 bid: 1 bgroup: default dynamic: false check-interval-millis: 3000 monitor-enable: false connect-timeout-millis: 10000 read-timeout-millis: 60000 route: conf: provider: camellia_dashboard第九步启动camellia-redis-proxy-bootstrap服务第十步验证结果可调用dashboard接口绑定业务身份更改配置。进行验证1.创建资源表此接口会返回tidcurl --location http://127.0.0.1:8080/camellia/admin/createResourceTable \ --header Content-Type: application/x-www-form-urlencoded \ --data-urlencode detail { type: simple, operation: { read: redis://127.0.0.1:6379, type: rw_separate, write: redis://127.0.0.1:6379 } } \ --data-urlencode infotid3test若采用redis集群模式参考配置最简单先记这个格式redis-cluster://[username:password 或 password]host1:port1,host2:port2,host3:port3注意点- 必须有- 节点之间用英文逗号 ,- Cluster 不像 sentinel不需要 /masterName- 只写密码时就是 redis-cluster://password...- 用 ACL 时就是 redis-cluster://username:password...1. 最简单的 cluster 资源表如果你只是单集群直连直接这样就行甚至不一定非得包 JSONredis-cluster://10.0.0.11:7000,10.0.0.12:7000,10.0.0.13:7000或者写成 JSON{type: simple,operation: redis-cluster://10.0.0.11:7000,10.0.0.12:7000,10.0.0.13:7000}2. 带密码的 cluster{type: simple,operation: redis-cluster://yourPassword10.0.0.11:7000,10.0.0.12:7000,10.0.0.13:7000}3. 带 ACL 用户名密码的 cluster{type: simple,operation: redis-cluster://appuser:yourPassword10.0.0.11:7000,10.0.0.12:7000,10.0.0.13:7000}4. cluster 做读写分离如果你想按你之前那种 rw_separate 写法可以这样{type: simple,operation: {type: rw_separate,read: redis-cluster://10.0.0.11:7000,10.0.0.12:7000,10.0.0.13:7000,write: redis-cluster://10.0.0.11:7000,10.0.0.12:7000,10.0.0.13:7000}}这个写法语义上可以用但如果读写其实是同一个 cluster这么写更多只是为了结构统一。5. 如果你要“读从节点写主节点”Camellia 还支持 redis-cluster-slaves://{type: simple,operation: {type: rw_separate,read: redis-cluster-slaves://10.0.0.11:7000,10.0.0.12:7000,10.0.0.13:7000?withMasterfalse,write: redis-cluster://10.0.0.11:7000,10.0.0.12:7000,10.0.0.13:7000}}这里- withMasterfalse 表示读只走 slave- 如果你想主从都参与读可以写 withMastertrue6. TLS 集群如果你们生产是 TLS前缀改成 rediss-cluster://{type: simple,operation: rediss-cluster://appuser:yourPassword10.0.0.11:7000,10.0.0.12:7000,10.0.0.13:7000}我建议你现在最先用这个如果你只是把单机改成 cluster先用这一版最稳{type: simple,operation: redis-cluster://10.0.0.11:7000,10.0.0.12:7000,10.0.0.13:7000}2.绑定业务身份传入第一步返回的tid如果变更redis配置先执行1.创建资源表然后再执行此接口才会真正被camellia-redis-proxy-camellia拉取到curl --location http://127.0.0.1:8080/camellia/admin/createOrUpdateTableRef \ --header Content-Type: application/x-www-form-urlencoded \ --data-urlencode bid1 \ --data-urlencode bgroupdefault \ --data-urlencode tid7 \ --data-urlencode infodemo binding4camellia-redis-proxy-bootstrap会定时去轮询的读取dashboard对应业务身份的资源表如果资源发生变化会根据md5比对如不一致就会返回200 camellia-proxy-bootstrap会更改redis的路由进行访问。否则会出现304 not.notify 无改变的结果多租户的实现transpond: type: remote remote: url: http://127.0.0.1:8080 bid: 1 bgroup: default dynamic: true check-interval-millis: 3000 monitor-enable: false connect-timeout-millis: 10000 read-timeout-millis: 60000修改dynamic为true开启多租户先建立资源例如bid2 bgroup vissbid3bgroupdoss然后开启两个redis-cli窗口进行连接连接后需要设置当前链接名称按照规则camellia_bid_bgroup 这种规则 前缀不可变化在camellia源码中会按照这种规则解析然后会路由到对应的配置输入get命令根据路由规则会获取到不同的值至此完成redis-proxy的动态路由也可使用redis客户端工具RESP进行操作应用方使用redis-proxy以springboot为例需要引用依赖dependency groupIdorg.springframework.boot/groupId artifactIdspring-boot-starter-data-redis/artifactId /dependency添加配置类Configuration public class RedisConfig { Value(${spring.redis.host}) private String host; Value(${spring.redis.port}) private int port; Value(${spring.redis.password:}) private String password; Value(${spring.redis.database:0}) private int database; Value(${spring.redis.client-name:camllia-dynamic-client}) private String clientName; Bean public LettuceConnectionFactory redisConnectionFactory() { RedisStandaloneConfiguration configuration new RedisStandaloneConfiguration(host, port); configuration.setDatabase(database); if (password ! null !password.isEmpty()) { configuration.setPassword(password); } ClientOptions clientOptions ClientOptions.builder() .socketOptions(SocketOptions.builder() .connectTimeout(Duration.ofSeconds(10)) .build()) .build(); LettuceClientConfiguration clientConfig LettuceClientConfiguration.builder() .clientOptions(clientOptions) .commandTimeout(Duration.ofSeconds(5)) .clientName(clientName) .build(); LettuceConnectionFactory factory new LettuceConnectionFactory(configuration, clientConfig); factory.afterPropertiesSet(); return factory; } Bean public StringRedisTemplate stringRedisTemplate(LettuceConnectionFactory connectionFactory) { StringRedisTemplate template new StringRedisTemplate(); template.setConnectionFactory(connectionFactory); return template; } }server: port: 8081 spring: redis: host: localhost port: 63800 password: pass123 database: 0 timeout: 3000ms client-name: camellia_3_viss lettuce: pool: max-active: 8 max-idle: 8 min-idle: 0 max-wait: -1ms主要是根据client-name来区分路由的应用方使用对应dashboard分发的client-name二 根据dashboard管理页面操作redis的配置登录账号admin登录密码pass12341.先建立资源表2.业务绑定3.业务绑定管理菜单可查看业务和资源表关联信息4.路由验证结果是否被改变5.资源台账在创建资源表管理时数据会自动创建无需手动登记资源camellia-dashboard新建项目源码https://gitcode.com/qq_33544462/camellia-dashboard应用实现动态redis-proxy项目源码https://gitcode.com/qq_33544462/camllia-dynamic/tree/main