diff --git a/libraries-rpc/pom.xml b/libraries-rpc/pom.xml
new file mode 100644
index 0000000000..8741a41062
--- /dev/null
+++ b/libraries-rpc/pom.xml
@@ -0,0 +1,35 @@
+
+
+ 4.0.0
+ libraries-rpc
+ libraries-rpc
+ jar
+
+
+ com.baeldung
+ parent-modules
+ 1.0.0-SNAPSHOT
+
+
+
+
+ com.twitter
+ finagle-core_2.13
+ ${finagle.core.version}
+
+
+ com.twitter
+ finagle-http_2.13
+ ${finagle.http.version}
+
+
+
+
+
+ 20.4.0
+ 20.4.0
+
+
+
+
diff --git a/libraries-rpc/src/main/java/com/baeldung/rpc/finagle/GreetingService.java b/libraries-rpc/src/main/java/com/baeldung/rpc/finagle/GreetingService.java
new file mode 100644
index 0000000000..7f3d741f94
--- /dev/null
+++ b/libraries-rpc/src/main/java/com/baeldung/rpc/finagle/GreetingService.java
@@ -0,0 +1,18 @@
+package com.baeldung.rpc.finagle;
+
+import com.twitter.finagle.Service;
+import com.twitter.finagle.http.Request;
+import com.twitter.finagle.http.Response;
+import com.twitter.finagle.http.Status;
+import com.twitter.io.Buf;
+import com.twitter.io.Reader;
+import com.twitter.util.Future;
+
+public class GreetingService extends Service {
+ @Override
+ public Future apply(Request request) {
+ String greeting = "Hello " + request.getParam("name");
+ Reader reader = Reader.fromBuf(new Buf.ByteArray(greeting.getBytes(), 0, greeting.length()));
+ return Future.value(Response.apply(request.version(), Status.Ok(), reader));
+ }
+}
diff --git a/libraries-rpc/src/main/java/com/baeldung/rpc/finagle/LogFilter.java b/libraries-rpc/src/main/java/com/baeldung/rpc/finagle/LogFilter.java
new file mode 100644
index 0000000000..7fc5440016
--- /dev/null
+++ b/libraries-rpc/src/main/java/com/baeldung/rpc/finagle/LogFilter.java
@@ -0,0 +1,22 @@
+package com.baeldung.rpc.finagle;
+
+import com.twitter.finagle.Service;
+import com.twitter.finagle.SimpleFilter;
+import com.twitter.finagle.http.Request;
+import com.twitter.finagle.http.Response;
+import com.twitter.util.Future;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public class LogFilter extends SimpleFilter {
+
+ private static final Logger logger = LoggerFactory.getLogger(LogFilter.class);
+
+ @Override
+ public Future apply(Request request, Service service) {
+ logger.info("Request host:" + request.host().getOrElse(() -> ""));
+ logger.info("Request params:");
+ request.getParams().forEach(entry -> logger.info("\t" + entry.getKey() + " : " + entry.getValue()));
+ return service.apply(request);
+ }
+}
diff --git a/libraries-rpc/src/main/resources/logback.xml b/libraries-rpc/src/main/resources/logback.xml
new file mode 100644
index 0000000000..7d900d8ea8
--- /dev/null
+++ b/libraries-rpc/src/main/resources/logback.xml
@@ -0,0 +1,13 @@
+
+
+
+
+ %d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/libraries-rpc/src/test/java/com/baeldung/rpc/finagle/FinagleIntegrationTest.java b/libraries-rpc/src/test/java/com/baeldung/rpc/finagle/FinagleIntegrationTest.java
new file mode 100644
index 0000000000..8dcdb19e7e
--- /dev/null
+++ b/libraries-rpc/src/test/java/com/baeldung/rpc/finagle/FinagleIntegrationTest.java
@@ -0,0 +1,40 @@
+package com.baeldung.rpc.finagle;
+
+import com.twitter.finagle.Http;
+import com.twitter.finagle.Service;
+import com.twitter.finagle.http.Method;
+import com.twitter.finagle.http.Request;
+import com.twitter.finagle.http.Response;
+import com.twitter.util.Await;
+import com.twitter.util.Future;
+import org.junit.Test;
+import scala.runtime.BoxedUnit;
+
+import static org.junit.Assert.assertEquals;
+
+public class FinagleIntegrationTest {
+ @Test
+ public void givenServerAndClient_whenRequestSent_thenClientShouldReceiveResponseFromServer() throws Exception {
+ // given
+ Service serverService = new LogFilter().andThen(new GreetingService());
+ Http.serve(":8080", serverService);
+
+ Service clientService = new LogFilter().andThen(Http.newService(":8080"));
+
+ // when
+ Request request = Request.apply(Method.Get(), "/?name=John");
+ request.host("localhost");
+ Future response = clientService.apply(request);
+
+ // then
+ Await.result(response
+ .onSuccess(r -> {
+ assertEquals("Hello John", r.getContentString());
+ return BoxedUnit.UNIT;
+ })
+ .onFailure(r -> {
+ throw new RuntimeException(r);
+ })
+ );
+ }
+}
diff --git a/pom.xml b/pom.xml
index f750ea8869..89ac3534b6 100644
--- a/pom.xml
+++ b/pom.xml
@@ -509,6 +509,7 @@
libraries-http-2
libraries-io
libraries-primitive
+ libraries-rpc
libraries-security
libraries-server
libraries-testing