GRPC Server is a Go application that integrates a gRPC (Google Remote Procedure Calls) server with Gateway for REST API, Kafka messaging, Jaeger distributed tracing, and the zgo.uber.org/zap
logger.
- Introduction
- Prerequisites
- Installation
- Usage
- API Endpoints
- Distributed Tracing with Jaeger
- Linting and Code Quality
- Testing
- Contributing
- License
The GRPC Server is a Go application that provides a gRPC server with a REST API gateway, Kafka messaging, Jaeger distributed tracing, and the zgo.uber.org/zap logger. It allows you to build scalable and high-performance server applications using the gRPC framework while also providing REST API compatibility. Kafka messaging enables asynchronous communication and decoupling of components, and Jaeger distributed tracing helps monitor and identify performance issues in a distributed system. The zgo.uber.org/zap logger ensures efficient logging with minimal impact on performance.
Before running this application, ensure that you have the following prerequisites installed:
- Go: Install Go
- Docker: Install Docker
- Docker Compose: Install Docker Compose
- Clone this repository
git clone https://github.com/kemalkochekov/GRPC-Server.git
- Navigate to the project directory:
cd GRPC-Server
- Build the Docker image:
docker-compose build
- Start the Docker containers:
docker-compose up
- The application will be accessible at:
localhost:8080/v1
- Method: GET
- Endpoint: /entity
- Query Parameter: id=[entity_id]
Retrieve data from the database based on the provided ID.
- Response:
- 200 OK: Returns the data in the response body.
- 400 Bad Request: If the
id
query parameter is missing. - 404 Not Found: If the provided ID does not exist in the database.
- 500 Internal Server Error: If there is an internal server error.
- Method: POST
- Endpoint: /entity
- Request Body: JSON payload containing the ID and data.
Add new data to the database.
- Response:
- 200 OK: If the request is successful.
- 500 Internal Server Error: If there is an internal server error.
- Method: DELETE
- Endpoint: /entity
- Query Parameter: id=[entity_id]
Remove data from the database based on the provided ID.
- Response:
- 200 OK: If the request is successful.
- 404 Not Found: If the provided ID does not exist in the database.
- 500 Internal Server Error: If there is an internal server error.
- Method: PUT
- Endpoint: /entity
- Request Body: JSON payload containing the ID and updated data.
Update existing data in the database based on the provided ID.
- Response:
- 200 OK: If the request is successful.
- 404 Not Found: If the provided ID does not exist in the database.
- 500 Internal Server Error: If there is an internal server error.
For detailed API documentation, including examples, request/response structures, and authentication details, please refer to the
This project integrates with Jaeger for distributed tracing. Jaeger allows you to trace the flow of requests across multiple services, providing insights into performance and identifying bottlenecks in the system.
To view the traces, access the Jaeger UI at:
http://localhost:16686/
For more information on how to use Jaeger for distributed tracing in Go, refer to the Jaeger Go client documentation.
This project maintains code quality using golangci-lint
, a fast and customizable Go linter. golangci-lint
checks for various issues, ensures code consistency, and enforces best practices, helping maintain a clean and standardized codebase.
To install golangci-lint
, you can use brew
:
brew install golangci-lint
- Configuration:
After installing golangci-lint, create or use a personal configuration file (e.g., .golangci.yml) to define specific linting rules and settings:
golangci-lint run --config=.golangci.yml
This command initializes linting based on the specified configuration file.
- Run the linter:
Once configuration is completed, you can execute the following command at the root directory of your project to run golangci-lint:
golangci-lint run
This command performs linting checks on your entire project and provides a detailed report highlighting any issues or violations found.
- Customize Linting Rules:
You can customize the linting rules by modifying the .golangci.yml file.
For more information on using golangci-lint, refer to the golangci-lint documentation.
- To run unit tests, use the following command:
go test ./... -cover
- To run integration tests, use the following command:
go test -tags integration ./... -cover
Contributions are welcome! If you would like to contribute to this project, please follow these steps:
- Fork the repository.
- Create a new branch for your feature/fix:
- Make your changes and commit them.
git checkout -b feature/your-feature-name
- Push your branch to your forked repository.
- Create a pull request from your branch to the main repository.
This project is licensed under the MIT License.