修改mq相关代码 整理netty与disruptor

master
bynt 2 years ago
parent 53e0bdfe70
commit b4b9258b91

@ -4,7 +4,8 @@ cdp-common 公用
- cdp-common-core 基础模块用于公用类
- cdp-common-exception 公用异常
- cdp-common-mybatist-plus mybatis-plus封装
- cdp-common-mybatis-plus mybatis-plus封装
- cdp-common-rocketmq rocketmq 封装
- cdp-common-security 鉴权服务
cdp-iaas 基础服务
- authorization-server 授权验证管理在线用户

@ -57,7 +57,6 @@
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid-spring-boot-starter</artifactId>

@ -0,0 +1,28 @@
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<artifactId>cdp-tools</artifactId>
<groupId>com.baiye</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<groupId>com.example</groupId>
<artifactId>cdp-tool-dy</artifactId>
<version>1.0-SNAPSHOT</version>
<name>cdp-tool-dy</name>
<description>cdp-tool-dy</description>
<properties>
<java.version>8</java.version>
</properties>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>

@ -1,34 +0,0 @@
HELP.md
target/
!.mvn/wrapper/maven-wrapper.jar
!**/src/main/**/target/
!**/src/test/**/target/
### STS ###
.apt_generated
.classpath
.factorypath
.project
.settings
.springBeans
.sts4-cache
### IntelliJ IDEA ###
.idea
*.iws
*.iml
*.ipr
### NetBeans ###
/nbproject/private/
/nbbuild/
/dist/
/nbdist/
/.nb-gradle/
build/
!**/src/main/**/build/
!**/src/test/**/build/
### VS Code ###
.vscode/
.mvn

@ -0,0 +1,58 @@
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<artifactId>cdp-tools</artifactId>
<groupId>com.baiye</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<artifactId>cdp-tool-netty-disruptor</artifactId>
<version>1.0.0-SNAPSHOT</version>
<name>cdp-tool-netty-disruptor</name>
<description>cdp-tool-netty-disruptor</description>
<properties>
<java.version>1.8</java.version>
</properties>
<dependencies>
<!-- https://mvnrepository.com/artifact/io.netty/netty-all -->
<dependency>
<groupId>io.netty</groupId>
<artifactId>netty-all</artifactId>
</dependency>
<dependency>
<groupId>com.lmax</groupId>
<artifactId>disruptor</artifactId>
</dependency>
<dependency>
<groupId>com.baiye</groupId>
<artifactId>cdp-common-core</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
<!-- 序列化框架marshalling -->
<dependency>
<groupId>org.jboss.marshalling</groupId>
<artifactId>jboss-marshalling</artifactId>
<version>1.3.0.CR9</version>
</dependency>
<dependency>
<groupId>org.jboss.marshalling</groupId>
<artifactId>jboss-marshalling-serial</artifactId>
<version>1.3.0.CR9</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>

@ -0,0 +1,36 @@
package com.baiye;
import com.baiye.common.MessageConsumer;
import com.baiye.common.RingBufferWorkerPoolFactory;
import com.baiye.server.MessageConsumerImpl;
import com.baiye.server.SocketServer;
import com.lmax.disruptor.YieldingWaitStrategy;
import com.lmax.disruptor.dsl.ProducerType;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration;
/**
* @author Enzo
* @date 2022-7-20
*/
@SpringBootApplication(exclude = DataSourceAutoConfiguration.class)
public class CdpToolNettyDisruptorApplication {
public static void main(String[] args) throws InterruptedException {
int consumerCount = 10;
MessageConsumer[] consumers = new MessageConsumer[consumerCount];
for (int i = 0; i < consumerCount; i++){
MessageConsumer consumer =
new MessageConsumerImpl("CODE" + i);
consumers[i] = consumer;
}
RingBufferWorkerPoolFactory.getInstance().initStart
(ProducerType.MULTI, 1024 * 1024, new YieldingWaitStrategy(), consumers);
SocketServer.getInstance().startServer();
SpringApplication.run(CdpToolNettyDisruptorApplication.class, args);
}
}

