Spring Cloud RPC transport - spring-cloud

Almost every spring-cloud guide suggests Ribbon with Feign for RPC.
I wonder why Http Rest takes precedence over binary transport protocol for inner micro-services communication behind the API gateway?
What are the binary alternatives to http that support async invocation and all great features that Netflix OSS provides ? (auto-discovery, load-balancing, circuit breaker, retry policy etc.)
Thanks

There is nothing preventing you from using binary RPC like thrift or protobuffs or msgpack with spring cloud. You can use LoadBalancerClient.choose(<serviceId>) to get a host and port you could supply to any network client. Our integrations were the simple rest clients.
Here is a guide that integrates Spring MVC with google protocol buffers.

Related

Does API-gateway use to facilitate the rest API to communicate with micro-services?

I am developing a website using which is based on a microservices architecture which is containerized with docker. Now I want to communicate with microservices using rest API. I read some articles which show some diagrams that API gateway make some connections to microservices. I am confused about the main purpose of the API gateway.
Gateways are used for cross cutting concerns like authentication, logging and redirect to respective backend services. They are usual the single point of entry for applications and are exposed publicly. the rest of the services can sit behind the firewall that your gateway has access to making backend services secure. you also write your resiliency logic in the gateway by implementing retry or circuit breaker patterns etc.
Since gateway has advantages but it can be single point of failure. so make sure it's highly available by deploying redundant copies

How to use http2 in Feign for better performance RPC?

A new project consider use Spring Cloud build micro service. But we have many inner RPC call within services.
For performance, how to upgrade Feign support http2?
There are gRPC has give a great example for high performance by http2 but our project based on JVM and Feign and relative annotation is good enough for interface definition.
So, I'm first consider Feign support http2 without SSL to speed up RPC.
Hope there are benchmark on http2 if someone has done.
Thanks.
To use http/2 with feign you just need to replace the Http client Bean with a client that prefers http/2.
With default HttpClient (as opposed to OkHttp), you can just add this as a bean, and feign should use it, or you can build it into the feignClient:
HttpClient client = HttpClient.newBuilder()
.version(Version.HTTP_2)
.build();
ref: https://openjdk.java.net/groups/net/httpclient/intro.html
The OkHttp Client may have http/2
I think you would also have to enable http/2 on the server with:
server.http2.enabled: true
This should allow it to receive incoming requests with http/2.
https://docs.spring.io/spring-boot/docs/current/reference/html/application-properties.html#application-properties.server.server.http2.enabled

Spring cloud ingestion layer (API Gateway for protocol transformations)

I am looking for an open source API Gateway that can do protocol transformations (Spring Cloud offers Zuul but it accepts only REST connections and does not do protocol transformations). Any idea (or clever solution) given that most of the following protocols must be supported?
CoAP
AMQP
MQTT (must be supported)
STOMP
REST (must be supported)
Sine the next hop after the API Gateway, I was thinking Spring Cloud Stream with custom inbound/outbound adapters. There is also the Spring Cloud Data Flow but I think that is it a different beast.
PS: Oracle API Gateway seems to support multiple protocols but I am looking for an open source solution.

IMS as RESTful WebService Consumer

We need to expose IMS as RESTful webservice consumer. I had referred a document "Creating a RESTful Web Service for IMS-Transaction" by Ivy Ho, which talks about exposing IMS as RESTful webservice provider. In that document they selected an OUTBOUND adapter option while creating an J2C bean(Page Num 4), which makes the data to be passed from application to adapter. Is it possible if I opted INBOUND adapter which makes the data to be passed in to the application from the adapter, will it help me to expose IMS as RESTful consumer.
If any proven methods are available, to expose our application as RESTful webservice consumer, kindly share the same ?
Is it possible in the SOAP GATEWAY server to handle REST calls of the client application. So my core application can consume the REST response of client application after the data mapping in the SOAP GATEWAY server.
Kindly share your views and thoughts. Thanks in advance.
The recommended route for your IMS application to consume an external REST service would be through the API Requester function for z/OS Connect EE. The following link provides a step by step guide for doing exactly what you want: https://www.ibm.com/support/knowledgecenter/en/SS4SVW_3.0.0/com.ibm.zosconnect.doc/scenarios/ims_apiReq_intro.html
The reason this would be recommended is it funnels all outbound calls through a single gateway which can be monitored, modified, and updated without affecting your applications.
SOAP Gateway will not be able to handle REST calls. I suggest looking into IMS Mobile Feature pack which is a restful endpoint for IMS.
IMS Mobile Feature Pack Description:
This feature provides a RESTful endpoint for mobile services to access back-end IMS resources through IMS Connect. A data transformation module is included that converts request and response messages between JSON and the native representation of the input and output messages. Tooling support for modeling, creating, testing, and managing services is provided through IMS Enterprise Suite Explorer for Development.
reference:
https://developer.ibm.com/wasdev/downloads/#asset/features-com.ibm.ims.imsmobile-1.0
https://developer.ibm.com/wasdev/downloads/#asset/features-com.ibm.ims.imsmobile-2.0

Is middleware needed for a REST service to be consumed?

There is an external web-service (REST based) which provides logistics service. In order to consume it from our application (which is java stack), I created a client library (using jersey and jackson, which is a self-contained jar file, and gives simple getters and setters to work with). All that is needed to consume this REST service is this jar file (which is being used as re-usable asset).
However, one of our clients asked, "since we already have ESB (a middleware from IBM) for our existing integrations, why can we not have this integration also through ESB ?"
Is it possible to consume the REST based service using a middleware such as ESB(or MQ) ? If so, how ?
Will it be wise to do it ?
What arguments can I posit to my client to tell them this may not work ?
Thanks.
Is it possible to consume the REST based service using a middleware such as ESB(or MQ) ? If so, how ? -
Yes. Every ESB has its syntax/APIs. Should not be difficult to understand if you are already working with REST/http requests. Note, MQ is a message broker that will allow asynchronous communication. For example, the application that wants to consume the REST service can send a message to the broker and not wait for a response from the external service. The message broker in turn can talk REST to the external service. The message broker might expose a REST interface to consume messages. But it all depends on the use case. You may want to call REST service synchronously.
Most ESBs support calling external web services REST/SOAP. So an ESB does not necessarily mean MQ.
Will it be wise to do it ?
It depends. Many organizations set up ESB/Gateway as a policy and to route/filter/govern all external routings. Also to manage load, HA etc.
What arguments can I posit to my client to tell them this may not work ?
It will most certainly work. You should assess if using an ESB is an overhead based on your requirements.