diff --git a/pom.xml b/pom.xml index 027df8ec6e2cb33045bbb024e60a7636024bb59e..f19ab673692c286c82fcd1f66b5aaaffc132b484 100644 --- a/pom.xml +++ b/pom.xml @@ -13,6 +13,7 @@ smqttx-rule smqttx-ui smqttx-metric + smqttx-solon-plugin smqttx-spring-boot-starter smqttx-integrate diff --git a/smqttx-solon-plugin/pom.xml b/smqttx-solon-plugin/pom.xml new file mode 100644 index 0000000000000000000000000000000000000000..f6b7bd034c23d60f1daba03634d387192f18e0e0 --- /dev/null +++ b/smqttx-solon-plugin/pom.xml @@ -0,0 +1,41 @@ + + + + 4.0.0 + + + smqttx + io.github.quickmsg + 2.0.11 + + + smqttx-solon-plugin + + smqttx-solon-plugin + + + UTF-8 + + + + + org.noear + solon + 2.5.11 + provided + + + io.github.quickmsg + smqttx-core + 2.0.11 + + + smqttx-ui + io.github.quickmsg + 2.0.11 + + + + + diff --git a/smqttx-solon-plugin/src/main/java/io/github/quickmsg/solon/SolonBootstrapConfig.java b/smqttx-solon-plugin/src/main/java/io/github/quickmsg/solon/SolonBootstrapConfig.java new file mode 100644 index 0000000000000000000000000000000000000000..326225ddc5b2104ba0c7831e005c303bf52eee52 --- /dev/null +++ b/smqttx-solon-plugin/src/main/java/io/github/quickmsg/solon/SolonBootstrapConfig.java @@ -0,0 +1,74 @@ +package io.github.quickmsg.solon; + +import ch.qos.logback.classic.Level; +import io.github.quickmsg.common.config.AuthConfig; +import io.github.quickmsg.common.config.BootstrapConfig; +import io.github.quickmsg.common.rule.RuleChainDefinition; +import io.github.quickmsg.common.rule.source.SourceDefinition; +import lombok.Getter; +import lombok.Setter; +import lombok.ToString; +import org.noear.solon.annotation.Configuration; +import org.noear.solon.annotation.Inject; + +import java.util.List; + +/** + * @author luxurong + * @since noear + */ +@Getter +@Setter +@ToString +@Inject("${smqtt}") +@Configuration +public class SolonBootstrapConfig { + + /** + * sfl4j日志级别 + * + * @see Level + */ + private String logLevel; + + /** + * tcp配置 + */ + private BootstrapConfig.TcpConfig tcp; + + /** + * http配置 + */ + private BootstrapConfig.HttpConfig http; + + /** + * websocket配置 + */ + private BootstrapConfig.WebsocketConfig ws; + + /** + * 集群配置配置 + */ + private BootstrapConfig.ClusterConfig cluster; + + /** + * meter配置 + */ + private BootstrapConfig.MeterConfig meter; + + /** + * 规则定义 + */ + private List rules; + + /** + * 规则定义 + */ + private List sources; + + /** + * auth + */ + private AuthConfig auth; + +} diff --git a/smqttx-solon-plugin/src/main/java/io/github/quickmsg/solon/config/AutoMqttConfiguration.java b/smqttx-solon-plugin/src/main/java/io/github/quickmsg/solon/config/AutoMqttConfiguration.java new file mode 100644 index 0000000000000000000000000000000000000000..a1bddcaa7b76d0153cad693bf9c4b8340dfdb54e --- /dev/null +++ b/smqttx-solon-plugin/src/main/java/io/github/quickmsg/solon/config/AutoMqttConfiguration.java @@ -0,0 +1,55 @@ +package io.github.quickmsg.solon.config; + +import ch.qos.logback.classic.Level; +import io.github.quickmsg.common.utils.IPUtils; +import io.github.quickmsg.core.Bootstrap; +import io.github.quickmsg.solon.SolonBootstrapConfig; +import lombok.extern.slf4j.Slf4j; +import org.noear.solon.annotation.Bean; +import org.noear.solon.annotation.Configuration; + +/** + * @author luxurong + */ +@Slf4j +@Configuration +public class AutoMqttConfiguration { + + + /** + * 配置异常切面 + * + * @param solonBootstrapConfig {@link SolonBootstrapConfig} + * @return {@link Bootstrap} + */ + @Bean + public Bootstrap startServer(SolonBootstrapConfig solonBootstrapConfig) { + return Bootstrap.builder() + .rootLevel(Level.toLevel(solonBootstrapConfig.getLogLevel())) + .tcpConfig(solonBootstrapConfig.getTcp()) + .httpConfig(solonBootstrapConfig.getHttp()) + .websocketConfig(solonBootstrapConfig.getWs()) + .clusterConfig(solonBootstrapConfig.getCluster()) + .ruleChainDefinitions(solonBootstrapConfig.getRules()) + .sourceDefinitions(solonBootstrapConfig.getSources()) + .meterConfig(solonBootstrapConfig.getMeter()) + .authConfig(solonBootstrapConfig.getAuth()) + .meterConfig(solonBootstrapConfig.getMeter()) + .build() + .start() + .doOnSuccess(this::printUiUrl).block(); + } + + public void printUiUrl(Bootstrap bootstrap) { + String start = "\n-------------------------------------------------------------\n\t"; + start += String.format("Smqtt mqtt connect url %s:%s \n\t", IPUtils.getIP(), bootstrap.getTcpConfig().getPort()); + if (bootstrap.getHttpConfig() != null ) { + Integer port = 60000; + start += String.format("Smqtt-Admin UI is running AccessURLs:\n\t" + + "Http Local url: http://localhost:%s/smqtt/admin" + "\n\t" + + "Http External url: http://%s:%s/smqtt/admin" + "\n" + + "-------------------------------------------------------------", port, IPUtils.getIP(), port); + } + log.info(start); + } +} diff --git a/smqttx-solon-plugin/src/main/java/io/github/quickmsg/solon/config/EnableMqttServer.java b/smqttx-solon-plugin/src/main/java/io/github/quickmsg/solon/config/EnableMqttServer.java new file mode 100644 index 0000000000000000000000000000000000000000..44f30d33887445d059c6d61b6fb4a35ecc503c1f --- /dev/null +++ b/smqttx-solon-plugin/src/main/java/io/github/quickmsg/solon/config/EnableMqttServer.java @@ -0,0 +1,19 @@ +package io.github.quickmsg.solon.config; + + +import io.github.quickmsg.solon.SolonBootstrapConfig; +import org.noear.solon.annotation.Import; + +import java.lang.annotation.*; + +/** + * @author luxurong + * @author noear + */ +@Target(ElementType.TYPE) +@Retention(RetentionPolicy.RUNTIME) +@Import(classes = {SolonBootstrapConfig.class, AutoMqttConfiguration.class}, + profilesIfAbsent = {"classpath:META-INF/solon_def/smqttx-def.yml"}) +@Documented +public @interface EnableMqttServer { +} diff --git a/smqttx-solon-plugin/src/main/resources/META-INF/solon_def/smqttx-def.yml b/smqttx-solon-plugin/src/main/resources/META-INF/solon_def/smqttx-def.yml new file mode 100644 index 0000000000000000000000000000000000000000..b423661d0df358c0c09e19fa4184991388dde3b8 --- /dev/null +++ b/smqttx-solon-plugin/src/main/resources/META-INF/solon_def/smqttx-def.yml @@ -0,0 +1,53 @@ +smqtt: + logLevel: INFO # 系统日志 + tcp: # tcp配置 + port: 1883 # mqtt端口号 + wiretap: false # 二进制日志 前提是 smqtt.logLevel = DEBUG + bossThreadSize: 8 # boss线程 默认=cpu核心数 + workThreadSize: 16 # work线程 默认=cpu核心数*2 + businessThreadSize: 32 # 业务线程数 默认=cpu核心数*10 + businessQueueSize: 100000 #业务队列 默认=100000 + messageMaxSize: 4194304 # 接收消息的最大限制 默认4194304(4M) + lowWaterMark: 4000000 # 不建议配置 默认 32768 + highWaterMark: 80000000 # 不建议配置 默认 65536 + # globalReadWriteSize: 10000000,100000000 全局读写大小限制 + # channelReadWriteSize: 10000000,100000000 单个channel读写大小限制 + options: + SO_BACKLOG: 2000 + ssl: # ssl配置 + enable: false # 开关 + key: /user/server.key # 指定ssl文件 默认系统生成 + crt: /user/server.crt # 指定ssl文件 默认系统生成 + acl: + aclPolicy: NONE # NONE or FILE or JDBC + filePath: D:\smq-business\config\acl\basic_policy.csv # FILE时配置filePath + jdbcAclConfig: + driver: com.mysql.jdbc.Driver + url: jdbc:mysql://localhost:3306/smqtt + username: root + password: 123 + auth: + fixed: + username: smqtt + password: smqtt + http: # http相关配置 端口固定60000 + enable: true # 开关 + accessLog: true # http访问日志 + ssl: # ssl配置 + enable: false + admin: # 后台管理配置 + enable: true # 开关 + username: smqtt # 访问用户名 + password: smqtt # 访问密码 + ws: # websocket配置 + enable: true # 开关 + port: 8999 # 端口 + path: /mqtt # ws 的访问path mqtt.js请设置此选项 + cluster: # 集群配置 + enable: false # 集群开关 + addresses: ["127.0.0.1"] + meter: + meterType: PROMETHEUS # INFLUXDB , PROMETHEUS + + +