@ -0,0 +1,45 @@
package com.baiye.codec;
import io.netty.handler.codec.marshalling.*;
import org.jboss.marshalling.MarshallerFactory;
import org.jboss.marshalling.Marshalling;
import org.jboss.marshalling.MarshallingConfiguration;
/**
* Marshalling -
*
* @author q
* @date 2022/07/11
*/
public final class MarshallingCodeCFactory {
/**
* Jboss MarshallingMarshallingDecoder
* @return MarshallingDecoder
*/
public static MarshallingDecoder buildMarshallingDecoder() {
//首先通过Marshalling工具类的精通方法获取Marshalling实例对象 参数serial标识创建的是java序列化工厂对象。
final MarshallerFactory marshallerFactory = Marshalling.getProvidedMarshallerFactory("serial");
//创建了MarshallingConfiguration对象配置了版本号为5
final MarshallingConfiguration configuration = new MarshallingConfiguration();
configuration.setVersion(5);
//根据marshallerFactory和configuration创建provider
UnmarshallerProvider provider = new DefaultUnmarshallerProvider(marshallerFactory, configuration);
//构建Netty的MarshallingDecoder对象俩个参数分别为provider和单个消息序列化后的最大长度
return new MarshallingDecoder(provider, 1024 * 1024);
}
/**
* Jboss MarshallingMarshallingEncoder
* @return MarshallingEncoder
*/
public static MarshallingEncoder buildMarshallingEncoder() {
final MarshallerFactory marshallerFactory = Marshalling.getProvidedMarshallerFactory("serial");
final MarshallingConfiguration configuration = new MarshallingConfiguration();
configuration.setVersion(5);
MarshallerProvider provider = new DefaultMarshallerProvider(marshallerFactory, configuration);
//构建Netty的MarshallingEncoder对象MarshallingEncoder用于实现序列化接口的POJO对象序列化为二进制数组
MarshallingEncoder encoder = new MarshallingEncoder(provider);
return encoder;
}
}

@ -0,0 +1,19 @@
package com.baiye.common;
import com.lmax.disruptor.WorkHandler;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.NoArgsConstructor;
/**
* @author Enzo
* @date
*/
@Data
@AllArgsConstructor
@NoArgsConstructor
@EqualsAndHashCode
public abstract class MessageConsumer implements WorkHandler<TranslatorDataWraper> {
protected String consumerId;
}

@ -0,0 +1,30 @@
package com.baiye.common;
import com.lmax.disruptor.RingBuffer;
import io.netty.channel.ChannelHandlerContext;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.NoArgsConstructor;
/**
* @author Enzo
*/
@Data
@EqualsAndHashCode
@AllArgsConstructor
@NoArgsConstructor
public class MessageProducer {
private RingBuffer<TranslatorDataWraper> ringBuffer;
public void sendData(ChannelHandlerContext context, String msg){
long seq = ringBuffer.next();
TranslatorDataWraper translatorDataWraper = ringBuffer.get(seq);
translatorDataWraper.setContext(context);
translatorDataWraper.setMsg(msg);
ringBuffer.publish(seq);
}
}

@ -0,0 +1,83 @@
package com.baiye.common;
import com.lmax.disruptor.*;
import com.lmax.disruptor.dsl.ProducerType;
import lombok.extern.slf4j.Slf4j;
import java.util.Arrays;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.Executors;
@Slf4j
public class RingBufferWorkerPoolFactory {
private static class SingletonHolder{
static final RingBufferWorkerPoolFactory factory = new RingBufferWorkerPoolFactory();
}
public RingBufferWorkerPoolFactory() {
}
public static RingBufferWorkerPoolFactory getInstance(){
return SingletonHolder.factory;
}
private static Map<String, MessageProducer> producers = new ConcurrentHashMap<>();
private static Map<String, MessageConsumer> consumers = new ConcurrentHashMap<>();
private RingBuffer<TranslatorDataWraper> ringBuffer;
private WorkerPool<TranslatorDataWraper> workerPool;
private SequenceBarrier sequenceBarrier;
public void initStart(ProducerType type, int bufferSize, WaitStrategy waitStrategy, MessageConsumer[] consumersList){
//构造 ringbuffer
this.ringBuffer = RingBuffer.create(type, TranslatorDataWraper::new, bufferSize, waitStrategy);
//设置栅栏
this.sequenceBarrier = this.ringBuffer.newBarrier();
//设置workpool
this.workerPool = new WorkerPool<>(this.ringBuffer, this.sequenceBarrier, null, consumersList);
//把所构建的消费者放入池中
Arrays.asList(consumersList).forEach(messageConsumer -> consumers.put(messageConsumer.getConsumerId(), messageConsumer));
//添加sequence
this.ringBuffer.addGatingSequences(this.workerPool.getWorkerSequences());
//启动workpool
this.workerPool.start(Executors.newFixedThreadPool(10));
}
public MessageProducer getMessageProducer(String produceId){
MessageProducer producer = producers.get(produceId);
if (null == producer){
producer = new MessageProducer(this.ringBuffer);
producers.put(produceId, producer);
}
return producer;
}
/**
*
*
*
*
* @author q
* @date 2022/07/13
*/
static class EventExceptionHandler implements ExceptionHandler<TranslatorDataWapper> {
@Override
public void handleEventException(Throwable throwable, long l, TranslatorDataWapper translatorDataWapper) {
// TODO: 2022/7/13 0013 todo...
}
@Override
public void handleOnStartException(Throwable throwable) {
// TODO: 2022/7/13 0013 todo...
}
@Override
public void handleOnShutdownException(Throwable throwable) {
// TODO: 2022/7/13 0013 todo...
}
}
}

