Berbagi teknologi

Analisis kode sumber modul Apache Seata

2024-07-08

한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina

Artikel ini berasal dari Dokumentasi resmi Apache Seata, selamat datang untuk mengunjungi situs resminya untuk melihat artikel lebih mendalam.
Artikel ini berasal dariDokumentasi resmi Apache Seata, selamat datang untuk mengunjungi situs resminya untuk melihat artikel lebih mendalam.

1. Perkenalan

berdasarkanBosAda tiga jenis kategori dan konfigurasi yang ditentukan: konfigurasi lingkungan, konfigurasi deskripsi, dan konfigurasi yang diperluas.

Konfigurasi lingkungan: parameter seperti kapan beberapa komponen dimulai, biasanya nilai sederhana yang terpisah, sebagian besar data nilai kunci.

Konfigurasi deskripsi: terkait dengan logika bisnis, seperti pemrakarsa dan peserta transaksi, biasanya tertanam dalam manajemen siklus hidup bisnis. Ada banyak informasi konfigurasi yang dijelaskan, dan bahkan ada hubungan hierarki.

Konfigurasi yang diperluas: Produk perlu menemukan implementasi pihak ketiga dan memiliki persyaratan yang relatif tinggi untuk agregasi konfigurasi, seperti berbagai pusat konfigurasi dan pusat registrasi. Metode yang biasa dilakukan adalah menempatkan file nama lengkap kelas antarmuka di bawah META-INF/layanan dari paket jar, dengan isi sebagai berikut Satu nama kelas implementasi per baris.

2. Konfigurasi lingkungan

Saat memuat, server seata akan menggunakan resources/registry.conf untuk menentukan jenis pusat konfigurasi dan pusat registrasi. Setelah versi 1.0, klien seata tidak hanya dapat menggunakan file conf untuk memuat konfigurasi, tetapi juga menggunakan seata.config.{type} di file konfigurasi yml springboot untuk memilih pusat konfigurasi. Kode sumber untuk memuat konfigurasi melalui yml berada di bawah paket io.seata.spring.boot.autoconfigure.properties.registry.

Jika pengguna klien seata menempatkan file konfigurasi conf di bawah sumber daya dan konfigurasi di file yml, konfigurasi di file yml akan digunakan terlebih dahulu. Kode:

CURRENT_FILE_INSTANCE = null == extConfiguration ? configuration : extConfiguration;

Di sini extConfiguration adalah instance konfigurasi eksternal, yang disediakan oleh kelas penyedia konfigurasi eksternal ExtConfigurationProvider#provide(), dan konfigurasi disediakan oleh kelas penyedia konfigurasi lain ConfigurationProvider#provide() modul config ConfigurationFactory , dimuat melalui SPI.

EnhancedServiceLoader.load(ExtConfigurationProvider.class).provide(configuration);

Yang disebutkan di atas adalah pemilihan jenis pusat konfigurasi, dan pemuatan lingkungan konfigurasi adalah memuat konfigurasi lingkungan melalui pusat konfigurasi yang sesuai setelah menentukan jenis pusat konfigurasi mana yang akan digunakan. Konfigurasi file dalam mode teks juga merupakan pusat konfigurasi.

Klien dan server mendapatkan parameter konfigurasi melalui ConfigurationFactory#getInstance() untuk mendapatkan instance kelas konfigurasi, dan kemudian menggunakan instance kelas konfigurasi untuk mendapatkan parameter konfigurasi. Definisi konstanta kunci konfigurasi terutama ada di file konfigurasi di bawah modul inti.

Arti dari beberapa properti konfigurasi lingkungan yang penting,Situs web resmi memiliki pengantar

Yang diperoleh melalui ConfigurationFactory selama pembuatan instance dan kemudian dimasukkan ke dalam konstruktor perlu dimulai ulang agar dapat diterapkan. Namun, yang diperoleh melalui ConfigurationFactory secara real-time selama penggunaan akan berlaku setelah konfigurasi diubah.

Namun, modul config menyediakan metode antarmuka ConfigurationChangeListener#onChangeEvent untuk mengubah properti di dalam instance. Artinya, dalam metode ini, atribut yang berubah secara dinamis dipantau. Jika terdeteksi bahwa atribut yang digunakan berbeda dari atribut saat injeksi pertama kali dimulai, atribut yang disimpan dalam instance akan dimodifikasi agar konsisten dengan pusat konfigurasi. sehingga mencapai konfigurasi dinamis.

