The MuleSoft template project is very useful for defining standards for designing Mule applications (xAPI, pAPI, sAPI) across your enterprise and used as a prototype to build similar applications with enterprise-defined standards, naming conventions, common reusable assets/dependencies and to share and reuse it across the organisation.
Key features
Defined enterprise-level standards across your API layers (xAPI, pAPI, sAPI):
a. JSON-Logger
b. Naming conventions
c. Property File structure (yaml/ properties) with predefined naming conventions/attributes
Usage of common artifacts/dependencies across all Mule applications
a. JSON-Logger
b. global-error-handler
c. repeated dependencies (ex: HTTP connector, socket connector, api-kit router etc.)
d. Domain projects (if anything for on-prem deployment)
Defined common configurations across API layer
a. Importing common properties ({mule.env}-dev.yaml , {mule.env}-secure.yaml)
b. Importing common HTTP requester configuration
Asset creation/configuration
1. Create a new project from Anypoint Studio
a. Project Name : mule-application-template-api
2. Define your artifactId, description in pom.xml
a. Define the below fields
i. groupId : << Your Org Business Grp Id >>
ii. artifactId and name as Project Name (ex: “mule-application-template-api”)
iii. Configuration — classifier in mule-maven-plugin as “mule-application-template”
<?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>
<groupId>72eb07d7–54ae-5c71–8b44–083d4de63cb7</groupId>
<artifactId>mule-application-template-api</artifactId>
<version>1.0.0</version>
<packaging>mule-application</packaging>
<name>mule-application-template-api</name>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<app.runtime>4.4.0</app.runtime>
<mule.maven.plugin.version>3.8.2</mule.maven.plugin.version>
</properties>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-clean-plugin</artifactId>
<version>3.2.0</version>
</plugin>
<plugin>
<groupId>org.mule.tools.maven</groupId>
<artifactId>mule-maven-plugin</artifactId>
<version>${mule.maven.plugin.version}</version>
<extensions>true</extensions>
<configuration>
<classifier>mule-application-template</classifier>
<! — deployment configuration →
</configuration>
</plugin>
</plugins>
</build>
<dependencies>
<dependency>
<groupId>org.mule.connectors</groupId>
<artifactId>mule-http-connector</artifactId>
<version>1.7.3</version>
<classifier>mule-plugin</classifier>
</dependency>
<dependency>
<groupId>org.mule.connectors</groupId>
<artifactId>mule-sockets-connector</artifactId>
<version>1.2.2</version>
<classifier>mule-plugin</classifier>
</dependency>
<dependency>
<groupId>org.mule.modules</groupId>
<artifactId>mule-apikit-module</artifactId>
<version>1.8.2</version>
<classifier>mule-plugin</classifier>
</dependency>
<dependency>
<groupId>com.mulesoft.connectors</groupId>
<artifactId>mule-amqp-connector</artifactId>
<version>1.6.0</version>
<classifier>mule-plugin</classifier>
</dependency>
<dependency>
<groupId>com.mulesoft.modules</groupId>
<artifactId>mule-secure-configuration-property-module</artifactId>
<version>1.2.7</version>
<classifier>mule-plugin</classifier>
</dependency>
<dependency>
<groupId>org.mule.connectors</groupId>
<artifactId>mule-jms-connector</artifactId>
<version>1.8.4</version>
<classifier>mule-plugin</classifier>
</dependency>
<dependency>
<groupId>72eb07d7–54ae-5c71–8b44–083d4de63cb7</groupId>
<artifactId>json-logger</artifactId>
<version>2.1.0</version>
<classifier>mule-plugin</classifier>
</dependency>
<dependency>
<groupId>72eb07d7–54ae-5c71–8b44–083d4de63cb7</groupId>
<artifactId>global-error-handler</artifactId>
<version>1.0.0</version>
<classifier>mule-plugin</classifier>
</dependency>
</dependencies>
<repositories>
<repository>
<id>anypoint-exchange-v3</id>
<name>Anypoint Exchange</name>
<url>https://maven.anypoint.mulesoft.com/api/v3/maven</url>
<layout>default</layout>
</repository>
<repository>
<id>mulesoft-releases</id>
<name>MuleSoft Releases Repository</name>
<url>https://repository.mulesoft.org/releases/</url>
<layout>default</layout>
</repository>
</repositories>
<pluginRepositories>
<pluginRepository>
<id>mulesoft-releases</id>
<name>MuleSoft Releases Repository</name>
<layout>default</layout>
<url>https://repository.mulesoft.org/releases/</url>
<snapshots>
<enabled>false</enabled>
</snapshots>
</pluginRepository>
</pluginRepositories>
<distributionManagement>
<! — Target Anypoint Organization Repository →
<repository>
<id>anypoint-exchange-v3</id>
<name>Anypoint Exchange v3 Repository</name>
<url>https://maven.anypoint.mulesoft.com/api/v3/organizations/${project.groupId}/maven</url>
<layout>default</layout>
</repository>
</distributionManagement>
</project>
3. Define dependencies in pom.xml
a. JSON-logger
b. global-error-handler (if any)
c. Common libraries (ex: HTTP, socket etc.)
4. Define global configuration (ex: global-config.xml)
<?xml version=”1.0” encoding=”UTF-8“?>
<mule xmlns:tls=”http://www.mulesoft.org/schema/mule/tls” xmlns:apikit=”http://www.mulesoft.org/schema/mule/mule-apikit“
xmlns:secure-properties=”http://www.mulesoft.org/schema/mule/secure-properties“
xmlns:api-gateway=”http://www.mulesoft.org/schema/mule/api-gateway” xmlns:error-handler-plugin=”http://www.mulesoft.org/schema/mule/error-handler-plugin” xmlns:json-logger=”http://www.mulesoft.org/schema/mule/json-logger” xmlns:os=”http://www.mulesoft.org/schema/mule/os” xmlns:http=”http://www.mulesoft.org/schema/mule/http” xmlns=”http://www.mulesoft.org/schema/mule/core” xmlns:doc=”http://www.mulesoft.org/schema/mule/documentation” xmlns:xsi=”http://www.w3.org/2001/XMLSchema-instance” xsi:schemaLocation=”http://www.mulesoft.org/schema/mule/core http://www.mulesoft.org/schema/mule/core/current/mule.xsd
http://www.mulesoft.org/schema/mule/http
http://www.mulesoft.org/schema/mule/http/current/mule-http.xsd
http://www.mulesoft.org/schema/mule/os
http://www.mulesoft.org/schema/mule/os/current/mule-os.xsd
http://www.mulesoft.org/schema/mule/json-logger http://www.mulesoft.org/schema/mule/json-logger/current/mule-json-logger.xsd
http://www.mulesoft.org/schema/mule/error-handler-plugin http://www.mulesoft.org/schema/mule/error-handler-plugin/current/mule-error-handler-plugin.xsd
http://www.mulesoft.org/schema/mule/api-gateway http://www.mulesoft.org/schema/mule/api-gateway/current/mule-api-gateway.xsd
http://www.mulesoft.org/schema/mule/secure-properties http://www.mulesoft.org/schema/mule/secure-properties/current/mule-secure-properties.xsd
http://www.mulesoft.org/schema/mule/mule-apikit http://www.mulesoft.org/schema/mule/mule-apikit/current/mule-apikit.xsd
http://www.mulesoft.org/schema/mule/tls
http://www.mulesoft.org/schema/mule/tls http://www.mulesoft.org/schema/mule/tls/current/mule-tls.xsd“>
<http:listener-config name=”httpListenerConfig”>
<http:listener-connection host=”0.0.0.0” port=”8081“>
</http:listener-connection>
</http:listener-config>
<configuration-properties doc:name=”Configuration properties” doc:id=”a7eb7eac-877c-47dc-b489–8f5e4d9df3b2” file=”properties\mule-application-template-${mule.env}.yaml” />
<api-gateway:autodiscovery apiId=”${api.autodiscovery}” ignoreBasePath=”true” doc:name=”API Autodiscovery” doc:id=”6a911920–6a3b-491d-9159-c10ea843f504” flowRef=”mule-application-template-api-main”/>
<http:request-config name=”examplePrc_HTTP_Request_configuration” doc:name=”HTTP Request configuration” doc:id=”558d644d-e758–4c58–843d-61a1d11e5f60” >
<http:request-connection protocol=”${example.prc.api.protocol}” host=”${example.prc.api.host}” port=”${example.prc.api.port}”>
<tls:context >
<tls:trust-store insecure=”true” />
</tls:context>
</http:request-connection>
<http:default-headers >
<http:default-header key=”client_id” value=”${secure::example.prc.api.client_id}” />
<http:default-header key=”client_secret” value=”${secure::example.prc.api.client_secret}” />
</http:default-headers>
</http:request-config>
<http:request-config name=”exampleSys_HTTP_Request_configuration” doc:name=”HTTP Request configuration” doc:id=”1e0e7fc9-f776–4e38–91e7–8ec7f7b81ff7” >
<http:request-connection protocol=”${example.sys.api.protocol}” host=”${example.sys.api.host}” port=”${example.sys.api.port}”>
<tls:context >
<tls:trust-store insecure=”true” />
</tls:context>
</http:request-connection>
<http:default-headers >
<http:default-header key=”client_id” value=”${secure::example.sys.api.client_id}” />
<http:default-header key=”client_secret” value=”${secure::example.sys.api.client_secret}” />
</http:default-headers>
</http:request-config>
<import doc:name=”Import” doc:id=”9bf9de97-e41d-4659-b100-d6b439f35be4” file=”global-error-handler.xml” />
<json-logger:config name=”JSON_Logger_Config” doc:name=”JSON Logger Config” doc:id=”4f8da8f2–6658–4cfd-9392–632e3a8f23b0” environment=”${mule.env}” />
<secure-properties:config name=”Secure_Properties_Config” doc:name=”Secure Properties Config” doc:id=”c23cd335-c0da-4d73-a07f-1c042c9731a9” file=”properties\mule-application-template-api-secure-${mule.env}.yaml” key=”${enc.key}” />
<configuration-properties doc:name=”Configuration properties” doc:id=”1b1a2b63-fb65–4aae-b51d-6f6fe105d146” file=”properties\common.yaml” />
</mule>
5. Environment related files: {mule.env}.yaml and {mule.env}-secure.yaml file-related configurations
a. mule-application-template-dev.yaml
json.logger:
application:
version: “v1”
name: “example-exp-api-dev”
Ex: Application owner can define protocol, host, port, etc.,
b. mule-application-template-secure-dev.yaml
Example.prc.api:
client_id: “![]”
client_secret: “![]”
example.sys.api:
client_id: “![]”
client_secret: “![]”
Ex: The application owner can define headers in a secure mode. Client id/Client Secret
6. Mule application template — skeleton : pictorial view
Asset publish activity
mvn clean deploy
Asset Status in the Anypoint Exchange (Asset is published in the Anypoint Exchange).
We will now use this Mule template project to create a new Mule project (Mule Application: example-exp-api).
Project creation/configuration
a. Open Anypoint Studio
b. Click New > File > project from Template.
Note: It may ask for your organisation’s login credentials for the Anypoint Platform if not logged in.
c. Application owner can search the existing mule template (ex: mule-application-template-api)
d. Click Open, and the Project will appear in your Anypoint Studio.
e. Mule application owner can rename the project and files as per requirements.
f. Save the current project (ex: example-exp-api) and perform deployment for further testing.
g. Application owner can directly test /healthcheck endpoint from POSTMAN or Internet browser. Note: please ensure you are using the correct URL for your test.
Conclusion
This will be useful for green field implementation or re-designing your APIs to standardise application format, consistency, adhering to naming standards, reducing efforts for API governance, quick implementation, and Demo/PoC for API-led connectivity on the MuleSoft Anypoint Platform.