@ -0,0 +1,23 @@
package com.baiye.common;
import com.baiye.dto.TranslatorData;
import io.netty.channel.ChannelHandlerContext;
import lombok.Data;
/**
* Netty 使 Disruptor 使
*
* @author q
* @date 2022/07/13
*/
@Data
public class TranslatorDataWapper {
private TranslatorData translatorData;
private ChannelHandlerContext ctx;
}

@ -0,0 +1,10 @@
package com.baiye.common;
import io.netty.channel.ChannelHandlerContext;
import lombok.Data;
@Data
public class TranslatorDataWraper {
private String msg;
private ChannelHandlerContext context;
}

@ -0,0 +1,37 @@
package com.baiye.dto;
import lombok.Getter;
import lombok.Setter;
import lombok.ToString;
import java.io.Serializable;
/**
*
*
* @author q
* @date 2022/07/11
*/
@Getter
@Setter
@ToString
public class TranslatorData implements Serializable {
/**
* id
*/
private String id;
/**
*
*/
private String name;
/**
*
*/
private String message;
}

@ -0,0 +1,22 @@
package com.baiye.dto;
import io.netty.channel.ChannelHandlerContext;
import lombok.Data;
/**
* Netty 使 Disruptor 使
*
* @author q
* @date 2022/07/13
*/
@Data
public class TranslatorDataWapper {
private TranslatorData translatorData;
private ChannelHandlerContext ctx;
}

@ -0,0 +1,21 @@
package com.baiye.server;
import com.baiye.common.MessageConsumer;
import com.baiye.common.TranslatorDataWraper;
import io.netty.channel.ChannelHandlerContext;
import lombok.extern.slf4j.Slf4j;
@Slf4j
public class MessageConsumerImpl extends MessageConsumer {
public MessageConsumerImpl(String consumerId) {
super(consumerId);
}
@Override
public void onEvent(TranslatorDataWraper translatorDataWraper) throws Exception {
log.info("收到客户端消息----------{}", translatorDataWraper.getMsg());
ChannelHandlerContext ctx = translatorDataWraper.getContext();
ctx.channel().writeAndFlush("返回给客户端消息");
}
}

