Panduan untuk Admin Spring Boot

1. Ikhtisar

Spring Boot Admin adalah aplikasi web, digunakan untuk mengelola dan memantau aplikasi Spring Boot. Setiap aplikasi dianggap sebagai klien dan mendaftar ke server admin. Di balik layar, keajaiban diberikan oleh titik akhir Spring Boot Actuator.

Pada artikel ini, kami akan menjelaskan langkah-langkah untuk mengkonfigurasi server Admin Boot Musim Semi dan bagaimana aplikasi menjadi klien.

2. Pengaturan Server Admin

Pertama-tama, kita perlu membuat aplikasi web Spring Boot sederhana dan juga menambahkan dependensi Maven berikut:

 de.codecentric spring-boot-admin-starter-server 2.2.2 

Setelah ini, @EnableAdminServer akan tersedia, jadi kami akan menambahkannya ke kelas utama, seperti yang ditunjukkan pada contoh di bawah ini:

@EnableAdminServer @SpringBootApplication public class SpringBootAdminServerApplication { public static void main(String[] args) { SpringApplication.run(SpringBootAdminServerApplication.class, args); } }

Pada titik ini, kami siap untuk memulai server dan mendaftarkan aplikasi klien.

3. Menyiapkan Klien

Sekarang, setelah kita menyiapkan server admin kita, kita dapat mendaftarkan aplikasi Spring Boot pertama kita sebagai klien. Kita harus menambahkan ketergantungan Maven berikut:

 de.codecentric spring-boot-admin-starter-client 2.2.2 

Selanjutnya, kita perlu mengkonfigurasi klien untuk mengetahui tentang URL dasar server admin. Agar ini terjadi, kami hanya menambahkan properti berikut:

spring.boot.admin.client.url=//localhost:8080

Dimulai dengan Spring Boot 2, titik akhir selain kesehatan dan info tidak ditampilkan secara default.

Mari kita bahas semua titik akhir:

management.endpoints.web.exposure.include=* management.endpoint.health.show-details=always

4. Konfigurasi Keamanan

Server Admin Spring Boot memiliki akses ke titik akhir sensitif aplikasi, jadi disarankan agar kami menambahkan beberapa konfigurasi keamanan ke aplikasi admin dan klien.

Pertama, kami akan fokus pada konfigurasi keamanan server admin. Kita harus menambahkan dependensi Maven berikut:

 de.codecentric spring-boot-admin-server-ui-login 1.5.7   org.springframework.boot spring-boot-starter-security 2.1.8.RELEASE 

Ini akan mengaktifkan keamanan dan menambahkan antarmuka login ke aplikasi admin.

Selanjutnya, kami akan menambahkan kelas konfigurasi keamanan seperti yang Anda lihat di bawah ini:

@Configuration public class WebSecurityConfig extends WebSecurityConfigurerAdapter { private final AdminServerProperties adminServer; public WebSecurityConfig(AdminServerProperties adminServer) { this.adminServer = adminServer; } @Override protected void configure(HttpSecurity http) throws Exception { SavedRequestAwareAuthenticationSuccessHandler successHandler = new SavedRequestAwareAuthenticationSuccessHandler(); successHandler.setTargetUrlParameter("redirectTo"); successHandler.setDefaultTargetUrl(this.adminServer.getContextPath() + "/"); http .authorizeRequests() .antMatchers(this.adminServer.getContextPath() + "/assets/**").permitAll() .antMatchers(this.adminServer.getContextPath() + "/login").permitAll() .anyRequest().authenticated() .and() .formLogin() .loginPage(this.adminServer.getContextPath() + "/login") .successHandler(successHandler) .and() .logout() .logoutUrl(this.adminServer.getContextPath() + "/logout") .and() .httpBasic() .and() .csrf() .csrfTokenRepository(CookieCsrfTokenRepository.withHttpOnlyFalse()) .ignoringRequestMatchers( new AntPathRequestMatcher(this.adminServer.getContextPath() + "/instances", HttpMethod.POST.toString()), new AntPathRequestMatcher(this.adminServer.getContextPath() + "/instances/*", HttpMethod.DELETE.toString()), new AntPathRequestMatcher(this.adminServer.getContextPath() + "/actuator/**")) .and() .rememberMe() .key(UUID.randomUUID().toString()) .tokenValiditySeconds(1209600); } }

Ada konfigurasi keamanan sederhana, tetapi setelah menambahkannya, kita akan melihat bahwa klien tidak dapat mendaftar ke server lagi.

Untuk mendaftarkan klien ke server yang baru diamankan, kita harus menambahkan beberapa konfigurasi lagi ke dalam file properti klien:

spring.boot.admin.client.username=admin spring.boot.admin.client.password=admin

Kami berada di titik, di mana kami mengamankan server admin kami. Dalam sistem produksi, secara alami, aplikasi yang kami coba pantau akan diamankan. Jadi, kami juga akan menambahkan keamanan ke klien - dan kami akan melihat di antarmuka UI server admin bahwa informasi klien tidak tersedia lagi.

Kami harus menambahkan beberapa metadata yang akan kami kirim ke server admin. Informasi ini digunakan oleh server untuk terhubung ke titik akhir klien:

spring.security.user.name=client spring.security.user.password=client spring.boot.admin.client.instance.metadata.user.name=${spring.security.user.name} spring.boot.admin.client.instance.metadata.user.password=${spring.security.user.password}

Mengirim kredensial melalui HTTP, tentu saja, tidak aman - jadi komunikasinya harus melalui HTTPS.

5. Fitur Pemantauan dan Manajemen

