เซิร์ฟเวอร์การกำหนดค่า Spring cloud - วิธีเพิ่ม PropertySource แบบกำหนดเองที่มองเห็นได้ในเมธอด findOne () ของ EnvironmentEncryptorEnvironmentRepository

เป้าหมายของฉันคือการเพิ่ม PropertySource ที่กำหนดเองให้กับ spring-cloud-server สิ่งที่ฉันต้องการบรรลุคือการได้รับคุณสมบัติที่กำหนดเองจากแหล่งที่มาที่กำหนดเองนั้นในแอปพลิเคชัน spring-cloud-config-client

อิงตามคำแนะนำจาก การเพิ่มที่เก็บสภาพแวดล้อมใน spring-config-server I ได้สร้าง spring-cloud-config-server แอปพลิเคชันและแยกโครงการ spring-cloud-config-custom แล้ว อันที่สองขึ้นอยู่กับ spring-cloud รหัส -consul-config ดังนั้นฉันจึงสร้างคลาสที่จำเป็นทั้งหมด เช่น CustomPropertySource, CustomPropertySourceLocator, CustomConfigBootstrapConfiguration และอื่นๆ และกำหนดค่าไว้ใน spring.factories

ในตอนท้ายฉันได้เพิ่มการพึ่งพา Maven ให้กับ spring-cloud-config-custom ภายใน spring-cloud-config-server ของฉัน

จนถึงตอนนี้ดีมาก ทุกอย่างทำงานได้ดี เมื่อฉันเริ่มเซิร์ฟเวอร์ ฉันเห็นว่า CustomPropertySource ของฉันอยู่ในรายการของ propertySources ภายใน EnviromentRepository bean ที่ฉีดไปที่ EnvironmentController

ปัญหา: เมื่อฉันส่งคำขอ GET ไปที่ @RequestMapping("/{name}/{profiles}/{label:.*}") (ใน EnvironmentController) การฉีด EnviromentRepository bean จะถูกนำมาใช้เพื่อค้นหาแหล่งที่มาของคุณสมบัติที่ร้องขอ (วิธี repository.findOne(name, profiles, label)) ขออภัย ไม่พบแหล่งที่มาของทรัพย์สินของฉันที่นี่ ทำไม

ฉันใช้เวลามากในการแก้ไขข้อบกพร่องนี้ ฉันพบว่าการมอบหมายพื้นที่เก็บข้อมูล findOne() วิธีการเรียกไปยังพื้นที่เก็บข้อมูลอื่น: MultipleJGitEnvironmentRepository ซึ่งมอบหมายให้ NativeEnvironmentRepository ภายในผู้รับมอบสิทธิ์นี้ เมธอด findOne() ไม่ได้ใช้ propertySources จาก EnviromentRepository primary ที่ฉีดไปยังคอนโทรลเลอร์ สร้างพื้นที่เก็บข้อมูลสภาพแวดล้อมใหม่พร้อมรายการ PropertySources ใหม่และ SpringApplication ใหม่แยกกัน ในตอนท้าย รายการนี้ไม่มี CustomPropertySource ของฉัน และนั่นคือสาเหตุที่ findOne() ส่งคืน propertySources ว่างเปล่าในผลลัพธ์ Environment วัตถุ

  1. ฉันทำอะไรผิดหรือเปล่า?
  2. ควรใช้ CustomPropertySourceLocator (และ/หรือ ConsulPropertySourceLocator) (autowired/bootstrapped) ใน spring-cloud-config-server หรือ spring-cloud-config-client
  3. spring-cloud-config-server สามารถส่ง PropertySources ประเภทต่างๆ มากมายในเวลาเดียวกันผ่านอินเทอร์เฟซ REST ได้หรือไม่ (พูดว่า "แตกต่าง" ฉันหมายถึง Git, กงสุล และ Zookeeper ทั้งหมด)