@ -0,0 +1,85 @@
package com.baiye.server;
import com.baiye.codec.MarshallingCodeCFactory;
import io.netty.bootstrap.ServerBootstrap;
import io.netty.buffer.PooledByteBufAllocator;
import io.netty.channel.*;
import io.netty.channel.nio.NioEventLoopGroup;
import io.netty.channel.socket.SocketChannel;
import io.netty.channel.socket.nio.NioServerSocketChannel;
import io.netty.handler.logging.LogLevel;
import io.netty.handler.logging.LoggingHandler;
import lombok.extern.slf4j.Slf4j;
@Slf4j
public class SocketServer {
//扩展 完善 池化: ConcurrentHashMap<KEY -> String, Value -> Channel>
private Channel channel;
private SocketServer() {
}
public static SocketServer getInstance() {
return Singleton.INSTANCE.getInstance();
}
private enum Singleton {
INSTANCE;
private SocketServer singleton;
//jvm保证只调用一次
Singleton() {
singleton = new SocketServer();
}
public SocketServer getInstance() {
return singleton;
}
}
public void startServer() throws InterruptedException {
log.info("---------启动socket服务---------");
EventLoopGroup bossGroup = new NioEventLoopGroup();
EventLoopGroup workerGroup = new NioEventLoopGroup();
ServerBootstrap serverBootstrap;
serverBootstrap = new ServerBootstrap()
.group(bossGroup, workerGroup)
.channel(NioServerSocketChannel.class)
// fixme 设置 backlog大小
.option(ChannelOption.SO_BACKLOG, 1024)
// fixme 表示缓存区动态调配(自适应) 数据包相差不大的时候比较合适
.option(ChannelOption.RCVBUF_ALLOCATOR, AdaptiveRecvByteBufAllocator.DEFAULT)
// 缓冲区 池化操作
.option(ChannelOption.ALLOCATOR, PooledByteBufAllocator.DEFAULT)
// 记录日志
.handler(new LoggingHandler(LogLevel.INFO))
// 数据接收过来给哪个方法进行回调 -> 接收数据进行异步处理
.childHandler(new ChannelInitializer<SocketChannel>() {
@Override
protected void initChannel(SocketChannel socketChannel) throws Exception {
// fixme 在管道上加一些拦截器进行处理
// 进行设置编解码 -> 对Java对象转为的二进制数据进行编解码
socketChannel.pipeline().addLast(MarshallingCodeCFactory.buildMarshallingDecoder());
socketChannel.pipeline().addLast(MarshallingCodeCFactory.buildMarshallingEncoder());
// 信息处理
socketChannel.pipeline().addLast(new SocketServerHandler());
}
});
// 绑定端口, 同步请求链接
ChannelFuture cf = serverBootstrap.bind(8099).sync();
// 异步的进行关闭
//接下来就进行数据的发送, 但是首先我们要获取channel:
this.channel = cf.channel();
log.info("---------socket服务启动成功---------");
}
public static void main(String[] args) throws InterruptedException {
SocketServer.getInstance().startServer();
}
}

@ -0,0 +1,36 @@
package com.baiye.server;
import com.baiye.common.MessageProducer;
import com.baiye.common.RingBufferWorkerPoolFactory;
import io.netty.channel.ChannelHandlerContext;
import io.netty.channel.SimpleChannelInboundHandler;
import lombok.extern.slf4j.Slf4j;
/**
* @author Enzo
* @date 2022-7-21
*/
@Slf4j
public class SocketServerHandler extends SimpleChannelInboundHandler<String> {
@Override
protected void channelRead0(ChannelHandlerContext channelHandlerContext, String msg) throws Exception {
MessageProducer messageProducer = RingBufferWorkerPoolFactory.getInstance().getMessageProducer("message001");
messageProducer.sendData(channelHandlerContext, msg);
log.info("消息-------- {}", msg);
}
@Override
public void handlerAdded(ChannelHandlerContext ctx) throws Exception {
log.info("server handler added----{}", ctx.channel().remoteAddress());
}
@Override
public void handlerRemoved(ChannelHandlerContext ctx) throws Exception {
log.info("server handler removed----{}", ctx.channel().remoteAddress());
}
@Override
public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception {
ctx.close();
}
}

@ -0,0 +1,22 @@
package com.baiye.server;
import io.netty.channel.ChannelInitializer;
import io.netty.channel.ChannelPipeline;
import io.netty.channel.socket.SocketChannel;
import io.netty.handler.codec.LengthFieldBasedFrameDecoder;
import io.netty.handler.codec.LengthFieldPrepender;
import io.netty.handler.codec.string.StringDecoder;
import io.netty.handler.codec.string.StringEncoder;
import io.netty.util.CharsetUtil;
public class SocketServerInitializer extends ChannelInitializer<SocketChannel> {
@Override
protected void initChannel(SocketChannel socketChannel) throws Exception {
ChannelPipeline pipeline = socketChannel.pipeline();
pipeline.addLast(new LengthFieldBasedFrameDecoder(Integer.MAX_VALUE, 0, 4, 0, 4));
pipeline.addLast( new LengthFieldPrepender(4));
pipeline.addLast(new StringDecoder(CharsetUtil.UTF_8));
pipeline.addLast(new StringEncoder(CharsetUtil.UTF_8));
pipeline.addLast(new SocketServerHandler());
}
}

@ -0,0 +1,13 @@
package com.baiye;
import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;
@SpringBootTest
class CdpToolNettyDisruptorApplicationTests {
@Test
void contextLoads() {
}
}

