Server konfigurasi cloud pegas - cara menambahkan PropertySource khusus yang terlihat dalam metode findOne() dari EnvironmentEncryptorEnvironmentRepository

Tujuan saya adalah menambahkan PropertySource khusus ke server cloud-spring. Apa yang ingin saya capai adalah mendapatkan beberapa properti khusus dari sumber khusus tersebut di aplikasi spring-cloud-config-client.

Berdasarkan saran dari Menambahkan repositori lingkungan di spring-config-server Saya telah membuat spring-cloud-config-server aplikasi dan proyek terpisah spring-cloud-config-custom. Yang kedua didasarkan pada spring-cloud -konsul-config kode. Jadi, saya telah membuat semua kelas yang diperlukan seperti CustomPropertySource, CustomPropertySourceLocator, CustomConfigBootstrapConfiguration dan seterusnya dan mengonfigurasinya di spring.factories.

Pada akhirnya, saya telah menambahkan ketergantungan maven ke spring-cloud-config-custom di dalam spring-cloud-config-server saya.

Sejauh ini bagus. Semuanya bekerja dengan baik. Ketika saya memulai server saya dapat melihat bahwa CustomPropertySource saya ada di daftar propertySources di dalam EnviromentRepository bean yang disuntikkan ke EnvironmentController.

Masalah: Saat saya mengirim permintaan GET ke @RequestMapping("/{name}/{profiles}/{label:.*}") (dalam EnvironmentController), kacang EnviromentRepository yang disuntikkan sedang digunakan untuk menemukan sumber properti yang diminta (metoderepository.findOne(name, profiles, label)). Sayangnya sumber properti saya tidak dapat ditemukan di sini. Mengapa?

Saya telah menghabiskan banyak waktu untuk men-debug ini. Saya menemukan bahwa repositori mendelegasikan panggilan metode findOne() ke repositori lain: MultipleJGitEnvironmentRepository yang mendelegasikannya ke NativeEnvironmentRepository. Di dalam delegasi ini, metode findOne() tidak menggunakan propertySources dari EnviromentRepository primer yang disuntikkan ke pengontrol. Ini menciptakan repositori lingkungan baru dengan daftar PropertySources baru dan SpringApplication baru yang terpisah. Pada akhirnya, daftar ini tidak berisi CustomPropertySource saya dan itulah sebabnya findOne() mengembalikan propertySources kosong dalam objek Environment yang dihasilkan.

  1. Apakah saya melakukan sesuatu yang salah?
  2. Apakah CustomPropertySourceLocator (dan/atau ConsulPropertySourceLocator) seharusnya digunakan (kabel otomatis/bootstrap) di spring-cloud-config-server atau spring-cloud-config-client
  3. Bisakah spring-cloud-config-server mengirimkan berbagai jenis PropertySources secara bersamaan, melalui antarmuka REST (mengatakan "berbeda" maksud saya semua Git, Konsul, dan Zookeeper)?

person Marek Podyma    schedule 21.12.2016    source sumber
comment
Versi Spring Cloud apa yang Anda gunakan? Sampai baru-baru ini jika ada EnvironmentRepository kacang lain dalam konteksnya, tidak ada kacang EnvironmentRepository default yang akan dibuat, jadi saya bingung tentang bagaimana MultipleJGitEnvironmentRepository atau NativeEnvironmentRepository akan dibuat dalam kasus Anda. Bisakah Anda memberikan contoh aplikasi yang menunjukkan masalah yang Anda lihat?   -  person Ryan Baxter    schedule 22.12.2016
comment
Saya menggunakan 1.1.0.RELEASE.   -  person Marek Podyma    schedule 22.12.2016
comment
Saya menggunakan 1.1.0.RELEASE. EnvironmentRepository disuntikkan ke EnvironmentController awalnya EnvironmentEncryptorEnvironmentRepository. Ini mendelegasikan panggilan ke MultipleJGitEnvironmentRepository yang mewarisi implementasi dari AbstractScmEnvironmentRepository. FindOne() dari yang terakhir membuat NativeEnvironmentRepository baru melewati ConfigurableEnvironment yang berisi CustomPropertySource saya di dalam bootstrapProperties sumber properti. Tampaknya NativeEnvironmentRepository memfilternya karena hardcoded --spring.cloud.bootstrap.enabled=false dalam metode getArgs().   -  person Marek Podyma    schedule 22.12.2016
comment
Sekali lagi beberapa kode yang mereproduksi masalah akan membantu.   -  person Ryan Baxter    schedule 22.12.2016
comment
Saya telah menyiapkan aplikasi teladan dan menyediakannya di sini. Silakan bandingkan hasil pemanggilan konteks /myenv di sisi server dan klien (http:/localhost:8888/myenv dan localhost:8080/ myenv). Sumber properti khusus saya (khusus) tidak tersedia di sisi klien. Perhatikan bahwa klien tidak menggunakan CustomPropertySourceLocator saya secara langsung. Saya mencoba memaksa server untuk melayani CustomPropertySource   -  person Marek Podyma    schedule 29.12.2016


Jawaban (1)


Apa yang Anda lakukan adalah menambahkan sumber properti ke server konfigurasi itu sendiri, bukan konfigurasi yang dilayaninya. Menambahkan spring-boot-starter-actuator ke server konfigurasi Anda dan melihat /env mengungkapkan:

{
  "profiles": [

  ],
  "server.ports": {
    "local.server.port": 8888
  },
  "bootstrapProperties:custom": {
    "test.prop3": "CUSTOM-VALUE-3",
    "test.prop2": "CUSTOM-VALUE-2",
    "test.prop1": "CUSTOM-VALUE-1"
  },
}

Untuk menambahkan sesuatu yang akan dilayani oleh server konfigurasi, Anda harus mengimplementasikan file EnvironmentRepository.

Dukungan untuk komposit EnvironmentRepository baru saja ditambahkan.

person spencergibb    schedule 09.01.2017
comment
Ya, itulah yang akhirnya saya lakukan. Saya telah menerapkan EnvironmentRepository dan berfungsi dengan baik. Pada awalnya, saya yakin bahwa bootstrapProperties yang ditentukan di sisi server harus dapat diakses secara otomatis untuk klien konfigurasi. Sekarang aku paham, Aku salah. Jadi kesimpulannya seperti ini: Pendaftaran otomatis PropertySources hanya untuk penggunaan internal aplikasi yang mendaftarkannya. Dalam kasus saya config-server dapat menggunakan CustomPropertySource saya tetapi tidak dapat mempublikasikannya. Jadi, seperti yang saya pahami, tidak ada cara resmi untuk membuat server konfigurasi untuk melayani bootstrap PropertySources. - person Marek Podyma; 11.01.2017