person Marek Podyma    schedule 21.12.2016    source แหล่งที่มา
comment
คุณใช้ Spring Cloud เวอร์ชันใดอยู่ จนกระทั่งเมื่อไม่นานมานี้ หากมี EnvironmentRepository bean อีกอันในบริบท จะไม่มีการสร้าง EnvironmentRepository bean เริ่มต้น ดังนั้นฉันสับสนเกี่ยวกับวิธีการสร้าง MultipleJGitEnvironmentRepository หรือ NativeEnvironmentRepository ในกรณีของคุณ คุณสามารถให้แอปตัวอย่างที่แสดงให้เห็นถึงปัญหาที่คุณพบอยู่ได้หรือไม่   -  person Ryan Baxter    schedule 22.12.2016
comment
ฉันใช้ 1.1.0.RELEASE   -  person Marek Podyma    schedule 22.12.2016
comment
ฉันใช้ 1.1.0.RELEASE EnvironmentRepository ฉีดไปที่ EnvironmentController ในตอนแรก EnvironmentEncryptorEnvironmentRepository มอบหมายการโทรไปที่ MultipleJGitEnvironmentRepository ซึ่งสืบทอดการใช้งานจาก AbstractScmEnvironmentRepository FindOne() จากอันสุดท้ายทำให้ new NativeEnvironmentRepository ผ่าน ConfigurableEnvironment ซึ่งมี CustomPropertySource ของฉันภายใน bootstrapProperties แหล่งที่มาของคุณสมบัติ ดูเหมือนว่า NativeEnvironmentRepository จะกรองมันเนื่องจาก hardcoded --spring.cloud.bootstrap.enabled=false ในเมธอด getArgs()   -  person Marek Podyma    schedule 22.12.2016
comment
โค้ดบางตัวที่สร้างปัญหาขึ้นมาใหม่อีกครั้งจะช่วยได้   -  person Ryan Baxter    schedule 22.12.2016
comment
ฉันได้เตรียมแอปพลิเคชันที่เป็นแบบอย่างและเปิดให้ใช้งานที่นี่ กรุณาเปรียบเทียบผลลัพธ์ของการเรียกบริบท /myenv บนเซิร์ฟเวอร์และฝั่งไคลเอ็นต์ (http://localhost:8888/myenv และ localhost:8080/ myenv) แหล่งที่มาของคุณสมบัติที่กำหนดเองของฉัน (กำหนดเอง) ไม่พร้อมใช้งานบนฝั่งไคลเอ็นต์ โปรดทราบว่าไคลเอ็นต์ไม่ได้ใช้ CustomPropertySourceLocator ของฉันโดยตรง ฉันกำลังพยายามบังคับให้เซิร์ฟเวอร์ให้บริการ CustomPropertySource   -  person Marek Podyma    schedule 29.12.2016


คำตอบ (1)


สิ่งที่คุณกำลังทำคือการเพิ่มแหล่งที่มาของคุณสมบัติให้กับเซิร์ฟเวอร์การกำหนดค่า ไม่ใช่การกำหนดค่าที่ให้บริการ การเพิ่ม spring-boot-starter-actuator ไปยังเซิร์ฟเวอร์ปรับแต่งของคุณและการดู /env จะเผยให้เห็น:

{
  "profiles": [

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

หากต้องการเพิ่มสิ่งที่จะให้บริการโดยเซิร์ฟเวอร์ปรับแต่ง คุณต้องใช้ EnvironmentRepository

เพิ่มการรองรับคอมโพสิต EnvironmentRepository แล้ว

person spencergibb    schedule 09.01.2017
comment
ใช่แล้ว นั่นคือสิ่งที่ฉันทำในที่สุด ฉันใช้ EnvironmentRepository แล้วและทำงานได้ดี ในตอนแรก ฉันเชื่อว่า bootstrapProperties ที่กำหนดบนฝั่งเซิร์ฟเวอร์ควรสามารถเข้าถึงได้โดยอัตโนมัติสำหรับไคลเอนต์การกำหนดค่า ตอนนี้ฉันเข้าใจแล้วว่า ฉันคิดผิด ข้อสรุปจึงเป็นดังนี้: การลงทะเบียนอัตโนมัติ PropertySources มีไว้สำหรับใช้ภายในเท่านั้นของแอปพลิเคชันที่ลงทะเบียนไว้ ในกรณีของฉัน config-server สามารถใช้ CustomPropertySource ของฉันได้ แต่ไม่สามารถเผยแพร่ได้ ตามที่ฉันเข้าใจ ไม่มีวิธีที่เป็นทางการในการสร้าง config-server เพื่อให้บริการเป็น bootstrap PropertySources - person Marek Podyma; 11.01.2017