Red Hat Fuse is an Open Source Integration platform which provide a very agile and lightweight artifact, which make it very suitable for a microservice deployment. And in this sample, im going to deploy Fuse on top of Red Hat OpenShift Container Platform.
First as always, we need to create a simple pom file. In here im using the latest version of Fuse. And that is 7.9.
<?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">
<modelVersion>4.0.0</modelVersion>
<groupId>com.edw</groupId>
<artifactId>hello-world-fuse-on-ocp</artifactId>
<version>1.0-SNAPSHOT</version>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<fuse.version>7.9.0.fuse-sb2-790065-redhat-00001</fuse.version>
<spring-boot.version>2.1.4.RELEASE-redhat-00001</spring-boot.version>
</properties>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.jboss.redhat-fuse</groupId>
<artifactId>fuse-springboot-bom</artifactId>
<version>${fuse.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<dependencies>
<dependency>
<groupId>org.apache.camel</groupId>
<artifactId>camel-spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<dependency>
<groupId>org.apache.camel</groupId>
<artifactId>camel-http-starter</artifactId>
</dependency>
<dependency>
<groupId>org.apache.camel</groupId>
<artifactId>camel-servlet-starter</artifactId>
</dependency>
</dependencies>
<build>
<pluginManagement>
<plugins>
<plugin>
<groupId>org.jboss.redhat-fuse</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<version>${fuse.version}</version>
</plugin>
</plugins>
</pluginManagement>
<plugins>
<plugin>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>8</source>
<target>8</target>
</configuration>
</plugin>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<version>${spring-boot.version}</version>
<executions>
<execution>
<goals>
<goal>repackage</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
</project>
Create a main class,
package com.edw;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
Create its route,
package com.edw.routes;
import org.apache.camel.Exchange;
import org.apache.camel.builder.RouteBuilder;
import org.springframework.stereotype.Component;
@Component
public class HelloWorldRoute extends RouteBuilder {
@Override
public void configure() throws Exception {
rest()
.get("hello")
.route()
.setHeader(Exchange.HTTP_RESPONSE_CODE, simple("200"))
.setHeader(Exchange.CONTENT_TYPE, simple("application/json"))
.setBody(constant("{\"hello\":\"world\"}"))
.endRest()
;
}
}
Set application.properties for our application’s configuration. One of the most important is settingup Camel’s context path for serving API endpoints.
# The Camel context name camel.springboot.name=hello-world-fuse-on-ocp # enable all management endpoints endpoints.enabled=true management.security.enabled=false camel.component.servlet.mapping.contextPath=/api/* logging.level.root=info
And a settings.xml file for providing Red Hat repository location,
<?xml version="1.0"?>
<settings>
<profiles>
<profile>
<id>extra-repos</id>
<activation>
<activeByDefault>true</activeByDefault>
</activation>
<repositories>
<repository>
<id>central</id>
<url>https://repo1.maven.org/maven2</url>
<releases>
<enabled>true</enabled>
</releases>
<snapshots>
<enabled>false</enabled>
</snapshots>
</repository>
<repository>
<id>redhatga</id>
<name>Enterprise Releases</name>
<url>https://maven.repository.redhat.com/ga</url>
</repository>
<repository>
<id>redhatearly</id>
<name>Enterprise Releases</name>
<url>https://maven.repository.redhat.com/earlyaccess/all</url>
</repository>
</repositories>
<pluginRepositories>
<pluginRepository>
<id>central</id>
<url>https://repo1.maven.org/maven2</url>
<releases>
<enabled>true</enabled>
</releases>
<snapshots>
<enabled>false</enabled>
</snapshots>
</pluginRepository>
<pluginRepository>
<id>redhatga</id>
<name>Enterprise Releases</name>
<url>https://maven.repository.redhat.com/ga</url>
</pluginRepository>
<pluginRepository>
<id>redhatearly</id>
<name>Enterprise Releases</name>
<url>https://maven.repository.redhat.com/earlyaccess/all</url>
</pluginRepository>
</pluginRepositories>
</profile>
</profiles>
</settings>
Execute below command to run on our local,
$ mvn spring-boot:run -s settings.xml
And run curl to see whether our application’s endpoint is ready to accept request or not,
$ curl -kv http://localhost:8080/api/hello
* Trying ::1:8080...
* TCP_NODELAY set
* Connected to localhost (::1) port 8080 (#0)
> GET /api/hello HTTP/1.1
> Host: localhost:8080
> User-Agent: curl/7.65.0
> Accept: */*
>
* Mark bundle as not supporting multiuse
< HTTP/1.1 200
< accept: */*
< breadcrumbId: 123
< user-agent: curl/7.65.0
< Content-Type: application/json
< Transfer-Encoding: chunked
< Date: Tue, 17 Aug 2021 14:21:05 GMT
<
* Connection #0 to host localhost left intact
{"hello":"world"}
Once we are confident that the code is working, we can deploy it to Openshift Container Platform by using below command.
oc new-app registry.access.redhat.com/ubi8/openjdk-8~https://github.com/edwin/hello-world-fuse-on-ocp
Full code for this sample can be downloaded on below link.
https://github.com/edwin/hello-world-fuse-on-ocp
Thanks for reading and dont forget to have fun using Fuse.