Spring Boot Admin dapat dikonfigurasi untuk hanya menampilkan informasi yang kami anggap berguna. Kami hanya perlu mengubah konfigurasi default dan menambahkan metrik yang kami butuhkan:

spring.boot.admin.routes.endpoints=env, metrics, trace, jolokia, info, configprops

Saat kita melangkah lebih jauh, kita akan melihat bahwa ada beberapa fitur lain yang dapat dieksplorasi. Kita berbicara tentang manajemen kacang JMX menggunakan Jolokia dan juga manajemen Loglevel .

Spring Boot Admin juga mendukung replikasi cluster menggunakan Hazelcast. Kita hanya perlu menambahkan dependensi Maven berikut dan membiarkan konfigurasi otomatis melakukan sisanya:

 com.hazelcast hazelcast 3.12.2 

Jika kami menginginkan instance Hazelcast yang persisten, kami akan menggunakan konfigurasi khusus:

@Configuration public class HazelcastConfig { @Bean public Config hazelcast() { MapConfig eventStoreMap = new MapConfig("spring-boot-admin-event-store") .setInMemoryFormat(InMemoryFormat.OBJECT) .setBackupCount(1) .setEvictionPolicy(EvictionPolicy.NONE) .setMergePolicyConfig(new MergePolicyConfig(PutIfAbsentMapMergePolicy.class.getName(), 100)); MapConfig sentNotificationsMap = new MapConfig("spring-boot-admin-application-store") .setInMemoryFormat(InMemoryFormat.OBJECT) .setBackupCount(1) .setEvictionPolicy(EvictionPolicy.LRU) .setMergePolicyConfig(new MergePolicyConfig(PutIfAbsentMapMergePolicy.class.getName(), 100)); Config config = new Config(); config.addMapConfig(eventStoreMap); config.addMapConfig(sentNotificationsMap); config.setProperty("hazelcast.jmx", "true"); config.getNetworkConfig() .getJoin() .getMulticastConfig() .setEnabled(false); TcpIpConfig tcpIpConfig = config.getNetworkConfig() .getJoin() .getTcpIpConfig(); tcpIpConfig.setEnabled(true); tcpIpConfig.setMembers(Collections.singletonList("127.0.0.1")); return config; } }

6. Pemberitahuan

Selanjutnya, mari kita bahas kemungkinan untuk menerima pemberitahuan dari server admin jika terjadi sesuatu dengan klien terdaftar kami. Pemberi tahu berikut tersedia untuk konfigurasi:

  • Surel
  • PagerDuty
  • OpsGenie
  • Hipchat
  • Kendur
  • Mari berbincang

6.1. notifikasi email

Kami pertama-tama akan fokus pada konfigurasi pemberitahuan email untuk server admin kami. Untuk mewujudkannya, kami harus menambahkan ketergantungan starter email seperti yang ditunjukkan di bawah ini:

 org.springframework.boot spring-boot-starter-mail 2.1.7.RELEASE 

Setelah ini, kita harus menambahkan beberapa konfigurasi email:

spring.mail.host=smtp.example.com spring.mail.username=smtp_user spring.mail.password=smtp_password [email protected]

Now, whenever our registered client changes his status from UP to OFFLINE or otherwise, an email is sent to the address configured above. For the other notifiers, the configuration is similar.

6.2. Hipchat Notifications

As we'll see, the integration with Hipchat is quite straightforward; there are only a few mandatory properties to set:

spring.boot.admin.notify.hipchat.auth-token= spring.boot.admin.notify.hipchat.room-id= spring.boot.admin.notify.hipchat.url=//yourcompany.hipchat.com/v2/

Having these defined, we'll notice in the Hipchat room that we receive notifications whenever the status of the client changes.

6.3. Customized Notifications Configuration

We can configure a custom notification system having at our disposal some powerful tools for this. We can use a reminding notifier to send a scheduled notification until the status of client changes.

Atau mungkin kami ingin mengirim pemberitahuan ke sekumpulan klien yang difilter. Untuk ini, kita dapat menggunakan notifier pemfilteran:

@Configuration public class NotifierConfiguration { private final InstanceRepository repository; private final ObjectProvider
    
      otherNotifiers; public NotifierConfiguration(InstanceRepository repository, ObjectProvider
     
       otherNotifiers) { this.repository = repository; this.otherNotifiers = otherNotifiers; } @Bean public FilteringNotifier filteringNotifier() { CompositeNotifier delegate = new CompositeNotifier(this.otherNotifiers.getIfAvailable(Collections::emptyList)); return new FilteringNotifier(delegate, this.repository); } @Bean public LoggingNotifier notifier() { return new LoggingNotifier(repository); } @Primary @Bean(initMethod = "start", destroyMethod = "stop") public RemindingNotifier remindingNotifier() { RemindingNotifier remindingNotifier = new RemindingNotifier(filteringNotifier(), repository); remindingNotifier.setReminderPeriod(Duration.ofMinutes(5)); remindingNotifier.setCheckReminderInverval(Duration.ofSeconds(60)); return remindingNotifier; } }
     
    

7. Kesimpulan

Tutorial intro ini mencakup langkah-langkah sederhana yang harus dilakukan seseorang, untuk memantau dan mengelola aplikasi Spring Boot-nya menggunakan Spring Boot Admin.

Konfigurasi otomatis mengizinkan kita untuk menambahkan hanya beberapa konfigurasi kecil dan pada akhirnya, memiliki server admin yang berfungsi penuh.

Dan, seperti biasa, kode contoh dari panduan ini dapat ditemukan di Github.