Springboot Admin nedir ? Nasıl kullanılır?
Merhaba arkadaşlar,
Bu yazımda springboot admin nedir ona değinip örneğini yapacağız. SpringBootAdmin, SpringBoot Applications’lerinizi yönetmek ve izlemek için basit bir web uygulamasıdır. Bütün servislerimiz, SpringBootAdmin servisimize (http yoluyla) kaydolur veya SpringCloud kullanılarak register olur .
Springboot admin’e daha detaylı değinmeden önce springboot actuator kütüphanesinin ne olduğunu açıklayalım.
Springboot Actuator : uygulama durumu , uygulamaya gelen ve giden http isteklerin verilerini , ram’de yaşayan sınıfların detayları , uygulamamızın versiyon bilgileri, uygulamadaki logların kontrolü (INFO,DEBUG , ERROR), ,uygulama konfigurasyonundaki parametrelerin neler olduğu ,sunucunun çevresel değişkenleri vs. gibi kavramları bize http olarak kanal açarak sunan kütüphaneye denir.
Springboot admin’in kullanıcı arayüzü, SpringbootActuator’un üstüne yazıldığı için Actuator da sunulan birçok özelliği bize monitör etmemizi sağlayan Angular.js ile yazılmış bir web uygulamasıdır.
Springboot admin ne işe yarar anladıysak eğer şimdi bir örnek yapalım. Kabaca ne yapacağız anlatayım , 3 tane springboot ile yazılmış uygulama yapacağız. Admin Service , Eureka Service ve Customer service
Admin Service: Bu uygulama springboot admin uygulamamız olacak.
Eureka Service: Tüm uygulamaların register olduğu eureka server’imiz.
Customer Service : Bu uygulama bir rest servis ile request alacak ve aynı modeli response dönecek.
Not: Yazılan kodlar ile ilgili açıklamaların bazıları dosyalara yorum satırı olarak eklenmiştir.
İlk önce Admin Service yazarak başlayalım. Projemiz maven projesidir. İlk olarak proje bağımlılıklarımızı pom.xml ‘e ekliyoruz.
pom.xml
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 |
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>io</groupId> <artifactId>AdminService</artifactId> <version>0.0.1-SNAPSHOT</version> <packaging>jar</packaging> <name>AdminService</name> <properties> <java.version>1.8</java.version> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> </properties> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>1.5.4.RELEASE</version> <relativePath /> <!-- lookup parent from repository --> </parent> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-security</artifactId> </dependency> <dependency> <groupId>de.codecentric</groupId> <artifactId>spring-boot-admin-server-ui-login</artifactId> <version>1.5.1</version> </dependency> <dependency> <groupId>de.codecentric</groupId> <artifactId>spring-boot-admin-server</artifactId> <version>1.5.1</version> </dependency> <dependency> <groupId>de.codecentric</groupId> <artifactId>spring-boot-admin-server-ui</artifactId> <version>1.5.1</version> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>3.8.1</version><!--$NO-MVN-MAN-VER$--> <scope>test</scope> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build> </project> |
Servisimizi ayağa kaldırırken sunucu ve servisimiz için gerekli propertyleri ekliyeceğimiz dosyamızı “resources” dizinimize ekleyelim.
application.properties
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
spring.application.name=AdminService server.port=1111 spring.boot.admin.notify.slack.webhook-url=https://hooks.slack.com/services/T59877979797676/08908089AL/0999999999996767671eL spring.boot.admin.notify.slack.message="*#{application.name}* is *#{to.status}*" management.security.enabled=false # springboot Admin uygulamasına bağlanan diğer uygulamalarımız # bu username ve şifre ile bağlanır. Ayrıyeten panel'e girişte de # bizden bu bilgiler istenir. security.user.name=admin security.user.password=admin123 |
Sonrasında ise main sınıfımızı yazalım .
Application.java
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.context.annotation.Configuration; import de.codecentric.boot.admin.config.EnableAdminServer; /** * @author mehmetkilic * * */ @EnableAdminServer @Configuration @SpringBootApplication public class Application { public static void main(String[] args) { SpringApplication.run(Application.class, args); } } |
Projemizi ayağa kaldırıp Eureka server ekranına bakalım. Eclipse için Run as > Run Configuration > Maven build > New diyerek çıkan ekranda Goals kısmına spring-boot:run yazarsanız proje sıkıntısız ayağa kalkacaktır veya klasik yöntem yazdıgımız servisi build ettikten sonra target dizinize çıkan jar dosyasına direk java -jar service-ismi.jar yazdığınızda servis ayağa kalkmış oalcaktır.
Servis ayağa kalktığında springboot admin web uygulaması ekranı çıktısı şöyle olacaktır.
Şimdi ise eureka-service ‘i yazmaya başlayalım.Bunu yazma sebebimiz yukardada bahsetmiştik bütün servisler eureka servise register olması lazım ki springboot admin service register olan servis listesini oradan çekebilsin. Eureka servis nedir daha detaylı öğrenmek istiyorsanız buradaki : https://bilisim.io/2017/07/10/microservice-ile-spring-boot-eureka-load-balancing/ isimli yazımıza bakabilirsiniz.
Maven projesi açıyoruz ve bağımlılıklarımızı ekliyoruz.
pom.xml
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 |
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>io</groupId> <artifactId>EurekaService</artifactId> <version>0.0.1-SNAPSHOT</version> <packaging>jar</packaging> <name>EurekaService</name> <properties> <java.version>1.8</java.version> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <spring-cloud.version>Dalston.SR1</spring-cloud.version> </properties> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>1.5.4.RELEASE</version> <relativePath /> <!-- lookup parent from repository --> </parent> <dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-eureka-server</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-actuator</artifactId> </dependency> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>3.8.1</version><!--$NO-MVN-MAN-VER$--> <scope>test</scope> </dependency> </dependencies> <dependencyManagement> <dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-dependencies</artifactId> <version>${spring-cloud.version}</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build> </project> |
Sonrasında servisimizi ayağa kaldırırken sunucu ve servisimiz için gerekli propertyleri ekliyeceğimiz dosyamızı “resources” dizinimize ekleyelim.
application.properties
1 2 3 4 5 6 7 8 9 10 11 |
spring.application.name=EurekaService server.port=8013 eureka.instance.hostname=localhost eureka.client.registerWithEureka=false eureka.client.fetchRegistry=false eureka.client.server.waitTimeInMsWhenSyncEmpty=0 eureka.server.enableSelfPreservation=false |
Sonrasında ise projemiziin çalışması için gerekli main sınıfımızı yazıyoruz.
Application.java
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
package io.bilisim; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.context.annotation.Configuration; import de.codecentric.boot.admin.config.EnableAdminServer; /** * @author mehmetkilic * * */ @EnableAdminServer @Configuration @SpringBootApplication public class Application { public static void main(String[] args) { SpringApplication.run(Application.class, args); } } |
Şimdi ise Customer Service ‘i yazalım. Bu uygulamada restful servis bir tane endpointimiz var , bize post ettiğimiz customer nesnesini editleyip geri response olarak dönderiyor. Bu arada biz log basıyoruz konsola bunu şunun için yapıyoruz springboot admin ekranında görebilecekmiyiz ve konsol logunu çalışma zamanı durdurabilecekmiyiz bakacağız.
Maven projesi açıyoruz ve bağımlılıklarımızı ekliyoruz.
pom.xml
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 |
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>io</groupId> <artifactId>CustomerService</artifactId> <version>0.0.1-SNAPSHOT</version> <packaging>jar</packaging> <name>CustomerService</name> <url>http://maven.apache.org</url> <properties> <java.version>1.8</java.version> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <spring-cloud.version>Dalston.SR1</spring-cloud.version> </properties> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>1.5.4.RELEASE</version> <relativePath /> <!-- lookup parent from repository --> </parent> <dependencies> <dependency> <groupId>de.codecentric</groupId> <artifactId>spring-boot-admin-starter-client</artifactId> <version>1.5.1</version> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-actuator</artifactId> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-eureka</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>3.8.1</version><!--$NO-MVN-MAN-VER$--> <scope>test</scope> </dependency> </dependencies> <dependencyManagement> <dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-dependencies</artifactId> <version>${spring-cloud.version}</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build> </project> |
Sonrasında servisimizi ayağa kaldırırken sunucu ve servisimiz için gerekli propertyleri ekliyeceğimiz dosyamızı “resources” dizinimize ekleyelim.
application.properties
1 2 3 4 5 6 7 8 9 10 11 12 |
spring.application.name=CustomerService server.port=8012 eureka.client.serviceUrl.defaultZone=${EUREKA_URI:http://localhost:8013/eureka} spring.boot.admin.url=http://localhost:1111 management.security.enabled=false spring.boot.admin.username=admin spring.boot.admin.password=admin123 logging.file=target/${spring.application.name}.log |
Sonrasında ise projemiziin çalışması için gerekli main sınıfımızı yazıyoruz.
Application.java
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 |
import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cloud.client.discovery.EnableDiscoveryClient; import org.springframework.cloud.netflix.eureka.EnableEurekaClient; /** * @author mehmetkilic * * */ @EnableEurekaClient @SpringBootApplication @EnableDiscoveryClient public class Application { private static final Logger LOGGER = LoggerFactory.getLogger(Application.class); public static void main(String[] args) { LOGGER.debug("The Customer service is running........"); SpringApplication.run(Application.class, args); } } |
Endpointimizin olduğu sınıfı yazalım.
CustomerController.java
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 |
import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.http.MediaType; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.bind.annotation.RestController; import io.bilisim.model.Customer; /** * @author mehmetkilic * * */ @RestController public class CustomerController { private static final Logger LOGGER = LoggerFactory.getLogger(CustomerController.class); @RequestMapping(value = "/customer", method = RequestMethod.POST ,produces=MediaType.APPLICATION_JSON_VALUE) public Customer customer(@RequestBody Customer customer) { LOGGER.info("CustomerController@customer method started ... "); LOGGER.info("payload : " + customer); customer.setFirstName(customer.getFirstName()+" -------------------"); customer.setFirstName(customer.getLastName()+" -------------------"); LOGGER.info("CustomerController@customer method finished ... "); return customer; } } |
Şimdi ise springboot admin uygulamamıza bakalım . servisimizi eureka servis üzerinden çekmiş mi ?
Gördüğümüz gibi servisimiz springboot admin servis’te gözüktü. Detayları paneldeki özellikleri inceleyelim.
Details | Uygulama ayakta olduğu bilgisi , memory kullanımı , jvm bilgileri , garbage collection bilgileri vs. içerir |
Log | Uygulamanın konsol logları |
Environment | Uygluma içindeki konfigurasyonlar ve unun çevresel değişkenleri |
Logging | Bu sekme çalışma zamanı yaratılmış tüm nesnelerin loglarını istediğimiz seviyeye çekip istediğimiz zaman kapatabiliyoruz. Işimize çok yarayacak bir özellik. |
JMX | Çalışma zamanaı JVM yönetilmesi için parametre set edebiliriz. |
Trace | Uygulamamıza gelen tüm istekler ve cevapları buradadır |
Threads | Çalışan thread’leri ve durumlarını gösterir |
HeapDump | Panelin o anki çıktısını yediğini verir. |
Şimdi rest servisimizden bir istek atalım ve uygulama loguna nasıl düştüğünü , http isteğin header bilgileri , log seviyelerini değiştirelim veya kapalım.
Log Sekmesi
Logging sekmesi
Bu sekmedeki controller sınıfındaki log seviyesini değiştirebilir yada hiç yazmaması için kapatabiliriz.
Trace sekmesi
Panelde birde eureka servere bağlanan yada düşen tüm uygulamaların ları tutulur bunada sağüstte Journal sekmesi ile bakablilirsiniz.
Springboot admin ile ilgili şimdilik değineceklerim bu kadar umarım yararlı olmuştur.
Sorunuz olursa yorum olarak yazabilirsiniz en kısa sürece cevaplamaya çalışırım.
İyi Çalışmalar