My Profile Photo

Mehmet Cem Yücel


Technical Writings.
Architecture, Security, Java, Golang, Devops, Microservices, Spring Boot, Kafka, Distributed Systems and Blockchain


Golang Api Management

“Golang ile Uçtan Uca Proje Yapımı Serisi” 5. yazısında Go’da Api Yönetimi nasıl yapılır sorusunun cevabını arayacağız. Değineceğimiz başlıklar aşağıdaki gibi olacak;

  • Http router (echo)
  • Http package (fasthttp)
  • Monitoring (prometheus & go-kit)
  • Open-api/Swagger desteği (swaggo)

HTTP Router

Http router olarak gorilla/mux, gin-gonic/gin ve Echo web frameworklerini POC’lediğimde hızı, kullanım kolaylığı ve communitydeki popülaritesi açısından Echo yu tercih ettim.

Yukarıdaki kod örneğinde Echo’nun kendi handler metot imza yapısı ile kodlanmış Check apisinin bindinginin nasıl yapıldığına bir örnek olarak alınabilir. Standart bir handlerla yazılmış handlera binding yapılabilmesi örneği de /metrics endpointi için geçerli. Keza birazdan değineceğimiz Swagger’ın endpointini de burada açtık.

Bunların haricinde Echo frameworkü bize predefined middleware çözümleri ile birlikte de geliyor. Peki bu ne demek? Ekstra bir kodlamaya gerek kalmadan gelen tüm istekleri loglayan(access logs) Logger, servisten kontrolsüz fırlatılan bir panic yüzünden uygulamamızın down olmasını kontrol altına alan Recover veya Cross Origin Yönetimi yeteneklerini ekstra kod yazmamıza gerek kalmadan kolay bir şekilde konfigüre edebilmemizi sağlayan CORSWithConfig gibi middlewareleri direk sunucunuzda yapılandırıp yukarıdaki örnekteki gibi kullanabilirsiniz anlamına geliyor.

Serverı sadece ayağa kaldırıp bırakmak yerine graceful shutdown özelliği eklemek iyi bir fikir. Bu sunucumuza OS’tan bir SIGINT sinyali geldiğinde o anda işletilen işlerin yarım bırakılmadan tamamlanarak uygulamanın tutarsız durumda sonlanmasını engellemek anlamına geliyor. Bu sebeple operating system sinyallerini dinlemek için açılan bir kanal aracılığıyla maksimum 10 sn olacak şekilde uygulamanın kapanması için de bir kod ekledim.

HTTP Package

Belki önceki yazılarda dikkatinizi çekmiştir. Konfigürasyonun remote bir config sunucusundan çekilmesi örneğinde net/http paketi yerine FastHTTP paketlerini kullanarak implementasyon yapmıştım. Kullanım kolaylığı ve net/http paketinin yaşadığı performans darboğazlarına karşı daha sağlam duruşu ile FastHTTP http paketi olarak projemizde aşağıdaki örnekle yerini aldı.

Monitoring

Uygulamanın prodda ayağa kalktıktan sonra memory istatistikleri, gc süreleri, thread ve cpu istatistikleri gibi bir çok bilgiye ihtiyaç duyarız. Bu bilgiler sayesinde uygulama için her şey yolunda mı, olası problemler gibi konularda önceden bilgi ediniriz. Ayrıca sunduğumuz servislerin tüketilme istatistikleri, response sürelerimiz gibi custom istatistiklerle de daha detaylı bilgileri takip edebiliriz. Bu amaçla projemizde go-kit toolkitinin bu yeteneklerinden faydalanacağız. Go-kit projelerimize genel bir form katan çokça tooldan oluşsa da biz sadece monitoring özelliğine sağladığı kullanım kolaylığından dolayı kullanacağız.

