#1
Integrating MQTT into your Micronaut application can streamline communication for IoT and real-time data processing. This guide walks you through setting up MQTT using Docker for development and Kubernetes for production, leveraging application.properties files tailored for each environment.

1. Adding MQTT and Kubernetes Dependencies

First, ensure your pom.xml includes the necessary dependencies:
<dependencies>
  <!-- Micronaut MQTT integration -->
  <dependency>
    <groupId>io.micronaut.mqtt</groupId>
    <artifactId>micronaut-mqtt-v3</artifactId>
  </dependency>

  <!-- Micronaut Kubernetes client -->
  <dependency>
    <groupId>io.micronaut.kubernetes</groupId>
    <artifactId>micronaut-kubernetes-client</artifactId>
  </dependency>
</dependencies>
These dependencies enable MQTT communication and Kubernetes integration within your Micronaut application.

2. Setting Up MQTT Broker with Docker for Development

For development, you can use Eclipse Mosquitto as your MQTT broker. Run the following Docker command to start the broker:
docker run -it -p 1883:1883 -p 9001:9001 eclipse-mosquitto
  • MQTT Broker: tcp://localhost:1883
  • WebSocket: ws://localhost:9001
This setup provides a local MQTT broker accessible for testing and development purposes.

3. Configuring application-dev.properties

Create a file named application-dev.properties in src/main/resources/ with the following content:
micronaut.application.name=mqtt-app
mqtt.client.server-uri=tcp://localhost:1883
mqtt.client.client-id=dev-client
mqtt.client.user-name=devuser
mqtt.client.password=devpass
mqtt.client.clean-session=true
mqtt.client.automatic-reconnect=true
mqtt.client.keep-alive-interval=30
This configuration sets up the MQTT client to connect to the local broker with specified credentials and connection settings.
To run the application with the development profile:
./mvnw mn:run -Dmicronaut.environments=dev
Micronaut will automatically use the application-dev.properties file for configuration.

4. Preparing for Production with Kubernetes

In a production environment, it's advisable to manage sensitive information like MQTT credentials using Kubernetes Secrets and ConfigMaps.

4.1. Create Kubernetes Secret for MQTT Credentials

apiVersion: v1
kind: Secret
metadata:
  name: mqtt-secret
type: Opaque
data:
  MQTT_USERNAME: cHJvZHVzZXI=       # 'produser' base64 encoded
  MQTT_PASSWORD: cHJvZHBhc3M=       # 'prodpass' base64 encoded

4.2. Create Kubernetes ConfigMap for MQTT Server URI

apiVersion: v1
kind: ConfigMap
metadata:
  name: mqtt-config
data:
  MQTT_SERVER_URI: tcp://mqtt-broker:1883
These Kubernetes resources store your MQTT configuration securely and make them accessible to your application.

5. Configuring application-prod.properties

Create a file named application-prod.properties in src/main/resources/ with the following content:
micronaut.application.name=mqtt-app
mqtt.client.server-uri=${MQTT_SERVER_URI}
mqtt.client.client-id=prod-client
mqtt.client.user-name=${MQTT_USERNAME}
mqtt.client.password=${MQTT_PASSWORD}
mqtt.client.clean-session=false
mqtt.client.automatic-reconnect=true
mqtt.client.keep-alive-interval=60
This configuration uses environment variables provided by Kubernetes to set up the MQTT client for production.

6. Deploying Micronaut Application to Kubernetes

When deploying your Micronaut application to Kubernetes, ensure the environment variables are correctly set using the previously created Secret and ConfigMap:
env:
  - name: MICRONAUT_ENVIRONMENTS
    value: prod
  - name: MQTT_SERVER_URI
    valueFrom:
      configMapKeyRef:
        name: mqtt-config
        key: MQTT_SERVER_URI
  - name: MQTT_USERNAME
    valueFrom:
      secretKeyRef:
        name: mqtt-secret
        key: MQTT_USERNAME
  - name: MQTT_PASSWORD
    valueFrom:
      secretKeyRef:
        name: mqtt-secret
        key: MQTT_PASSWORD
This setup ensures that your application retrieves the necessary configuration from Kubernetes resources during deployment.
By separating your MQTT configuration into application-dev.properties and application-prod.properties, you can maintain clean and secure environments for development and production. Utilizing Docker for local development and Kubernetes for production allows for scalable and manageable deployments.
Remember to:
  • Use Docker to run a local MQTT broker during development.
  • Store sensitive information like credentials in Kubernetes Secrets.
  • Use ConfigMaps for non-sensitive configuration data.
  • Reference these Kubernetes resources in your application's environment variables.
This approach provides a robust and flexible setup for integrating MQTT into your Micronaut applications across different environments.

image quote pre code