Tuan-tuan, para pengembang aplikasi java. Hari ini, Anda disajikan dengan cara sederhana untuk menggunakan evaluasi kode, yang implementasinya akan memungkinkan kode arbitrer dijalankan dalam aplikasi yang sedang berjalan, yang pada gilirannya akan menghemat banyak waktu CI / CD.
Mengapa saya membutuhkannya?
Jika Anda harus mengembangkan arsitektur layanan mikro, terutama di perusahaan besar, kemungkinan besar Anda sudah terbiasa dengan situasi ketika Anda dapat melihat bagaimana aplikasi bekerja "dalam pertempuran" hanya di stand di mana terdapat integrasi dengan layanan mikro lain. Dan karena tidak semua hal dapat diperiksa secara lokal pada rintisan, untuk menguji hipotesis tertentu, Anda harus memasukkan kode baru (bukan fakta bahwa ia bekerja dengan benar) ke dalam repositori ... jalankan melalui CI / CD ... dan hanya kemudian melalui log untuk memahami bahwa di suatu tempat ada yang tidak beres. Dan ada baiknya jika log segera menunjukkan di mana Anda salah, karena jika tidak, proses mendorong dan berjalan di sepanjang jalur pipa ini bisa menjadi siklus samsara Anda.
Eksekusi kode yang dimasukkan secara dinamis akan membantu menyelesaikan masalah ini.
Bagaimana itu bekerja?
Seperti yang kita semua tahu, groovy adalah bahasa pemrograman yang sepenuhnya kompatibel dengan Java dengan kompilasi dinamis . Kedua fitur groovy ini akan membantu kita mengimplementasikan evaluasi kode untuk aplikasi java. Anda dapat dengan mudah mengetahui cara menambahkan dukungan keren ke proyek java sendiri. Dan saya akan memberikan contoh bagaimana menerapkan evaluasi kode (dalam arti, mirip dengan apa yang Anda lihat selama debugging di IDE Anda).
1) Mari buat kelas yang menarik, dan di dalamnya ada template string tempat kita akan menempatkan kelas dan placeholder untuk kode yang dimasukkan secara dinamis. Contoh baris seperti itu:
def EXPRESSION_CLASS_TEMPLATE = """
package dev.toliyansky.eval.service
class ExpressionClass implements java.util.function.Supplier<Object> {
def get() {
%s
}
}
"""
Catatan: paket harus sama dengan kelas tempat Anda akan menulis kode ini.
Mengapa kami menerapkan Pemasok akan dijelaskan di bawah ini.
2) Secara dinamis mengkompilasi dan memuat kelas ini.
REST , code .
def finalClassCode = String.format(EXPRESSION_CLASS_TEMPLATE, code) def supplier = groovyClassLoader.parseClass(finalClassCode) .getDeclaredConstructor() .newInstance() as Supplier<Object> def result = supplier.get()
%s .
, . Supplier , . Supplier<Object> .
.
code evaluation
web kubernetes. - , , , CI/CD POD , . , , - NullPointerException.
HTTP , applicationContext, . , CI/CD. . .
web spring boot
groovy java , , , , - evaluator-spring-boot-starter
, , spring boot starter. web http://host:port/eval WEB-UI, , . , . , , curl wget POD, http://host:port/eval/groovy GET POST .
, - readme .
Menunjukkan bagaimana evaluasi kode dapat menghemat waktu untuk men-debug aplikasi
Mendemonstrasikan cara mengimplementasikan evaluasi kode dalam proyek java
Mendemonstrasikan solusi siap pakai dalam bentuk starter boot pegas.