แหล่งที่มาการกำหนดค่าของแอปพลิเคชันมักจะเป็นเซิร์ฟเวอร์เซิร์ฟเวอร์การกำหนดค่าระยะไกล โดยค่าเริ่มต้นลำดับความสำคัญการกำหนดค่าในท้องถิ่นต่ำกว่าที่เก็บการกำหนดค่าระยะไกล หากคุณต้องการใช้ตัวแปรระบบแอปพลิเคชันท้องถิ่นและไฟล์กำหนดค่าเพื่อเขียนทับค่าคุณสมบัติในที่เก็บระยะไกลคุณสามารถตั้งค่าได้ดังนี้:
ฤดูใบไม้ผลิ: คลาวด์: config: allowoverride: trueoverridenone: trueoverridesystemproperties: false
ผ่านการกำหนดค่าข้างต้นไคลเอนต์สามารถให้ความสำคัญสูงกว่าในการกำหนดค่าท้องถิ่นและไม่สามารถเขียนทับได้ เนื่องจากเวอร์ชันปัจจุบันของ Spring Cloud เราใช้คือ Edgware.RELEASE การตั้งค่าข้างต้นไม่ทำงาน แต่ใช้ค่าเริ่มต้นใน PropertySourceBootstrapProperties สำหรับสถานการณ์เฉพาะดูปัญหา: https://github.com/spring-cloud/spring-cloud-commons/pull/250 เราจะพูดคุยเกี่ยวกับแหล่งที่มาเฉพาะของข้อผิดพลาดในการวิเคราะห์ต่อไปนี้
การวิเคราะห์ซอร์สโค้ด
configservicePropertySourcelocator
การเขียนทับคุณสมบัติการกำหนดค่าระยะไกลในที่สุดเกี่ยวข้องกับการได้รับการกำหนดค่าในช่วงเริ่มต้นของไคลเอนต์ วิธีจัดการกับมันหลังจากได้รับการกำหนดค่า? ลองมาดูไดอะแกรมคลาสของคลาสการซื้อทรัพยากร configservicePropertySourcelocator ใน Spring Cloud Config
configservicePropertySourcelocator เป็นตัวระบุตำแหน่งทรัพยากรอสังหาริมทรัพย์และวิธีการหลักคือตำแหน่ง (สภาพแวดล้อมสภาพแวดล้อม) ขั้นแรกให้แทนที่ตัวยึดตำแหน่งใน configclientProperties ด้วยแอปพลิเคชันโปรไฟล์และฉลากของสภาพแวดล้อมที่แอปพลิเคชันกำลังทำงานอยู่และเริ่มต้น rettemplate จากนั้นวนซ้ำผ่านอาร์เรย์ฉลากจนกว่าจะได้รับข้อมูลการกำหนดค่าที่ถูกต้อง กระบวนการหลักมีดังนี้:
ค้นหา (สภาพแวดล้อมสภาพแวดล้อม) เรียก GetRemoteEnVironment (RestTemplate, คุณสมบัติ, ป้ายกำกับ, สถานะ) วิธีการเพื่อรับข้อมูลการกำหนดค่าบนเซิร์ฟเวอร์ระยะไกลผ่าน HTTP การใช้งานก็ง่ายมาก แสดงตัวยึดตำแหน่งในเส้นทางของคำขอทดแทนจากนั้นรวบรวมส่วนหัว เมื่อประกอบแล้วสามารถส่งคำขอได้และผลลัพธ์จะถูกส่งคืน
ในการใช้งานข้างต้นเราจะเห็นว่าข้อมูลการกำหนดค่าที่ได้รับจะถูกเก็บไว้ใน CompositePropertySource เราจะใช้มันอย่างไร? อีกคลาสที่สำคัญในการเพิ่มที่นี่คือ PropertySourceBootStrapConfiguration ซึ่งใช้อินเตอร์เฟส ApplicationContextInitializer อินเทอร์เฟซนี้จะรีเฟรช () จะถูกเรียกกลับก่อนที่บริบทของแอปพลิเคชันจะได้รับการรีเฟรชซึ่งจะดำเนินการเริ่มต้น สแต็กการโทรหลังจากแอปพลิเคชันเริ่มมีดังนี้:
SpringApplicationBuilder.run () -> springapplication.run () -> springapplication.createandrefreshcontext () -> springapplication.applyinitializers () -> propertysourcebootstrapconfiguration.initialize () คุณสมบัติ
วิธีการตำแหน่งของ configservicepropertysourcelocator ข้างต้นจะถูกเรียกใช้ในการเริ่มต้นเพื่อให้แน่ใจว่าบริบทสามารถรับข้อมูลการกำหนดค่าที่จำเป็นก่อนที่จะรีเฟรช ลองมาดูวิธีการเริ่มต้น:
Public Class PropertySourceBootStrapConfigurationImplements ApplicationContextInitializer <ConfiguRableApplicationContext>, สั่ง {ลำดับ INT ส่วนตัว = สั่งซื้อ HIGHEST_PRECEDENCE + 10; @AutoWired (จำเป็น = false) รายการส่วนตัว <PoreportSourceLocator> PropertySourceLocators = new ArrayList <> (); @Override โมฆะสาธารณะเริ่มต้น (ConfiguRableApplicationContext ApplicationContext) {ComposItePropertySource Composite = New ComposItePropertySource (bootstrap_property_source_name); // เรียงลำดับอาร์เรย์ PropertySourceLocators และติดตามคำอธิบายประกอบเริ่มต้นเริ่มต้น ANNOTTATIONARAREDERNCOMPARATOR.SORT (this.propertySourcelocators); บูลีนว่างเปล่า = true; // รับบริบทสภาพแวดล้อมที่ใช้งานได้สภาพแวดล้อมที่กำหนดค่าได้และสภาพแวดล้อม = ApplicationContext.getEnvironment () สำหรับ (PropertySourcelocator locator: this.propertysourcelocators) {// transtraight this.propertysourcelocators PropertySource <?> source = null; แหล่งที่มา = locator.locate (สภาพแวดล้อม); if (source == null) {ดำเนินการต่อ; } logger.info ("แหล่งที่มาที่ตั้งอยู่:" + แหล่งที่มา); // เพิ่มแหล่งที่มาในรายการที่เชื่อมโยงของคุณสมบัติ Source Composite.addPropertySource (แหล่งที่มา); ว่าง = เท็จ; } // เฉพาะในกรณีที่แหล่งที่มาไม่ว่างเปล่ามันจะถูกตั้งค่าเป็นสภาพแวดล้อมถ้า (ว่างเปล่า) {// ส่งคืนรูปแบบตัวแปรของสภาพแวดล้อมซึ่งสามารถดำเนินการได้เช่น AddFirst และ AddLast MutablePropertySources PropertySources = Environment.getPropertySources (); String logConfig = environment.resolveplaceholders ("$ {logging.config:}"); logfile logfile = logfile.get (สภาพแวดล้อม); if (propertySources.contains (bootstrap_property_source_name)) {// ลบ bootstrapproperties propertysources.remove (bootstrap_property_source_name); } // ตั้งค่าคุณสมบัติ Sources InsertPropertySources (PropertySources, Composite); reinitializeloggingsystem (สภาพแวดล้อม, logConfig, logfile); Setloglevels (สภาพแวดล้อม); // กำจัดข้อมูลการกำหนดค่าหลายรายการของโปรไฟล์ handleincludedProfiles (สภาพแวดล้อม); -ลองมาดูกันว่าการดำเนินการใดที่ดำเนินการในวิธีการเริ่มต้น
ส่งคืนรูปแบบตัวแปรของสภาพแวดล้อมซึ่งสามารถดำเนินการได้เช่น addfirst, addlast
ลบ bootstrapproperties ในอสังหาริมทรัพย์ Sources
ตามกฎของการแทนที่เซิร์ฟเวอร์ config ให้ตั้งค่าคุณสมบัติ Sources
จัดการข้อมูลการกำหนดค่าสำหรับโปรไฟล์ที่ใช้งานอยู่หลายตัว
เมื่อเริ่มต้นวิธีการเริ่มต้นวิธีการ สำรวจ วิธีการ ค้นหา ของ วัตถุ ประเภทต่างๆ บริบทของสปริงคลาวด์ ให้ คุณสมบัติ SourceBootStrapproperties ที่เขียนทับคุณสมบัติระยะไกลและใช้คลาสการกำหนดค่านี้เพื่อกำหนดลำดับความสำคัญของแหล่งที่มาของคุณสมบัติ
โมฆะส่วนตัว InsertPropertySources (MutablePropertySources PropertySources, CompositePropertySource Composite) {MutablePropertySources ขาเข้า = ใหม่ MutablePropertySources (); ขาเข้า. addfirst (คอมโพสิต); PropertySourceBootstrapproperties RemoteProperties = PropertySourceBootStrapproperties (); ใหม่ RelaxedDatabinder (remoteproperties, "Spring.cloud.config"). -bind (PropertySourcesPropertyValues (ขาเข้า)); // หากไม่อนุญาตให้มีการเขียนทับในท้องถิ่น (! remoteproperties.isalloverride () || (! remoteproperties.isoverridenone () && remoteproperties.isoverridesystemproperties ()) {propertysources.addfirst (คอมโพสิต); กลับ; } // overridenone เป็นจริงการกำหนดค่าภายนอกมีลำดับความสำคัญต่ำสุดถ้า (remoteproperties.isoverridenone ()) {propertysources.addlast (คอมโพสิต); กลับ; } if (PropertySources .contains (StandardEnvironment.system_environment_property_source_name)) {// ตั้งค่าลำดับความสำคัญของการกำหนดค่าภายนอก StandardEnvironment.system_environment_property_source_name, คอมโพสิต); } else {PropertySources.addbefore (StandardEnvironment.system_environment_property_source_name, คอมโพสิต); }} else {PropertySources.addlast (คอมโพสิต); -การใช้งานข้างต้นส่วนใหญ่จะปรับลำดับความสำคัญของแหล่งการกำหนดค่าหลายแหล่งตามคุณสมบัติใน PropertySourceBootstrapproperties จากการใช้งานเราจะเห็นได้ว่าออบเจ็กต์คุณสมบัติ SourceBootStrapproperties เริ่มต้นโดยตรงโดยใช้ค่าคุณสมบัติเริ่มต้นและไม่ได้ฉีดลงในสิ่งที่เราตั้งไว้ในไฟล์การกำหนดค่า
ซ่อมแซมการใช้งาน:
@autowired (จำเป็น = false) Private PropertySourceBootStrapproperties RemotePropertiesForOverRiding; @Override public int getOrder () {return this.order; โมฆะส่วนตัว InsertPropertySources (MutablePropertySources PropertySources, CompositePropertySource Composite) {MutablePropertySources ขาเข้า = ใหม่ MutablePropertySources (); ขาเข้า. addfirst (คอมโพสิต); PropertySourceBootStrapproperties RemoteProperties = RemotePropertiesForOverRiding == NULL? ใหม่ PropertySourceBootStrapproperties (): RemotePropertiesForOverRiding;สรุป
ข้างต้นเป็นคำอธิบายโดยละเอียดของสปริงคลาวด์ที่เอาชนะคุณสมบัติการกำหนดค่าระยะไกลที่แนะนำโดยตัวแก้ไข ฉันหวังว่ามันจะเป็นประโยชน์กับทุกคน หากคุณมีคำถามใด ๆ โปรดฝากข้อความถึงฉันและบรรณาธิการจะตอบกลับทุกคนในเวลา ขอบคุณมากสำหรับการสนับสนุนเว็บไซต์ Wulin.com!