https://github.com/hamidfarmani/tiny-url-clone
A microservices-based URL shortening service with Spring Boot, including API Gateway, Eureka Discovery, Config Server, and distributed storage using Cassandra and PostgreSQL.
https://github.com/hamidfarmani/tiny-url-clone
apigateway configurationserver discovery-service microservice springboot
Last synced: 7 months ago
JSON representation
A microservices-based URL shortening service with Spring Boot, including API Gateway, Eureka Discovery, Config Server, and distributed storage using Cassandra and PostgreSQL.
- Host: GitHub
- URL: https://github.com/hamidfarmani/tiny-url-clone
- Owner: hamidfarmani
- Created: 2024-12-29T14:02:19.000Z (9 months ago)
- Default Branch: master
- Last Pushed: 2024-12-29T14:22:08.000Z (9 months ago)
- Last Synced: 2025-01-17T05:11:56.411Z (9 months ago)
- Topics: apigateway, configurationserver, discovery-service, microservice, springboot
- Language: Java
- Homepage:
- Size: 28.3 KB
- Stars: 1
- Watchers: 1
- Forks: 0
- Open Issues: 0
-
Metadata Files:
- Readme: README.md
Awesome Lists containing this project
README
# Tiny URL (clone) Microservices Project
## **Overview**
This project is a microservices-based implementation of a URL shortening service inspired by platforms like TinyURL. The architecture incorporates modern best practices for scalability, fault tolerance, and maintainability.### **Key Features**
- **URL Shortening**: Converts long URLs into short, easily shareable links.
- **Dynamic Service Discovery**: Services are registered and discovered dynamically via Eureka.
- **Centralized Configuration Management**: Uses Spring Cloud Config for centralized configuration.
- **Load Balancing**: API Gateway and service-to-service communication use load-balanced requests.
- **Key Management Service (KGS)**: Efficient generation and storage of unique keys for shortened URLs.
- **API Gateway**: A single entry point for all clients.---
## **Architecture**
The project follows a microservices architecture with the following components:### **1. API Gateway**
- Acts as the single entry point for all client requests.
- Handles routing to the appropriate services.
- Provides centralized logging, monitoring, and request transformation.### **2. Discovery Service (Eureka)**
- Manages service registration and discovery.
- Allows dynamic scaling of services without manual reconfiguration.### **3. Config Service**
- Centralized configuration management using Spring Cloud Config.
- Stores environment-specific configurations.### **4. Key Generation Service (KGS)**
- Generates unique keys for the URL shortening service.
- Uses a buffer and replenishment mechanism for efficient key management.
- Backed by a PostgreSQL database.### **5. URL Service**
- Handles URL creation, storage, and retrieval.
- Interacts with KGS to fetch unique keys.
- Uses Cassandra for scalable and efficient data storage.---
## **Tech Stack**
### **Backend**
- **Java 21**: For modern and efficient server-side development.
- **Spring Boot**: Framework for building microservices.
- **Spring Cloud**: For API Gateway, service discovery, and config management.
- **PostgreSQL**: Database for the KGS.
- **Cassandra**: Database for storing URLs.### **Infrastructure**
- **Docker**: Containerized deployment for all services.
- **Eureka**: Service discovery and registry.
- **Spring Cloud Config**: Centralized configuration management.### **Tools**
- **Feign**: For inter-service communication.
- **Load Balancer**: Built-in Spring Cloud load balancing for distributed services.
- **Virtual Threads**: Lightweight concurrency for key generation and replenishment.---
## **Getting Started**
### **1. Clone the Repository**
```bash
git clone https://github.com/hamidfarmani/tiny-url-clone.git
cd tiny-url-clone
```### **2. Prerequisites**
- **Java 21**
- **Docker** and **Docker Compose**
- **Maven**### **3. Build and Run Services**
#### **Build All Services**
```bash
mvn clean install
```#### **Run Using Docker Compose**
Ensure you have a `docker-compose.yml` file to start all services:
```bash
docker-compose up --build
```This will start:
- Eureka Discovery Service
- Config Service
- API Gateway
- KGS
- URL Service---
## **Service Details**
### **1. API Gateway**
- **Port**: `8084`
- **Base URL**: `http://:8084`
- **Endpoints**:
- `/kgs/**`: Routes requests to KGS.
- `/api/**`: Routes requests to URL Service.### **2. Discovery Service (Eureka)**
- **Port**: `8761`
- **Dashboard**: `http://localhost:8761`### **3. Config Service**
- **Port**: `8888`
- **Configuration Files Location**: `src/main/resources/configurations`
- **Default Config Endpoint**: `http://localhost:8888/{application}/{profile}`### **4. Key Generation Service (KGS)**
- **Port**: `8081`
- **Endpoints**:
- `GET /kgs/fetch`: Fetches a batch of unique keys.
- `GET /kgs/monitor/unused-keys/check`: Monitors unused keys.### **5. URL Service**
- **Port**: `8082`
- **Endpoints**:
- `POST /api/create`: Creates a new shortened URL.
- `GET /api/{shortUrl}`: Retrieves the original URL for a given short URL.---
## **Environment Variables**
### **Eureka Discovery Service**
- `EUREKA_INSTANCE_HOSTNAME`: Hostname of the Eureka server.### **Config Service**
- `SPRING_PROFILES_ACTIVE`: Active profile (e.g., `dev`, `prod`).### **KGS**
- `SPRING_DATASOURCE_URL`: JDBC URL for PostgreSQL.
- `SPRING_DATASOURCE_USERNAME`: Database username.
- `SPRING_DATASOURCE_PASSWORD`: Database password.### **URL Service**
- `SPRING_DATA_CASSANDRA_CONTACT_POINTS`: Cassandra cluster contact points.
- `SPRING_DATA_CASSANDRA_PORT`: Cassandra port.
- `SPRING_DATA_CASSANDRA_KEYSPACE_NAME`: Keyspace name.---
## **Development Notes**
### **1. Running Services Locally**
- Start Eureka first (`8761`), followed by Config Service (`8888`), and then the other services.
- Use `localhost` for development and update `/etc/hosts` if testing logical names.### **2. Testing API Gateway**
- Test API Gateway routing using:
```bash
curl http://localhost:8084/kgs/fetch?count=10
```### **3. Debugging Tips**
- Check Eureka Dashboard to verify service registrations.
- Use `docker logs ` to debug Docker services.---
## **Future Enhancements**
- Add user authentication and authorization.
- Implement rate limiting in API Gateway.
- Add telemetry for request tracking and usage analytics.
- Deploy services to Kubernetes for production scalability.---
## **Contributors**
- **Hamid Farmani** - [GitHub](https://github.com/hamidfarmani)Feel free to contribute by submitting issues or pull requests!