Bas Awan Musim Semi

1. Gambaran keseluruhan

Dalam artikel ini, kita akan melihat projek Spring Cloud Bus yang baru. Spring Cloud Bus menggunakan broker pesanan ringan untuk menghubungkan nod sistem yang diedarkan. Penggunaan utama adalah untuk menyiarkan perubahan konfigurasi atau maklumat pengurusan lain. Kita boleh memikirkannya sebagai Penggerak yang diedarkan.

Projek ini menggunakan broker AMQP sebagai pengangkutan, tetapi Apache Kafka atau Redis dapat digunakan sebagai ganti RabbitMQ. Pengangkutan lain belum disokong.

Sepanjang tutorial ini, kami akan menggunakan RabbitMQ sebagai pengangkutan utama kami - yang semestinya sudah kami jalankan.

2. Prasyarat

Sebelum kita mulai, disarankan untuk telah menyelesaikan "Pengenalan Pantas untuk Spring Cloud Configuration". Kami akan menggunakan pelayan dan klien konfigurasi awan yang ada untuk memperluasnya dan menambahkan pemberitahuan automatik mengenai perubahan konfigurasi.

2.1. ArnabMQ

Mari mulakan dengan RabbitMQ, yang kami cadangkan untuk berjalan sebagai RabbitMQ sebagai imej pelabuhan. Ini cukup mudah untuk disiapkan - untuk membolehkan RabbitMQ berjalan secara tempatan, kita perlu memasang Docker dan menjalankan perintah berikut setelah Docker berjaya dipasang:

docker pull rabbitmq:3-management

Perintah ini menarik gambar pelabuhan RabbitMQ bersama dengan plugin pengurusan yang dipasang dan diaktifkan secara lalai.

Seterusnya, kita boleh menjalankan RabbitMQ:

docker run -d --hostname my-rabbit --name some-rabbit -p 15672:15672 -p 5672:5672 rabbitmq:3-management

Sebaik sahaja kami melaksanakan perintah, kami boleh pergi ke penyemak imbas web dan membuka // localhost: 15672, yang akan menunjukkan borang log masuk konsol pengurusan. Nama pengguna lalai adalah: 'guest' ; kata laluan: 'tetamu' . RabbitMQ juga akan mendengar di port 5672.

3. Menambah Penggerak ke Cloud Config Client

Kita harus mempunyai pelayan konfigurasi awan dan klien konfigurasi awan yang berjalan. Untuk menyegarkan perubahan konfigurasi, restart pelanggan diperlukan setiap masa - yang tidak sesuai.

Mari hentikan pelanggan konfigurasi dan beri anotasi kelas pengawal ConfigClient dengan @RefreshScope :

@SpringBootApplication @RestController @RefreshScope public class SpringCloudConfigClientApplication { // Code here... }

Akhirnya, mari kita kemas kini fail pom.xml dan tambahkan Penggerak:

 org.springframework.boot spring-boot-actuator 2.2.6.RELEASE 

Versi terbaru boleh didapati di sini.

Secara lalai, semua titik akhir sensitif yang ditambahkan oleh penggerak dilindungi. Ini termasuk titik akhir '/ refresh' . Untuk kesederhanaan, kami akan mematikan keselamatan dengan mengemas kini bootstrap.properties :

management.security.enabled=false

Selain itu, bermula dengan Spring Boot 2, titik akhir penggerak tidak terdedah secara lalai. Untuk menjadikannya tersedia untuk akses, kami perlu menambahkannya dalam aplikasi.yml :

management: endpoints: web: exposure: include: "*"

Mari mulakan pelanggan terlebih dahulu dan kemas kini peranan pengguna dari 'Pembangun' yang sedia ada ke 'Programmer' dalam fail sifat di GitHub. Pelayan konfigurasi akan langsung menunjukkan nilai yang dikemas kini; namun, pelanggan tidak akan. Untuk membuat pelanggan melihat fail baru, kita hanya perlu menghantar permintaan POST kosong ke titik akhir '/ refresh' , yang ditambahkan oleh penggerak:

$> curl -X POST //localhost:8080/actuator/refresh

Kami akan mendapatkan kembali fail JSON yang menunjukkan sifat kemas kini:

[ "user.role" ]

Akhirnya, kita dapat memeriksa sama ada peranan pengguna telah dikemas kini:

$> curl //localhost:8080/whoami/Mr_Pink Hello Mr_Pink! You are a(n) Programmer and your password is 'd3v3L'.

Peranan pengguna berjaya dikemas kini dan dengan memanggil '/ refresh' endpoint. Konfigurasi pelanggan dikemas kini tanpa memulakan semula.

4. Bas Awan Musim Semi

Dengan menggunakan Actuator, kita dapat menyegarkan pelanggan. Namun, dalam persekitaran awan, kita perlu pergi ke setiap klien dan memuatkan semula konfigurasi dengan mengakses titik akhir penggerak.

Untuk menyelesaikan masalah ini, kita boleh menggunakan Spring Cloud Bus.

4.1. Pelanggan

Kita perlu mengemas kini klien konfigurasi awan supaya dapat melanggan pertukaran RabbitMQ:

