Implementing a Lightweight Service Registry with Eureka for Task Distribution
This article describes how to build a lightweight service registry using Eureka Server that also acts as a client, enabling a task dispatcher to discover and load‑balance task executor instances without deploying a separate registry, including Maven dependencies, Spring annotations, Feign client definitions, and troubleshooting steps.
The author presents a practical scenario where a leader requires two services—Task Distribution Center and Task Executor—to support horizontal scaling, but the deployment environment cannot host a separate registration center. The solution is to implement a simplified registration center by integrating Eureka Server directly into the task distribution center, allowing it to also function as a client.
Requirement Overview
Service discovery: store and manage addresses of all available services.
Service registration: providers register their address information.
Health check: periodically verify service availability.
Horizontal expansion: ensure high availability and consistent service lists across nodes.
To avoid deploying a full‑blown registry like Nacos, the author chooses Eureka for its simplicity and familiarity.
Implementation Steps
1. Add Maven Dependency
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>2. Enable Eureka Server, Eureka Client and OpenFeign
@SpringBootApplication
@EnableEurekaServer
@EnableEurekaClient
@EnableFeignClients
public class TaskDispatcherApplication {
public static void main(String[] args) {
SpringApplication.run(TaskDispatcherApplication.class, args);
}
}3. Define Feign Client for Task Executor
@FeignClient("TASK-EXECUTOR")
public interface TaskExecutorService {
@GetMapping("task/exec")
String exec(@RequestParam("taskId") Long taskId);
}4. Implement Dispatch Logic
@GetMapping("dispatch")
public String dispatch(Long jobId) {
LOGGER.info("Received job [jobId={}]", jobId);
List<Long> taskIds = Arrays.asList(123L, 666L, 888L, 999L);
for (Long taskId : taskIds) {
String result = taskExecutorService.exec(taskId);
LOGGER.info("Task [{}] result: {}", taskId, result);
}
return "success";
}Initially the request returned HTTP 500 because the load balancer could not find any instance of TASK-EXECUTOR. The root cause was the configuration property fetch-registry=false, which prevented the Eureka client from pulling service instances. Setting it to true resolved the issue.
After correcting the configuration, both task-dispatcher and task-executor start successfully. Sample logs show the dispatcher splitting a job into four tasks and invoking each executor, while the executor logs the receipt and completion of each task.
Running multiple instances of task-executor demonstrates load‑balancing across services.
Summary
It is recommended to deploy a registration center separately from business code. Eureka Server can act as both server and client, though this is not the best practice.
Experimentation is essential; trying out unconventional approaches can reveal viable solutions.
Signed-in readers can open the original source through BestHub's protected redirect.
This article has been distilled and summarized from source material, then republished for learning and reference. If you believe it infringes your rights, please contactand we will review it promptly.
Architect's Guide
Dedicated to sharing programmer-architect skills—Java backend, system, microservice, and distributed architectures—to help you become a senior architect.
How this landed with the community
Was this worth your time?
0 Comments
Thoughtful readers leave field notes, pushback, and hard-won operational detail here.