public class GlobalTransactionalInterceptor implements ConfigurationChangeListener {
private volatile boolean disable = ConfigurationFactory.getInstance().getBoolean(ConfigurationKeys.DISABLE_GLOBAL_TRANSACTION,false);
@Override public Object invoke(Param param) {
   if(disable){//事务业务处理}
}
@Override public void onChangeEvent(Param param) {
   disable = param;
}}

Di atas adalah kode semu yang terkait dengan atribut downgrade GlobalTransactionalInterceptor di bawah modul pegas. Ketika kelas pencegat di atas dipakai, GlobalTrarnsactionalScanner mendaftarkan pencegat tersebut dalam daftar mendengarkan perubahan konfigurasi. Saat konfigurasi diubah, pendengar akan dipanggil:

ConfigurationFactory.getInstance().addConfigListener(ConfigurationKeys.DISABLE_GLOBAL_TRANSACTION,(ConfigurationChangeListener)interceptor);

Penurunan versi berarti ketika fungsi tertentu dari layanan tidak tersedia, fungsi tertentu dimatikan melalui atribut yang dikonfigurasi secara dinamis, untuk menghindari upaya berulang kali untuk menangani kegagalan. interseptor#invoke() Hanya jika atribut penonaktifan ini benar, layanan terkait transaksi seata akan dijalankan.

3. Jelaskan konfigurasinya

Konfigurasi deskriptif kerangka umum biasanya memiliki banyak informasi dan bahkan memiliki hubungan hierarki. Akan lebih mudah menggunakan konfigurasi xml karena struktur pohonnya lebih deskriptif. Namun, kebiasaan saat ini menganjurkan penghapusan konfigurasi yang rumit dan membatasi serta penerapan metode yang disepakati.

Mode Seata AT melakukan pemrosesan transaksi dengan memproksi sumber data, yang tidak terlalu mengganggu pihak bisnis. Seata hanya perlu mengidentifikasi pihak bisnis mana yang perlu mengaktifkan transaksi global saat memulai, sehingga konfigurasi deskriptif dapat dicapai menggunakan anotasi.

@GlobalTransactional(timeoutMills = 300000, name = "busi-doBiz")
public String doBiz(String msg) {}

Jika mode tcc, peserta transaksi juga perlu menggunakan pengidentifikasi anotasi:

@TwoPhaseBusinessAction(name = "tccActionForSpringTest" , commitMethod = "commit", rollbackMethod = "rollback")
public boolean prepare(BusinessActionContext actionContext, int i);
public boolean commit(BusinessActionContext actionContext);
public boolean rollback(BusinessActionContext actionContext);

4. Konfigurasi yang diperluas

Konfigurasi yang diperluas biasanya memiliki persyaratan agregasi produk yang lebih tinggi, karena produk perlu menemukan penerapan pihak ketiga dan menambahkannya ke produk.

Masukkan deskripsi gambar di sini
Ini adalah contoh kelas yang disediakan oleh pusat konfigurasi khusus. Tempatkan file teks dengan nama yang sama dengan antarmuka di bawah META-INF/layanan. Ini adalah cara spi standar. Kemudian ubah config.type=test pada file konfigurasi registry.conf.

Namun jika Anda berpikir bahwa hal ini dapat dikenali oleh seata dan mengganti pusat konfigurasi, Anda salah. Saat seata memuat pusat konfigurasi, ia menggunakan enum ConfigType untuk menggabungkan nilai tipe pusat konfigurasi yang dikonfigurasi dalam file konfigurasi:

private static Configuration buildConfiguration() {
   configTypeName = "test";//registry.conf中配置的config.type
   configType = ConfigType.getType(configTypeName);//ConfigType获取不到会抛异常
}

Jika pengujian tipe pusat konfigurasi tidak ditentukan di ConfigType, pengecualian akan diberikan. Oleh karena itu, sekadar memodifikasi file konfigurasi tanpa mengubah kode sumber tidak dapat menggunakan kelas yang disediakan pusat konfigurasi selain kelas yang disediakan pusat konfigurasi yang ditentukan dalam ConfigType.

Tipe pusat konfigurasi saat ini yang ditentukan dalam ConfigType di versi 1.0 adalah: File, ZK, Nacos, Apollo, Consul, Etcd3, SpringCloudConfig, Custom. Jika pengguna ingin menggunakan tipe pusat konfigurasi yang disesuaikan, ia dapat menggunakan tipe Custom.

Masukkan deskripsi gambar di sini
Anda dapat menggunakan cara yang tidak elegan di sini, yaitu menyediakan kelas implementasi dengan nama tertentu ZK tetapi tingkat yang lebih tinggi order=3 (ZK default order=1), sehingga ConfigurationFactory dapat menggunakan TestConfigurationProvider sebagai kelas penyedia pusat konfigurasi.

Melalui langkah di atas, Anda dapat membiarkan seata menggunakan kode yang kami berikan. Modul seperti codec, kompresor, penemuan, dan integrasi di seata semuanya menggunakan mekanisme spi untuk memuat kelas fungsional, yang sejalan dengan filosofi desain plug-in mikrokernel dan perlakuan yang sama terhadap pihak ketiga.

5. alamat seri analisis kode sumber seata

Penulis: Zhao Runze,Alamat seri