Proje, IP adresine göre kişilerin bulunduğu yeri tespit eden bir servis olarak tasarlanmıştır. Aşağıda proje yapısı, paketler ve özet açıklamalar yer almaktadır:
Proje, temiz ve düzenli bir yapıda geliştirilmiştir. Ana proje klasörü location-by-ip olarak adlandırılmıştır ve aşağıdaki alt klasörleri içermektedir:
- src: Projenin kaynak kodlarını içeren klasördür.
- asset: MMDB dosyasını içeren klasör, projenin çalışması için gereklidir.
- main: Ana uygulama kaynak kodları bu klasörde yer alır.
- java: Java kaynak kodları bu klasör altında bulunur.
- com.hpoyraz.locationbyip: Java paketi, uygulama sınıflarını içerir.
- controller: API endpoint'ini tanımlayan controller sınıfı burada bulunur. Bu paket, uygulamanın API'larını yönetmek ve gelen istekleri işlemek için kullanılır.
- exception: Bu paket, özel hataları tanımlamak ve fırlatmak için kullanılır.
- model: Konum bilgilerini temsil eden model sınıfı burada yer alır.
- service: Bu paket, iş mantığına sahip olan ana bileşenlerin yer aldığı pakettir.
- impl: Gerçek iş mantığının uygulandığı paket.
- interfaces: Servis arabirimlerinin tanımlandığı paket.
- util: Yardımcı fonksiyonların bulunduğu pakettir.
- constants: Sabit verilerin ve yapılandırmaların yer aldığı paket.
- com.hpoyraz.locationbyip: Java paketi, uygulama sınıflarını içerir.
- resources: Bu klasörde, farklı ortamlar için yapılandırma dosyaları yer almaktadır.
- application.yml: Genel yapılandırma ayarları burada yer alır. Bu dosya, tüm ortamlar için varsayılan yapılandırmaları içerir.
- application-dev.yml: Geliştirme (development) ortamı için yapılandırma ayarlarını içerir.
- application-prod.yml: Üretim (production) ortamı için yapılandırma ayarlarını içerir. Bu dosya, canlı üretim sunucusunda çalışan uygulama için yapılandırma ayarlarını içerir.
- logback-spring.xml: Logback kütüphanesini kullanarak uygulamanın günlükleme (logging) yapılandırmasını tanımlar.
- java: Java kaynak kodları bu klasör altında bulunur.
- test: Ana uygulama kaynak kodlarına ait testler bu klasörde yer alır.
- java: Java kaynak kodları bu klasör altında bulunur.
- com.hpoyraz.locationbyip: Java paketi, uygulama test sınıflarını içerir.
- service: Konum bilgilerini elde eden servis sınıfına ait unit test sınıfı bu klasör altında bulunur.
- com.hpoyraz.locationbyip: Java paketi, uygulama test sınıflarını içerir.
- java: Java kaynak kodları bu klasör altında bulunur.
- Dockerfile: Docker imajının nasıl oluşturulacağını belirten dosyadır. Projenin bağımlılıkları ve çalıştırılacak JAR dosyası tanımlanır.
- docker-compose.yml: Docker Compose dosyasıdır ve location Docker container'ının tanımlandığı dosyadır. Proje içindeki servisin nasıl çalışacağı ve yapılandırmaları burada belirtilmiştir.
- pom.xml: Projenin Maven proje tanımlama dosyasıdır. Bağımlılıklar ve yapılandırma bu dosyada belirtilir.
-
Java 17: Java programlama dilinin ileri bir sürümüdür ve geliştiricilere daha güçlü ve verimli bir dil deneyimi sunar. Yeni özellikler ve iyileştirmelerle doludur ve performans açısından da geliştirmeler içerir.
-
Spring Boot (Versiyon: 2.5.3): Spring Boot, Spring ekosistemini kullanarak hızlı ve basit şekilde web uygulamaları, mikro hizmetler ve RESTful API'ler oluşturmayı kolaylaştıran bir framework'tür. Spring Boot, otomatik yapılandırma ve hazır özellikler sağlayarak geliştirme sürecini hızlandırır ve geliştiricilere kod tekrarını önlemeye odaklanmalarına olanak tanır.
-
MaxMind GeoIP2 (Versiyon: 4.0.1): MaxMind GeoIP2, IP adresine dayalı konum bilgilerini elde etmek için kullanılan bir kütüphanedir. GeoIP2 veritabanı kullanılarak IP adreslerini ülkeler, şehirler, coğrafi konumlar ve zaman dilimleri gibi çeşitli konum özellikleriyle eşleştirebilir. Bu sayede IP adresleri üzerinden kullanıcıların coğrafi konumlarını tespit etmek mümkün olur.
-
Docker (Versiyon: 20.10.8): Docker, uygulamaları, bağımlılıkları ve konfigürasyonları bir araya getirerek hafif, taşınabilir ve ölçeklenebilir konteynerler oluşturmayı sağlayan bir platformdur. Docker sayesinde uygulamaları izole edebilir, farklı ortamlarda sorunsuz bir şekilde çalıştırabilir ve dağıtım süreçlerini kolaylaştırabilirsiniz.
-
Lombok (Versiyon: 1.18.26): Lombok, Java'da boilerplate kodu azaltmak ve daha sade ve okunabilir sınıflar oluşturmak için kullanılan bir kütüphanedir. Getter, Setter, Constructor gibi tekrarlayıcı kodları otomatik olarak oluşturarak kodu temiz ve düzenli tutar. Bu sayede geliştiriciler daha az tekrarlayıcı kod yazmak zorunda kalır ve daha az hata yaparlar.
-
JUnit (Versiyon: 5.8.0): JUnit, Java programlama dili için yazılım testleri oluşturmak ve çalıştırmak için kullanılan bir test çerçevesidir. Test Driven Development (TDD) ve Unit Testing gibi yazılım geliştirme yöntemlerinde yaygın olarak kullanılır. JUnit, testlerin otomatik olarak çalıştırılmasını ve sonuçların raporlanmasını sağlar, böylece geliştiriciler kodun doğruluğunu ve kalitesini sağlamak için kolayca testler yapabilirler.
- Proje, IP adresine göre konum bilgilerini elde etmek için MaxMind GeoIP2 kütüphanesini kullanır.
- MMDB dosyası olmadan proje kullanılamaz. Bu nedenle projenin çalışması için GeoLite2-City.mmdb dosyasının projenin asset klasöründe bulunması gerekmektedir.
- Servis geçerli bir IP adresiyle çağrıldığında konum bilgilerini döndürürken, geçersiz veya hatalı bir IP adresiyle çağrıldığında "Hata: Konum bilgisi alınamadı." bilgisiyle 500 Internal Server Error dönecektir.
-
GeoLite2-City.mmdb dosyasını MaxMind adresinden ücretsiz olarak indirin ve proje ana dizinine asset klasörü içine ekleyin.
-
Proje ana dizininde aşağıdaki komutu çalıştırarak proje bağımlılıklarını yükleyin:
mvn clean install
-
Docker'ı ve Docker Compose'u bilgisayarınıza yükleyin.
-
Docker image'ı oluşturmak için aşağıdaki komutu çalıştırın:
docker build -t location-by-ip:0.1 .
- Projenin Docker container'ında ayağa kaldırmak için aşağıdaki komutu çalıştırın:
docker-compose up
- Servis, varsayılan olarak 8585 portunda çalışacaktır. Tarayıcınızı veya API test aracınızı kullanarak aşağıdaki URL'ye erişebilirsiniz:
http://localhost:8585/location/{ipAddress}
Parametre | Tip | Açıklama |
---|---|---|
ipAddress |
string |
Gerekli. Çağrılacak öğenin ip adresi |
GET http://localhost:8585/location/176.88.4.170
{
"ip": "176.88.4.170",
"network": "176.88.4.0/23",
"countryName": "Türkiye",
"city": "Istanbul",
"continentName": "Asia",
"continentCode": "AS",
"timeZone": "Europe/Istanbul",
"latitude": 41.0145,
"longitude": 28.9533
}
- docker-compose.yml dosyası içinde service oluşturun ve burada Docker Hub da yer alan husnapoyraz/location-by-ip:0.1 image'ini çekin:
location_service:
image: husnapoyraz/location-by-ip:0.1
container_name: location_service
ports:
- ${LOCATION_SERVICE_PORT}:${LOCATION_SERVICE_PORT}
networks:
url_shortener:
- Projenin Docker container'ında ayağa kaldırmak için aşağıdaki komutu çalıştırın:
docker-compose up
Not: Docker kullanım hakkında daha fazla bilgiye ulaşmak için Ahmet Emre Demirşen'in medium yazısına bakabilirsiniz.
FROM openjdk:17
WORKDIR /app
COPY /asset /app/asset
ARG JAR_FILE=/target/*.jar
COPY ${JAR_FILE} /app/location-by-ip.jar
ENV SPRING_PROFILES_ACTIVE=prod
CMD ["java", "-jar", "-Dspring.profiles.active=${SPRING_PROFILES_ACTIVE}", "location-by-ip.jar"]
version: '3.8'
services:
location:
image: location-by-ip:0.1
container_name: location
ports:
- "8585:8585"
Proje, JUnit ve Spring Boot test framework'ü kullanılarak test edilmiştir. Testler, farklı senaryolarda projenin doğru çalıştığından emin olmak için yazılmıştır. Testler, test/java klasörü altında bulunur ve LocationServiceTest adlı test sınıfı örnek olarak eklenmiştir.
// LocationServiceTest.java
package com.hpoyraz.locationbyip.service;
import com.maxmind.geoip2.exception.GeoIp2Exception;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import com.hpoyraz.locationbyip.model.Location;
import java.io.IOException;
import static org.junit.jupiter.api.Assertions.*;
public class LocationServiceTest {
private LocationService locationService;
@BeforeEach
public void setUp() {
locationService = new LocationService();
}
// Testler burada devam eder...
}
Katkılarınızı bekleriz! Lütfen pull request göndererek projeye katkıda bulunun. Bu proje MIT lisansı altında dağıtılmaktadır.
Herhangi bir geri bildiriminiz varsa, lütfen [email protected] adresinden bize ulaşın.
Bu proje, topluluk katkıları ve açık kaynak yazılımlar kullanılarak geliştirilmiştir. Bu nedenle projenin geliştirilmesine katkıda bulunan herkese teşekkür ederiz.