Skip to main content

How to communicate two microservices with different ports?

 When two microservices need to communicate with each other but are running on different ports, there are a few approaches :

  1. 1.Direct Communication: If the microservices are deployed on the same network or infrastructure, they can communicate directly using their network addresses. You can use HTTP or any other appropriate protocol for communication. In this approach, each microservice would need to know the network address (IP address or domain name) and the port of the other microservice.

  2. Example:

  3. Microservice A running on port 8080 wants to communicate with Microservice B running on port 9090. Microservice A can make an HTTP request to Microservice B using its network address and port:

  4. HttpClient client = HttpClient.newHttpClient(); HttpRequest request = HttpRequest.newBuilder() .uri(URI.create("http://localhost:9090/api/resource")) .build(); HttpResponse<String> response = client.send(request, HttpResponse.BodyHandlers.ofString());


  5. 2.Service Discovery: Service discovery is a mechanism that allows microservices to locate and communicate with each other dynamically. Instead of hardcoding network addresses, you can utilize a service registry (e.g., Consul, Eureka, or ZooKeeper) that keeps track of available services and their network locations. Microservices can register themselves with the service registry upon startup and discover other services when needed. The service registry acts as a central point for service discovery, enabling communication between microservices regardless of their ports.

  6. Example : Microservice A and Microservice B register themselves with a service registry (e.g., Consul). When Microservice A needs to communicate with Microservice B, it queries the service registry to discover the network address and port of Microservice B dynamically:

// Pseudo code for service discovery using Consul
String serviceUrl = consulClient.lookupServiceUrl("microservice-b");
// Use serviceUrl for communication

  1. 3.API Gateway: An API gateway acts as an entry point for clients and can also help in communication between microservices. You can configure the API gateway to route requests to the appropriate microservice based on the request path or other criteria. This way, the microservices can run on different ports, but clients communicate with a single endpoint provided by the API gateway. The API gateway handles the routing and forwarding of requests to the appropriate microservice.

  2. Example:

  3. Microservice A and Microservice B run on different ports, but they are exposed through an API gateway running on port 8080. Clients make requests to the API gateway, which routes the requests to the appropriate microservice:

  4. // Request from the client to the API gateway (running on port 8080) GET http://localhost:8080/microservice-a/api/resource

The API gateway handles the request and forwards it to Microservice A running on a different port.

  1. 4.Message Queue/Message Broker: Another approach is to use a message queue or message broker system like Apache Kafka or RabbitMQ. Microservices can communicate by publishing messages to a specific topic or queue, and the receiving microservice can consume those messages from the queue. The message broker acts as an intermediary, decoupling the communication between microservices. Each microservice would need to connect to the message broker using its own port, and the broker takes care of routing messages between them.

  2. Example :

  3. Microservice A and Microservice B communicate through a message broker (e.g., Apache Kafka). Microservice A produces a message to a specific topic, and Microservice B consumes messages from that topic:


  4. // Microservice A (producer) kafkaProducer.send(new ProducerRecord<>("my-topic", "message")); // Microservice B (consumer) ConsumerRecords<String, String> records = kafkaConsumer.poll(Duration.ofMillis(100)); for (ConsumerRecord<String, String> record : records) { // Process the received message }


The choice of approach depends on factors such as the complexity of your microservices architecture, scalability requirements, and specific use cases. Consider the characteristics of your system and select the most suitable approach for your scenario.

Comments

Popular posts from this blog

JDK 25: The new features in Java 25

 Java Development Kit (JDK) 25, scheduled for release in September 2025, is set to introduce several significant enhancements. Here's an overview of the notable features: 1. Stable Values API (Preview): This feature introduces stable values—objects holding immutable data treated as constants by the Java Virtual Machine (JVM). By allowing greater flexibility in initialization timing compared to final fields, stable values aim to improve application startup times. They enable performance optimizations akin to constant-folding, previously exclusive to JDK code, and ensure thread-safe, single-time initialization. This decouples the creation of stable values from their initialization without significant performance penalties.  2. Removal of 32-bit x86 Port: JDK 25 plans to eliminate both the source code and build support for the 32-bit x86 port, which was deprecated in JDK 24. Maintaining this port has become less beneficial, especially with the challenges in keeping it updated wit...

How to parse JSON with date field in Java - Jackson @JsonDeserialize Annotation Example

How to Parse JSON with Date Field in Java - Jackson `@JsonDeserialize` Annotation Example Parsing JSON in Java is a common task, but dealing with date fields requires a little extra attention. JSON treats everything as a string, but Java has strong typing, meaning dates need to be handled differently. In this post, we will see how to parse a JSON with a date field using Jackson, focusing on the `@JsonDeserialize` annotation. Example Scenario Let’s assume we have a simple JSON that includes a date field: ``` {   "name": "John Doe",   "birthDate": "2024-09-05" } ``` In Java, we might want to map this to a class with a `LocalDate` for `birthDate`. This is where Jackson's `@JsonDeserialize` annotation comes into play. Step-by-Step Example Step 1: Add Jackson Dependency First, make sure you have the Jackson dependency in your `pom.xml` if you’re using Maven: ``` <dependency>     <groupId>com.fasterxml.jackson.core</groupId>     ...

How does a hash map work internally in Java?

Hash map work internally in Java Basically, HashMap is an array of Entry class, a static inner class defined in HashMap is as below: static class Entry implements Map. Entry  { final K key; V value; Entry next; final int hash; //getters and setters } Each element in Hashmap stores in it a key, its value, a reference to next entry in case hash value is the same for two entries, in that case, a linked list will be formed. Default initial capacity of a HashMap is 16 i.e a HashMap is initialized with a default 16 sized array. Now, let us see what happens when we put an element into HashMap. Following is the code for put method in hashmap: public V put(K key, V value) { if (key == null) return putForNullKey(value); int hash = hash(key.hashCode()); int i = indexFor(hash, table.length); for (Entry e = table[i]; e != null; e = e.next) { Object k; if (e.hash == hash && ((k = e.key) == key || key.equals(k))) { V oldValue = e.value; e....