Yukarıdaki kod örneğinde prometheus kit içerisine 2 farklı toplamda 3 metrik tipi tanımladım. 1i count bilgisi verirken 2si summary sunuyor. Sonrasında Chain of Responsibility patterni kullanılarak farklı middleware implementasyonları birbirlerinin next actionları olarak tanımlanıyor ve servis çalıştırılırken verilen önceliğe göre chain işletiliyor. Kendi filterlarınızı da custom middlewareler olarak kodlayıp chaine dahil edebilirsiniz. Eğer echo frameworkte access logları açtıysanız yukarıdaki örnekteki gibi logging middlewarei comment-outlamak iyi bir tercih olabilir.

Yukarıda requestCount’u, latency’yi ve countResult gibi custom parametreleri prom.metrics’e işledik. Hatırlarsanız Echo frameworkun route’larını bind ederken /metrics path i tanımlamıştık. İşte bu endpoint toplanan uygulamanın metriklerinin ve custom metriklerin prometheus’un anlayabileceği dilde bir uçtan paylaşılabilmesi için açılmış bir endpointtir. Bu adrese gittiğimizde aşağıdaki formatta uygulamamıza ait tüm metrikleri edinebiliriz.

Örneğin üst satırlarda uygulamamızın Check endpointine 3 istek geldiğini, bunların toplamda ~5sn sürdüğünü(breakpoint vardı :)) custom metriclerimiz aracılığı ile görebiliyoruz. Aynı şekilde memory istatistiklerini ve daha fazlası da yine buradan erişilebilir durumda olacaktır. Bu metrikleri prometheus aracılığıyla collect edip Grafana’da monitoring dashboardları hazırlayabilir, anomali durumlarında haberdar olabilmek için alarmlar tanımlayabilirsiniz.

OpenAPI - Swagger

Son olarak da uygulamamıza eklediğimiz Swagger desteğinden bahsedelim. Bunun için swaggo/swag toolunu kullandım. İlk önce toolun kurulması için aşağıdaki komutun çalıştırılması gerekiyor.

$ go get -u github.com/swaggo/swag/cmd/swag

# 1.16 or newer  
$ go install github.com/swaggo/swag/cmd/swag@latest

Sonrasında toolun sitesindeki yönlendirmeler takip edilerek metotların ve uygulamanın başına eklenen yorum satırları aracılığı ile Swagger’ın yapılandırılması mümkün oluyor. Detaylı bilgiye buradan göz atabilirsiniz.

Swagger için router’da handlerının binding ini yapmıştık. Handler için gerekli dökümantasyonu build veya runtime’da değil öncesinde çalıştıracağımız bir komut ile hazırlıyor.

swag init -g cmd/demo/main.go — output docs/mcy

Bu komutla uygulamamın başlangıcı burası ve oluşturacağın dökümantasyonu bu dosyanın altına bırak demiş oluyoruz. Çalıştırdığımızda aşağıdaki dosyalar oluşuyor. Buradaki bilgiler ışığında birazdan swagger ekranımız render olacak.

Uygulamanın http://localhost:8080/swagger/index.html adresine gittiğimizde swaggerımıza artık erişebiliriz.

Buradaki önemli nokta, Echo serverınızı yarattığınız noktada Swagger’ın ve dökümanların yaratıldığı klasörün static importlarını eklemeyi unutmayın ki uygulamanın contextine dahil olabilsin.

Serinin sonraki yazısı Message Broker, Object Mapping ve Testing hakkında, buradan erişebilirsiniz.

Serinin tüm yazılarına aşağıdaki linkler aracılığıyla erişebilirsiniz.

  1. Golang ile Uçtan Uca Proje Yapımı Serisi
  2. Golang Configuration Management
  3. Golang Central Logging Management
  4. Golang DB Migration - RDBMS & ORM Integration
  5. Golang API Management
  6. Golang Message Broker - Object Mapping - Testing

Yukarıda değindiğimiz bütün kodlara https://github.com/mehmetcemyucel/blog/tree/master/demo adresinden erişebilirsiniz.




May interest this topics

If you interested in Blockchain Technologies,


comments powered by Disqus