Zuul เป็นตัวโหลดบาลานซ์ตามการกำหนดเส้นทาง JVM และฝั่งเซิร์ฟเวอร์ที่ผลิตโดย Netflix
ฟังก์ชั่น Zuul:
เอ็นจิ้นกฎของ Zuul อนุญาตให้เขียนกฎและตัวกรองผ่านภาษา JVM ใด ๆ และสนับสนุนการก่อสร้างที่ใช้ Java และ Groovy
คุณสมบัติการกำหนดค่า zuul.max.host.connection ถูกแทนที่ด้วยคุณสมบัติการกำหนดค่าใหม่สองคุณสมบัติ zuul.host.maxtotalconnections (จำนวนการเชื่อมต่อทั้งหมด) และ Zuul.host.Maxperrouteconnections (จำนวนการเชื่อมต่อต่อเส้นทาง) มีค่าเริ่มต้น 200 และ 20 ตามลำดับ
1. ทำไมต้องใช้สิ่งนี้
ในระบบ microservice ที่สร้างขึ้นบน SpringCloud, Gateway Zuul มักจะใช้ในการดำเนินการกรองบางอย่างเช่นการตรวจสอบผู้ใช้ ตัวอย่างเช่นผู้ใช้เก็บโทเค็นในพารามิเตอร์ส่วนหัวหรือ URL เลเยอร์เกตเวย์จำเป็นต้องใช้โทเค็นนี้เพื่อค้นหาผู้ใช้ของผู้ใช้และจัดเก็บไว้ในคำขอเพื่อให้สามารถใช้ไมโครเซิร์ตที่ตามมาได้โดยตรงเพื่อหลีกเลี่ยงการสืบค้นด้วยโทเค็น
2. ความรู้พื้นฐาน
การใช้งานที่ใหญ่ที่สุดใน Zuul คือนอกเหนือจากการกำหนดเส้นทางซึ่งเป็นตัวกรอง ตัวกรองที่กำหนดเองจำเป็นต้องใช้อินเตอร์เฟส Zuulfilter ในวิธีการเรียกใช้ () คุณสามารถใช้งานได้
requestcontext ctx = requestcontext.getCurrentContext (); httpservletRequest Request = ctx.getRequest ();
รับคำขอ แต่มีเพียง getParameter () ในคำขอ แต่ไม่มีวิธี setParameter () ดังนั้นจึงไม่สามารถแก้ไขพารามิเตอร์ URL ได้โดยตรง นอกจากนี้แม้ว่า setAttribute () สามารถใช้ใน reqeust แต่อาจเป็นเพราะขอบเขตที่แตกต่างกัน แต่แอตทริบิวต์ที่ตั้งไว้ที่นี่ไม่สามารถรับได้ใน microservices ที่ตามมาดังนั้นวิธีอื่นจะต้องพิจารณา
3. แนวทางปฏิบัติเฉพาะ
วิธีสุดท้ายคือการใช้
ctx.setRequest (ใหม่ httpservletrequestwrapper (คำขอ) {})วิธีการสร้างคำขอในบริบทใหม่รหัสมีดังนี้:
นำเข้า Javax.servlet.http.httpservletRequestWrapper; // เพิ่ม userId ลอง {inputStream ใน = ctx.getRequest (). getInputStream (); String body = streamutils.copytoString (ใน, charset.forName ("UTF-8")); System.out.println ("Body:" + Body); jsonObject json = jsonobject.fromobject (ร่างกาย); json.put ("userId", userId); สตริง newBody = json.toString (); System.out.println ("newbody:" + newbody); ไบต์สุดท้าย [] reqbodyBytes = newBody.getBytes (); ctx.setRequest (ใหม่ httpservletrequestwrapper (คำขอ) {@Override สาธารณะ servletInputStream getInputStream () พ่น IOException {ส่งคืน servletInputStreamWrapper ใหม่ (reqbodyBytes);} @Override getContentLengthLong () {return reqbodybytes.length;}}); } catch (ioexception e) {e.printstacktrace (); -แนวคิดคือการรับสตรีมอินพุตที่ร้องขอและเขียนใหม่นั่นคือเขียนพารามิเตอร์ JSON ใหม่
ในตัวควบคุม microservice ที่ตามมาสามารถใช้รูปร่างได้
@requestbody Map <String, Object> body ====== body.get ("userId");ด้วยวิธีนี้ให้ผู้ใช้ส่งผ่านใน zuulfilter
สี่. ความพยายามบางอย่าง
เมื่อเขียนใหม่ httpservletrequestwrapper ฉันลองเขียนวิธี getParameterNames() และ getParameterMap() ใหม่หวังว่าจะเขียนพารามิเตอร์ URL ใหม่ แต่มันไม่มีผล
สรุป
ด้านบนเป็นวิธีการแก้ไขข้อมูลพารามิเตอร์การร้องขอใน SpringCloud แนะนำให้คุณทราบโดยตัวแก้ไข ฉันหวังว่ามันจะเป็นประโยชน์กับคุณ หากคุณมีคำถามใด ๆ โปรดฝากข้อความถึงฉันและบรรณาธิการจะตอบกลับคุณทันเวลา ขอบคุณมากสำหรับการสนับสนุนเว็บไซต์ Wulin.com!