โอเคมาพูดคุยเกี่ยวกับเรียงความจากบทความก่อนหน้านี้ต่อไป ในบทความก่อนหน้านี้เรากล่าวว่าหากเราต้องการอัปเดตการกำหนดค่า microservice ทั้งหมดและอัปเดตการกำหนดค่าโดยไม่ต้องรีสตาร์ทเราสามารถพึ่งพา Spring Cloud Config เท่านั้น อย่างไรก็ตามเราจำเป็นต้องส่งคำขอโพสต์จากบริการหนึ่งไปยังอีกบริการหนึ่ง
เราสามารถแบกได้หรือไม่? สิ่งนี้ดีกว่าการขาดศูนย์การกำหนดค่าก่อนหน้านี้ ดังนั้นเราจะดำเนินการต่อเพื่อหลีกเลี่ยงการส่งคำขอโพสต์ไปยังบริการทีละคนเพื่อแจ้งบริการได้อย่างไร ข้อมูลการกำหนดค่าของคุณมีการเปลี่ยนแปลงและคุณต้องแก้ไขข้อมูลการกำหนดค่าในหน่วยความจำในเวลา
ในเวลานี้เราไม่ควรลืมรูปแบบการสมัครสมาชิกของคิวข้อความ บริการทั้งหมดสมัครรับเหตุการณ์นี้ เมื่อเหตุการณ์นี้เปลี่ยนไปไมโครเซิร์ตทั้งหมดสามารถแจ้งให้อัปเดตข้อมูลการกำหนดค่าหน่วยความจำของพวกเขา ในเวลานี้รถบัสข้อความรถบัสสามารถแก้ปัญหาได้ คุณจะต้องออกรีเฟรชทางด้านเซิร์ฟเวอร์ config ของ SpringCloud เพื่อทริกเกอร์การอัปเดต microservice ทั้งหมด
ดังที่แสดงในแผนภาพสถาปัตยกรรมต่อไปนี้:
นอกเหนือจากการรองรับการกำหนดค่าอัตโนมัติของ RabbitMQ แล้ว Spring Cloud Bus ยังรองรับ Kafka ซึ่งตอนนี้ถูกใช้อย่างกว้างขวาง ในบทความนี้เราจะสร้างสภาพแวดล้อมในท้องถิ่นของ Kafka และใช้เพื่อพยายามใช้ Spring Cloud Bus เพื่อสนับสนุน Kafka เพื่อใช้งานฟังก์ชั่นของบัสข้อความ
Kafka ถูกนำมาใช้โดยใช้ Scala และใช้เป็นไปป์ไลน์สำหรับการสตรีมการสตรีมและการประมวลผลข้อมูลการดำเนินงานของ LinkedIn และตอนนี้ บริษัท อินเทอร์เน็ตหลายแห่งใช้กันอย่างแพร่หลายในฐานะท่อส่งข้อมูลและระบบข้อความ
แผนภาพสถาปัตยกรรม Kafak มีดังนี้:
Kafka เป็นระบบส่งข้อความที่ใช้งานตามโหมดการเผยแพร่/การสมัครสมาชิก เป้าหมายการออกแบบหลักมีดังนี้:
1. การคงอยู่ของข้อความ: ให้ความสามารถในการคงอยู่ของข้อความในความซับซ้อนของเวลา o (1) และแม้แต่ข้อมูลที่อยู่เหนือระดับวัณโรคสามารถมั่นใจได้ว่าประสิทธิภาพการเข้าถึงด้วยความซับซ้อนของเวลาคงที่
2. ปริมาณงานสูง: นอกจากนี้ยังสามารถรองรับปริมาณงานมากกว่า 100k ต่อวินาทีในเครื่องจักรเชิงพาณิชย์ราคาถูก
3. กระจาย: สนับสนุนการแบ่งพาร์ติชันข้อความและการบริโภคแบบกระจายและตรวจสอบให้แน่ใจว่ามีการสั่งซื้อข้อความภายในพาร์ติชัน
4. Cross-Platform: สนับสนุนลูกค้าที่มีแพลตฟอร์มทางเทคนิคที่แตกต่างกัน (เช่น: Java, PHP, Python ฯลฯ )
5. เรียลไทม์: สนับสนุนการประมวลผลข้อมูลแบบเรียลไทม์และการประมวลผลข้อมูลออฟไลน์
6. ความสามารถในการปรับขนาด: รองรับการขยายตัวในแนวนอน
แนวคิดพื้นฐานบางอย่างที่เกี่ยวข้องกับ Kafka:
1.broker: กลุ่ม Kafka มีเซิร์ฟเวอร์หนึ่งเซิร์ฟเวอร์หรือมากกว่าซึ่งเรียกว่าโบรกเกอร์
2.Topic: ตรรกะคล้ายกับคิวคิวของกระต่ายแต่ละข้อความที่โพสต์ไปยังคลัสเตอร์ Kafka ต้องมีหัวข้อ (ข้อความที่มีหัวข้อต่าง ๆ จะถูกจัดเก็บแยกต่างหากแม้ว่าข้อความเชิงตรรกะของหัวข้อจะถูกเก็บไว้ในโบรกเกอร์หนึ่งตัวหรือมากกว่านั้นผู้ใช้จะต้องระบุหัวข้อของข้อความในการผลิตหรือบริโภคข้อมูลโดยไม่สนใจว่าข้อมูลจะถูกเก็บไว้ที่ไหน)
3. พาร์ติชัน: พาร์ติชันเป็นพาร์ติชันในแนวคิดทางกายภาพ เพื่อให้ข้อมูลผ่านระบบแต่ละหัวข้อจะถูกแบ่งออกเป็นหนึ่งพาร์ติชันหรือมากกว่าหนึ่งพาร์ติชันและแต่ละพาร์ติชันสอดคล้องกับโฟลเดอร์ (จัดเก็บเนื้อหาข้อความและไฟล์ดัชนีของพาร์ติชันที่เกี่ยวข้อง)
4. ผู้ผลิต: ผู้ผลิตข้อความรับผิดชอบในการผลิตข้อความและส่งไปยังนายหน้า Kafka
5.Consumer: ผู้บริโภคข้อความลูกค้าที่อ่านข้อความถึงนายหน้า Kafka และประมวลผล
6. กลุ่มผู้บริโภค: ผู้บริโภคแต่ละรายเป็นของกลุ่มที่เฉพาะเจาะจง (ผู้บริโภคแต่ละรายสามารถระบุเป็นกลุ่มและหากไม่ได้ระบุจะเป็นของกลุ่มเริ่มต้น) กลุ่มสามารถใช้ในการใช้งานฟังก์ชั่นเช่นข้อความที่สมาชิกหลายคนบริโภคในกลุ่ม
คุณสามารถดูได้จากแผนภาพสถาปัตยกรรม Kafka ที่ Kafka ต้องการการสนับสนุน Zookeeper คุณต้องระบุตำแหน่งที่ Zookeeper อยู่ในการกำหนดค่า Kafka ของคุณ มันให้การรับประกันความน่าเชื่อถือบางอย่างผ่าน Zookeeper และเป็น Master และ Slave of Broker เราจำเป็นต้องรู้ว่าข้อความ Kafka ถูกจัดระเบียบในรูปแบบหัวข้อ ผู้ผลิตส่งข้อความแบบฟอร์มหัวข้อและผู้บริโภคจะถูกแบ่งตามกลุ่มดังนั้นกลุ่มของผู้บริโภคทุกคนจะต้องใช้ข้อความแบบฟอร์มหัวข้อเดียวกัน ทางด้านเซิร์ฟเวอร์มันยังสร้างเศษบางส่วนดังนั้นหัวข้ออาจแจกจ่ายบนเศษต่าง ๆ ซึ่งอำนวยความสะดวกให้เราขยายและปรับใช้หลายเครื่อง Kafka มีการกระจายตามธรรมชาติ สำหรับการสาธิตที่นี่เราจำเป็นต้องใช้การกำหนดค่าเริ่มต้นและทำการสาธิตเล็ก ๆ บน Windows
เรามุ่งเน้นไปที่การสนับสนุนของ Spring Cloud Bus สำหรับ Kafka ซึ่งใช้ฟังก์ชั่นของบัสข้อความ สำหรับคิวข้อความ KAFKA และ RABBITMQ ที่เฉพาะเจาะจงเราหวังว่าจะหาข้อมูลเพื่อเรียนรู้ด้วยตัวเอง ด้วยการสนับสนุนแนวคิดบางอย่างเราทำการสาธิต
ดังนี้: อันดับแรกให้สร้างโมดูล SpringCloud-Config-Client1 ใหม่เพื่ออำนวยความสะดวกในการทดสอบของเรา การอ้างอิงที่แนะนำมีดังนี้:
<การพึ่งพา> <roupId> org.springframework.boot </groupId> <ratifactid> Spring-Boot-Starter-actuator </artifactid> </serverency> <preferency> <sdependency> <RoupID> org.springframework.cloud </groupId> <ratifactid> Spring-Cloud-Starter-Config </artifactid> <sersion> 1.4.0.Release </Servive> </predency> <Sersion> 1.3.5.Release </เวอร์ชัน> </การพึ่งพา> <การพึ่งพา> <roupId> org.springframework.cloud </groupId> <ratifactid> Spring-Cloud-Starter-Bus-Kafka </artifactid>
ถัดไปโปรดทราบว่าไฟล์การกำหนดค่าของ client1 ควรเปลี่ยนเป็น bootstrap.yml เนื่องจากรูปแบบการกำหนดค่านี้เป็นที่ต้องการ ดังที่ได้กล่าวไว้ในบทความก่อนหน้าการกำหนดค่าของ client1 มีดังนี้:
เซิร์ฟเวอร์: พอร์ต: 7006Spring: แอปพลิเคชัน: ชื่อ: Cloud-Config Cloud: config:#สภาพแวดล้อมที่ใช้เพื่อเริ่มต้น? Dev แสดงถึงสภาพแวดล้อมการพัฒนา สิ่งนี้เกี่ยวข้องกับคำต่อท้ายของไฟล์ในคลังสินค้าของคุณ ตัวอย่างเช่นรูปแบบการตั้งชื่อของไฟล์การกำหนดค่าคลังสินค้าคือ Cloud-Config-dev.properties ดังนั้นโปรไฟล์จะต้องเขียนโปรไฟล์ dev: dev discovery: เปิดใช้งาน: true# ชื่อนี้เป็นชื่อบริการของฝั่งเซิร์ฟเวอร์ config และคุณไม่สามารถเขียนได้อย่างสุ่มสี่สุ่มห้า Service-id: config-server#ลงทะเบียนศูนย์ Eureka: ไคลเอนต์: Service-URL: defaultZone: http: // localhost: 8888/Eureka/, http: // localhost: 8889/Eureka/#ไม่จำเป็นต้องได้รับอนุญาตหรือไม่? ค่าเริ่มต้นเป็นจริง หากคุณไม่เท็จคุณจะไม่ได้รับอนุญาตให้ดึงเนื้อหาที่อัปเดตโดยการจัดการเซิร์ฟเวอร์ศูนย์การกำหนดค่า: ความปลอดภัย: เปิดใช้งาน: เท็จ
จากนั้นเริ่มชั้นเรียนดังนี้:
@springbootapplication@enablecoveryClientPublic คลาสไคลเอ็นต์แอปพลิเคชัน {โมฆะคงที่สาธารณะหลัก (สตริง [] args) {springapplication.run (client1application.class, args); -จากนั้นกำหนดสำเนาของ TestController ในไคลเอนต์ให้กับ client1 รหัสมีดังนี้:
@restcontroller // คุณสมบัติที่นี่อาจได้รับการอัปเดต หากศูนย์การกำหนดค่าในการเปลี่ยนแปลง GIT จะต้องรีเฟรช หากไม่มีคำอธิบายประกอบนี้การกำหนดค่าจะไม่สามารถอัปเดตได้ในเวลา @RefReshScopepEpublic คลาส TestController {@Value ("$ {name}") ชื่อสตริงส่วนตัว; @Value ("$ {อายุ}") อายุจำนวนเต็มส่วนตัว; @requestmapping ("/ทดสอบ") การทดสอบสตริงสาธารณะ () {return this.name+this.age; -จากนั้นเพิ่มการกำหนดค่าต่อไปนี้ในเซิร์ฟเวอร์ config ในโมดูลในเรียงความก่อนหน้า:
#จะต้องได้รับอนุญาตให้ดึงค่าเริ่มต้นเป็นจริง หากคุณไม่เท็จคุณจะไม่ได้รับอนุญาตให้ดึงเนื้อหาที่อัปเดตโดยการจัดการเซิร์ฟเวอร์ศูนย์การกำหนดค่า: ความปลอดภัย: เปิดใช้งาน: เท็จ
ต่อไปเราต้องทำสิ่งหนึ่ง: config-client, config-client1 และ config-server ต้องแนะนำการพึ่งพา Kafka ดังต่อไปนี้:
<การพึ่งพา> <roupId> org.springframework.cloud </groupId> <ratifactid> Spring-Cloud-Starter-Bus-Kafka </artifactid>
โครงการของเราพร้อมแล้วเราจะวางไว้ที่นี่ในขณะนี้ มาติดตั้งและดาวน์โหลด Kafka ด้านล่าง ก่อนอื่นเราไปที่เว็บไซต์อย่างเป็นทางการของ Kafka kafka.apache.org/downloads เพื่อไปที่เวอร์ชันที่แนะนำในเว็บไซต์ทางการ
ก่อนอื่นเราป้อนไดเรกทอรี kafka ที่ดาวน์โหลดและแก้ไข kafka-run-class.bat ภายใต้ kafka_2.11-1.1.0/bin/windows ดังนี้:
ค้นหาการกำหนดค่านี้ดังนี้:
คัดลอกรหัสดังต่อไปนี้: ชุดคำสั่ง =%java%kafka_heap_opts%kafka_jvm_performance_opts%kafka_jmx_opts%kafka_log4j_opts%-cp%classpath%kafka_opts%*
คุณจะเห็นว่า % classpath % ไม่มีคำพูดสองเท่า
ดังนั้นใส่ไว้ในคำพูดสองครั้งมิฉะนั้นจะไม่สามารถเริ่มต้นได้ มีรายงานว่า JDK ของคุณไม่ได้ติดตั้งอย่างถูกต้อง หลังจากการแก้ไขมันมีดังนี้:
คัดลอกรหัสดังนี้: ชุดคำสั่ง =%java%%kafka_heap_opts%kafka_jvm_performance_opts%%kafka_jmx_opts%kafka_log4j_opts%-cp "%classpath%"%kafka_opts%
ถัดไปเปิดเซิร์ฟเวอร์ properties ในโฟลเดอร์ config และกำหนดค่าดังต่อไปนี้:
คุณจะเห็นว่ามันเชื่อมต่อกับผู้ดูแลสัตว์ในท้องถิ่น
จากนั้นเราเริ่ม Zookeeper ก่อนจากนั้น Kafka ดังนี้:
เมื่อคุณเห็นข้อมูลข้างต้นมันพิสูจน์ได้ว่าการเริ่มต้นของ Zookeeper นั้นประสบความสำเร็จ -
ถัดไปเริ่ม Kafka ด้วย CMD อื่นดังนี้:
การดูข้อมูลนี้หมายความว่า Kafka ได้รับการเปิดตัวเรียบร้อยแล้ว
ตกลงมาเริ่มโครงการก่อนหน้านี้ศูนย์การลงทะเบียนสองแห่งหนึ่ง SpringCloud-Config-Server หนึ่ง SpringCloud-Config-Client และ SpringCloud-Config-Client1
คุณจะเห็นว่า SpringCloudbus อยู่ใน 0 Shard หากข้อมูลข้างต้นปรากฏขึ้นในทั้งสอง colid-client จะพิสูจน์ได้ว่าการเริ่มต้นนั้นสำเร็จ
ตกลงตอนนี้มาเข้าถึงด้านการกำหนดค่าเซิร์ฟเวอร์ดังต่อไปนี้:
เยี่ยมชมลูกค้าอีกสองรายดังนี้:
โอเคการแสดงได้เริ่มขึ้นแล้ว ตอนนี้เราไปที่ที่เก็บ GIT เพื่อแก้ไขไฟล์ศูนย์การกำหนดค่าและเปลี่ยนอายุ 24 ดังต่อไปนี้:
ต่อไปเราจะใช้รีเฟรชเพื่อรีเฟรชการกำหนดค่าเซิร์ฟเวอร์การกำหนดค่าและแจ้งให้ไคลเอนต์ทั้งสองอัปเดตข้อมูลการกำหนดค่าในหน่วยความจำ ใช้บุรุษไปรษณีย์เพื่อส่ง LocalHost: 7000/BUS/Refresh ดังนี้:
คุณจะเห็นว่าไม่มีข้อมูลใดถูกส่งคืน แต่ไม่ต้องกังวลนี่เป็นการแจ้งเตือนที่ประสบความสำเร็จแก่ลูกค้าทุกคนเพื่ออัปเดตข้อมูลในหน่วยความจำ
จากนั้นเราขอให้มีการกำหนดค่าเซิร์ฟเวอร์และไคลเอนต์สองรายเพื่อรีเฟรชหน้าและผลลัพธ์จะเป็นดังนี้:
ลูกค้าสองรายมีดังนี้:
คุณจะเห็นว่าไคลเอนต์ทั้งหมดอัปเดตข้อมูลการกำหนดค่าในหน่วยความจำโดยอัตโนมัติ
จนถึงตอนนี้ด้านบนได้รีเฟรชข้อมูลการกำหนดค่า มันก็โอเคถ้าเราต้องการรีเฟรชข้อมูลการกำหนดค่าของบริการเฉพาะ เราสามารถระบุช่วงการรีเฟรชดังนี้:
ระบุช่วงการรีเฟรช
ในตัวอย่างข้างต้นเราทริกเกอร์ /refresh สำหรับอินสแตนซ์บริการอื่น ๆ บนบัสโดยขอสปริงคลาวด์บัส /bus/refresh อินเทอร์เฟซจากอินสแตนซ์บริการ อย่างไรก็ตามในสถานการณ์พิเศษบางอย่าง (เช่นการเปิดตัวสีเทา) เราหวังว่าจะรีเฟรชการกำหนดค่าของอินสแตนซ์เฉพาะใน microservice
Spring Cloud Bus ยังได้รับการสนับสนุนที่ดีสำหรับสถานการณ์นี้: /bus/refresh ยังมีพารามิเตอร์ destination เพื่อค้นหาแอปพลิเคชันเฉพาะเพื่อรีเฟรช ตัวอย่างเช่นเราสามารถขอ /bus/refresh?destination=服务名字:9000 ในเวลานี้แต่ละอินสแตนซ์แอปพลิเคชันบนบัสจะพิจารณาว่าเป็นชื่ออินสแตนซ์ของตัวเองตามค่าของ destination หรือไม่
หากตรงตามการกำหนดค่าการกำหนดค่าจะถูกรีเฟรช หากการกำหนดค่าไม่ตรงกันข้อความจะถูกละเว้น
นอกเหนือจากการวางตำแหน่งอินสแตนซ์เฉพาะพารามิเตอร์ destination ยังสามารถใช้ในการจัดตำแหน่งบริการเฉพาะ หลักการของบริการการวางตำแหน่งถูกนำมาใช้โดยใช้ Pathmatecher ของ Spring ตัวอย่างเช่น: /bus/refresh?destination=customers:** ซึ่งจะกระตุ้นทุกกรณีของบริการ customers เพื่อรีเฟรช
ข้างต้นเป็นเนื้อหาทั้งหมดของบทความนี้ ฉันหวังว่ามันจะเป็นประโยชน์ต่อการเรียนรู้ของทุกคนและฉันหวังว่าทุกคนจะสนับสนุน wulin.com มากขึ้น