@ -3,7 +3,7 @@
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent>
<artifactId>cdp-wechat</artifactId>
<artifactId>cdp-tool-wechat</artifactId>
<groupId>com.baiye</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
@ -60,10 +60,7 @@
</exclusions>
</dependency>
<!-- <dependency>-->
<!-- <groupId>com.alibaba.cloud</groupId>-->
<!-- <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>-->
<!-- </dependency>-->
<dependency>
<groupId>com.alibaba</groupId>
@ -96,4 +93,4 @@
<version>5.4.5</version>
</dependency>
</dependencies>
</project>
</project>

@ -2,7 +2,6 @@ package com.baiye.job;
import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.date.DateUtil;
import cn.hutool.core.util.StrUtil;
import cn.hutool.http.HttpStatus;
import cn.hutool.http.HttpUtil;
import cn.hutool.json.JSONUtil;
@ -25,7 +24,6 @@ import org.springframework.stereotype.Component;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
/**

@ -3,7 +3,7 @@
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent>
<artifactId>cdp-wechat</artifactId>
<artifactId>cdp-tool-wechat</artifactId>
<groupId>com.baiye</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
@ -37,10 +37,6 @@
<version>1.0-SNAPSHOT</version>
</dependency>
<!-- <dependency>-->
<!-- <groupId>com.alibaba.cloud</groupId>-->
<!-- <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>-->
<!-- </dependency>-->
<dependency>
<groupId>com.alibaba</groupId>
@ -51,6 +47,7 @@
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
<dependency>
<groupId>com.github.ulisesbocchio</groupId>
<artifactId>jasypt-spring-boot-starter</artifactId>
@ -63,4 +60,4 @@
</dependency>
</dependencies>
</project>
</project>

@ -39,8 +39,6 @@ import org.apache.commons.lang3.StringUtils;
import org.springframework.data.domain.Pageable;
import org.springframework.stereotype.Service;
import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

@ -1,24 +1,27 @@
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<artifactId>by-cdp</artifactId>
<artifactId>cdp-tools</artifactId>
<groupId>com.baiye</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>cdp-wechat</artifactId>
<packaging>pom</packaging>
<name>cdp-tool-wechat</name>
<artifactId>cdp-tool-wechat</artifactId>
<description>cdp-tool-wechat</description>
<modules>
<module>cdp-wechat-server</module>
<module>cdp-wechat-api</module>
</modules>
<properties>
<maven.compiler.source>8</maven.compiler.source>
<maven.compiler.target>8</maven.compiler.target>
<java.version>8</java.version>
</properties>
</project>
</project>

@ -12,10 +12,10 @@
<artifactId>cdp-tools</artifactId>
<packaging>pom</packaging>
<modules>
<module>dy-tool-livetelecast</module>
<module>dy-tool-member</module>
<module>dy-tool-video</module>
<module>cdp-tool-dy</module>
<module>cdp-tool-mq</module>
<module>cdp-tool-wechat</module>
<module>cdp-tool-netty-disruptor</module>
</modules>
<properties>

@ -20,7 +20,6 @@
<module>cdp-entrance</module>
<module>cdp-tag-center</module>
<module>cdp-customer</module>
<module>cdp-wechat</module>
</modules>
@ -59,7 +58,6 @@
<mysql-connector.version>5.1.47</mysql-connector.version>
<org.mapstruct.version>1.3.1.Final</org.mapstruct.version>
<commons-beanutils.version>1.9.4</commons-beanutils.version>
<druid-boot-stater.version>1.1.23</druid-boot-stater.version>
<springside-utils.version>5.0.0-RC1</springside-utils.version>
<aliyun-java-sdk-dm.version>3.3.1</aliyun-java-sdk-dm.version>
<swagger-annotations.version>1.5.20</swagger-annotations.version>
@ -85,8 +83,6 @@
<artifactId>swagger-annotations</artifactId>
</dependency>
<!-- 仅仅包含mybatis plus的相关注解 -->
<dependency>
<groupId>com.baomidou</groupId>
@ -150,6 +146,7 @@
<artifactId>mybatis-plus-annotation</artifactId>
<version>${mybatis-plus-boot-stater.version}</version>
</dependency>
<dependency>
<groupId>commons-beanutils</groupId>
<artifactId>commons-beanutils</artifactId>
@ -163,11 +160,6 @@
<version>${mybatis-plus-boot-stater.version}</version>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid-spring-boot-starter</artifactId>
<version>${druid-boot-stater.version}</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.redisson/redisson-spring-boot-starter -->
<dependency>

Loading…
Cancel
Save