moquette改造筆記(一):整合到SpringBoot

Moquette簡介

Mqtt做爲物聯網比較流行的協議如今已經被大範圍使用,其中也有不少開源的MQTT BROKEN。Moquette是用java基於netty實現的輕量級的MQTT BROKEN. Moquette基於Netty實現,性能問題至少前期能夠不用考慮,在使用過程當中還算穩定,沒有出現過較大的問題。github地址:https://github.com/andsel/moq...java

整合到SpringBoot

本文更加註重代碼實踐,對於配置相關的知識會一筆帶過,不作過多的詳解。
假設已經搭建好SpringBoot環境,下載完Moquette。至於怎麼引用Moquette,能夠在原項目上修改,也能夠達成Jar包添加到lib調用,也能夠上傳到Maven私服後經過配置pom引用。筆者是上傳到Maven私服,而後經過maven導入。git


  1. 自定義包裝類,實現io.moquette.server.Server的自動注入
@Slf4j
@Service
public class MoquetteServer {
    @Value("${mqtt-server.config-path}")
    private String configFilePath;
    @Autowired
    private IAuthorizator authorizator;

    /**
     * Safety相關的攔截器,若是有其它業務,能夠再去實現一個攔截器處理其它業務
     */
    @Autowired
    @Qualifier("safetyInterceptHandler")
    private InterceptHandler safetyinterceptHandler;

    private Server mqttServer;

    public void startServer() throws IOException {
        IResourceLoader configFileResourceLoader = new ClasspathResourceLoader(configFilePath);
        final IConfig config = new ResourceLoaderConfig(configFileResourceLoader);

        mqttServer = new Server();

        /**添加處理Safety相關的攔截器,若是有其它業務,能夠再去實現一個攔截器處理其它業務,而後也添加上便可*/
        List<InterceptHandler> interceptHandlers = Arrays.asList(safetyinterceptHandler);
        /**
         * Authenticator 不顯示設置,Server會默認以password_file建立一個ResourceAuthenticator
         * 若是須要更靈活的鏈接驗證方案,能夠繼承IAuthenticator接口,自定義實現
         */
        mqttServer.startServer(config, interceptHandlers, null, null, authorizator);
    }


    public void stop() {
        mqttServer.stopServer();
    }
    
}

解釋:
(1)添加@Service
(2)configFilePath是Moquette須要的moquette.conf的配置文件路徑,筆者將配置文件放到了resouces目錄下,在application.xml配置的路徑,所以經過@Value自動注入路徑值。
(3)由於是將配置文件放在了resources目錄下,因此用Moquette提供的ClasspathResourceLoader加載的配置文件
(4)IAuthorizator 是權限驗證接口
(5)InterceptHandler是Moquette訂閱、發佈、創建鏈接等相關事件的攔截回調業務處理邏輯接口github


2.實現IAuthorizator接口segmentfault

@Component
public class PermitAllAuthorizator implements IAuthorizator {
    @Override
    public boolean canWrite(Topic topic, String user, String client) {
        /**能夠控制某個用戶的client,是否具備發佈某個主題的權限,目前默認任何Client能夠發佈任主題*/
        return true;
    }

    @Override
    public boolean canRead(Topic topic, String user, String client) {
        /**能夠控制某個用戶的client,是否具備接收某個主題的權限,目前默認任何Client能夠接收任何主題*/
        return true;
    }
}

解釋:實現另外一個很簡單的受權接口,容許任何用戶全部的讀寫請求app


3.實現InterceptHandler接口maven

@Slf4j
@Component
public class SafetyInterceptHandler extends AbstractInterceptHandler{

    @Override
    public String getID() {
        return SafetyInterceptHandler.class.getName();
    }

    @Override
    public void onConnect(InterceptConnectMessage msg) {
        
    }

    @Override
    public void onConnectionLost(InterceptConnectionLostMessage msg) {
       
    }


    @Override
    public void onPublish(InterceptPublishMessage msg) {
       
    }


    @Override
    public void onMessageAcknowledged(InterceptAcknowledgedMessage msg) {
        
    }

}

解釋:
1.簡單實現InterceptHandler,繼承自AbstractInterceptHandler,並重寫了部分方法。能夠根據業務須要實現不一樣的方法。InterceptHandler接口是Moquette預留給開發者根據不一樣事件處理業務邏輯的接口。ide


4.經過SpringBoot啓動Moquette性能

@SpringBootApplication
public class MqttServiceApplication {

    public static void main(String[] args) throws IOException {
        SpringApplication application = new SpringApplication(MqttServiceApplication.class);
        final ApplicationContext context = application.run(args);
        MoquetteServer server = context.getBean(MoquetteServer.class);
        server.startServer();
        Runtime.getRuntime().addShutdownHook(new Thread() {
            @Override
            public void run() {
                server.stop();
                log.info("Moquette Server stopped");
            }
        });
    }



}

若是發現MoquetteServer沒法啓動,是不是SpringBoot默認的包掃描機制的問題,能夠經過@ComponentScan解決。優化

經過以上操做,就能夠在任何想要使用MoquetteServer的地方,經過@Autowired自動注入。spa


固然在MoquetteServer中筆者只是簡單實現了封裝,並無實現其它方法,讀者徹底能夠根據本身的須要在MoquetteServer中實現本身須要的功能,但前提是你要對Moquette的源碼熟悉。

moquette改造筆記(二):優化BrokerInterceptor notifyTopicPublished()邏輯

相關文章
相關標籤/搜索