 org.springframework.cloud spring-cloud-starter-bus-amqp 2.2.1.RELEASE 

Versi terbaru boleh didapati di sini.

Untuk menyelesaikan perubahan klien konfigurasi, kita perlu menambahkan perincian RabbitMQ dan mengaktifkan bas awan dalam fail application.yml :

--- spring: rabbitmq: host: localhost port: 5672 username: guest password: guest cloud:   bus:       enabled: true refresh:         enabled: true 

Harap maklum bahawa kami menggunakan nama pengguna dan kata laluan lalai. Ini perlu dikemas kini untuk kehidupan sebenar, aplikasi pengeluaran. Untuk tutorial ini baik-baik saja.

Sekarang, pelanggan akan mempunyai titik akhir '/ bas-refresh' yang lain . Memanggil titik akhir ini akan menyebabkan:

  • dapatkan konfigurasi terkini dari pelayan konfigurasi dan kemas kini konfigurasinya yang dijelaskan oleh @RefreshScope
  • hantar mesej ke pertukaran AMQP yang memaklumkan mengenai acara penyegaran
  • semua nod yang dilanggan akan mengemas kini konfigurasi mereka juga

Dengan cara ini, kita tidak perlu pergi ke nod individu dan mencetuskan kemas kini konfigurasi.

4.2. Pelayan

Akhirnya, mari kita tambahkan dua kebergantungan untuk mengkonfigurasi pelayan untuk mengautomasikan perubahan konfigurasi sepenuhnya.

 org.springframework.cloud spring-cloud-config-monitor 2.2.2.RELEASE 

Versi terbaru boleh didapati di sini.

 org.springframework.cloud spring-cloud-starter-stream-rabbit 3.0.4.RELEASE 

Versi terbaru boleh didapati di sini.

Kami akan menggunakan monitor-cloud-config-monitor untuk memantau perubahan konfigurasi dan menyiarkan peristiwa menggunakan RabbitMQ sebagai pengangkutan.

Kita hanya perlu mengemas kini application.properties dan memberikan perincian RabbitMQ:

spring.rabbitmq.host=localhost spring.rabbitmq.port=5672 spring.rabbitmq.username=guest spring.rabbitmq.password=guest

4.3. Webhook GitHub

Everything is set now. Once the server gets notified about configuration changes, it will broadcast this as a message to RabbitMQ. The client will listen to messages and update its configuration when configuration change event is transmitted. However, how a server will now about the modification?

We need to configure a GitHub Webhook. Let's go to GitHub and open our repository holding configuration properties. Now, let's select Settings and Webhook. Let's click on Add webhook button.

Payload URL is the URL for our config server ‘/monitor' endpoint. In our case the URL will be something like this:

//root: [email protected] _IP:8888/monitor

We just need to change Content type in the drop-down menu to application/json. Next, please leave Secret empty and click on Add webhook button – after that, we are all set.

5. Testing

Let's make sure all applications are running. If we go back and check client it will show user.role as ‘Programmer' and user.password as ‘d3v3L‘:

$> curl //localhost:8080/whoami/Mr_Pink Hello Mr_Pink! You are a(n) Programmer and your password is 'd3v3L'.

Previously, we had to use ‘/refresh' endpoint to reload configuration changes. Let's open properties file, change user.role back to Developer and push the changes:

user.role=Programmer

If we check the client now, we will see:

$> curl //localhost:8080/whoami/Mr_Pink Hello Mr_Pink! You are a(n) Developer and your password is 'd3v3L'.

Pelanggan Config mengemas kini konfigurasinya tanpa memulakan semula dan tanpa penyegaran eksplisit hampir serentak. Kita boleh kembali ke GitHub dan membuka Webhook yang baru dibuat. Di bahagian paling bawah, terdapat Penghantaran Terkini. Kita boleh memilih satu di bahagian atas senarai (dengan anggapan ini adalah perubahan pertama - tetap akan ada satu) dan memeriksa JSON yang telah dihantar ke pelayan konfigurasi.

Kami juga dapat memeriksa log konfigurasi dan pelayan, dan kami akan melihat entri:

o.s.cloud.bus.event.RefreshListener: Received remote refresh request. Keys refreshed []

6. Kesimpulannya

Dalam artikel ini, kami menggunakan pelayan dan klien konfigurasi awan musim bunga yang ada dan menambahkan titik akhir penggerak untuk menyegarkan semula konfigurasi pelanggan. Seterusnya, kami menggunakan Spring Cloud Bus untuk menyiarkan perubahan konfigurasi dan mengautomasikan kemas kini pelanggan. Kami juga mengkonfigurasi GitHub Webhook dan menguji keseluruhan persediaan.

Seperti biasa, kod yang digunakan semasa perbincangan boleh didapati di GitHub.