SpringCloud الإصدار 2.x سلسلة springcloud الموزعة دورة SpringSession

يتم إنشاء HttpSession وتدار من قبل حاوية بريمج، كما هي المخزنة القط / جيتي في الذاكرة. ولكن التطبيق لبناء مجموعة الموزعة، ومن ثم استخدام F5، LVS أو إنجن إكس للقيام الموازنة، ثم من المرجح أن يتم توزيع طلبات المتشعب من نفس المستخدم إلى عدد من ملقمات مختلفة. هذا السؤال هو، كيف لضمان أن ملقمات مختلفة لتبادل البيانات مع جلسة ذلك؟ أبسط الفكرة هي لحفظ بيانات الجلسة إلى مكان موحد آخرين من الذاكرة، مثل أعطها / رديس وقواعد البيانات الأخرى. هذا السؤال مرة أخرى، كيف ليحل محل تنفيذ HttpSession بريمج حاوية لإنشاء وإدارة ذلك؟

الخيار الأول: استخدام المكونات في وظائف توفير بريمج الحاويات، والعرف خلق HttpSession واستراتيجيات الإدارة، واستبدال النهج الافتراضي عن طريق التكوين. في الواقع، كانت هذه المنطقة منذ فترة طويلة مشروع مفتوح المصدر، مثل أعطها-الدورة مدير (يمكن الرجوع إلى الحمل المشتركة موازنة جلسة + (أعطها الدورة-مدير لتحقيق)، وهر-رديس-الدورة مدير. ومع ذلك، فإن هذا النهج لديه عيب، ويلزم قانون اقتران حاوية القط / جيتي بريمج مثل.

الخيار الثاني: تصميم تصفية، استخدم HttpServletRequestWrapper، وتحقيق طريقتهم getSession ()، للسيطرة على إنشاء وإدارة البيانات الدورة. ويتحقق الربيع الدورة هذا الخط من التفكير.

1، والدورة SC-رديس مشروع جديد، المقابلة لpom.xml الوثائق التالية

< XMLNS مشروع = " XMLNS: XSI = "

XSI: schemaLocation = " >

< modelVersion > 4.0.0 < / ModelVersion >

< groupId > الربيع سحابة < / GroupId >

< artifactId > SC-رديس الدورة < / ArtifactId >

< نص > 0.0.1 لقطة < / النسخة >

< التعبئة والتغليف > جرة < / تغليف >

< اسم > SC-رديس الدورة < / اسم >

< رابط > < / URL >

< أصل >

< groupId > org.springframework.boot < / GroupId >

< artifactId > الربيع التمهيد بداية الوالدين < / ArtifactId >

< نص > 2.0.4.RELEASE < / النسخة >

< / الرئيسي >

< dependencyManagement >

< تبعيات >

< التبعية >

< groupId > org.springframework.cloud < / GroupId >

< artifactId > الربيع سحابة تبعيات < / ArtifactId >

< نص > Finchley.RELEASE < / النسخة >

< نوع > بوم < / النوع >

< مجال > استيراد < / نطاق >

< / التبعية >

< / التبعيات >

< / DependencyManagement >

< خصائص >

< project.build.sourceEncoding > UTF-8 < /project.build.sourceEncoding >

< maven.compiler.source > 1.8 < /maven.compiler.source >

< maven.compiler.target > 1.8 < /maven.compiler.target >

< / خصائص >

< تبعيات >

< التبعية >

< groupId > org.springframework.boot < / GroupId >

< artifactId > ربيع التمهيد-بداية-بيانات رديس < / ArtifactId >

< / التبعية >

< التبعية >

< groupId > org.apache.commons < / GroupId >

< artifactId > المشاعات-pool2 هل < / ArtifactId >

< / التبعية >

< التبعية >

< groupId > org.springframework.boot < / GroupId >

< artifactId > الربيع التمهيد بداية على شبكة الإنترنت < / ArtifactId >

< / التبعية >

< التبعية >

< groupId > org.springframework.session < / GroupId >

< artifactId > الربيع الدورة بيانات رديس < / ArtifactId >

< / التبعية >

< التبعية >

< groupId > com.alibaba < / GroupId >

< artifactId > fastjson < / ArtifactId >

< نص > 1.2.49 < / النسخة >

< / التبعية >

< / التبعيات >

< / مشروع >

2، springboot الجديدة الطبقة بدء التشغيل RedisSessionApplication.java

حزمة com.redis.session.

استيراد org.springframework.boot.SpringApplication.

استيراد org.springframework.boot.autoconfigure.SpringBootApplication.

استيراد org.springframework.session.data.redis.config.annotation.web.http.EnableRedisHttpSession.

SpringBootApplication

EnableRedisHttpSession

الطبقة العامة RedisSessionApplication {

ساكنة العام باطلة الرئيسية (سلسلة وسائط) {

SpringApplication.run (RedisSessionApplication.class، وسائط)؛

}

}

الوصف: الاستخدام الرئيسي للتوزيع EnableRedisHttpSession تعليق جلسة مفتوحة الربيع، يتم تكوين دور هذه الفئة لاعتراض طلب org.springframework.session.web.http.SessionRepositoryFilter

3، نيو الملف application.yml

الخادم:

المنفذ: 7200

الربيع:

الدورة:

متجر من نوع: رديس

التطبيق:

اسم: SC-رديس الدورة

رديس:

المضيف: 127.0.0.1

كلمة المرور:

المنفذ: 6379

مهلة: 10000 # وقت الاتصال (مللي ثانية)

قاعدة بيانات: 0 # رديس 16 شرائح الحالة الافتراضية، وهذا جزء تكوين معين المستخدمة، الافتراضي هو 0

الخس:

بركة:

ماكس النشطة: 8 # اتصال عدد أقصى تجمع اتصالات (سلبية تقدر أي حد) افتراضي 8

ماكس-الانتظار: -1 # تجمع الاتصال الكمون أقصى تسد (القيم السلبية أي حد) الافتراضية -1

ماكس الخمول: 8 # اتصال تجميع الاتصالات الأقصى الافتراضي الخمول 8

دقيقة الخمول: 0 # الحد الأدنى اتصالات تجمع الاتصال الخمول الافتراضية 0

4، وUserController جديدة، وتستخدم لمحاكاة تسجيل دخول المستخدم

حزمة com.redis.session.controller.

استيراد java.util.HashMap.

استيراد java.util.Map.

استيراد javax.servlet.http.Cookie.

استيراد javax.servlet.http.HttpServletRequest.

استيراد org.slf4j.Logger.

importorg.slf4j.LoggerFactory.

استيراد org.springframework.web.bind.annotation.RequestMapping.

استيراد org.springframework.web.bind.annotation.ResponseBody.

استيراد org.springframework.web.bind.annotation.RestController.

importcom.alibaba.fastjson.JSON.

importcom.redis.session.model.User.

RestController

الطبقة العامة UserController {

ساكنة الخاص المسجل النهائي مسجل = LoggerFactory.getLogger (UserController.class)؛

/ **

* عضو في الدورة

*

* طلبparam

*Return

* /

RequestMapping ( "المستخدم / / تسجيل الدخول")

ResponseBody

الجمهور خريطة < سلسلة، كائن >  تسجيل الدخول (HttpServletRequest الطلب) {

// اسم المستخدم اتخذت في الجلسة

الكائن loginUser = request.getSession () getAttribute ( "loginUser")؛

إذا (loginUser == فارغة) {

logger.info ( "ليست الدورة الحالية، المستخدم ضبط")؛

العضو ش = العضو الجديد ()؛

u.setAge (23)؛

u.setId (1L)؛

u.setPosition ( "الرئيس")؛

u.setUserName ( "huangjinjin")؛

. Request.getSession () على SetAttribute ( "loginUser"، ش)؛

} {شيء آخر

logger.info ( "الحاضر الدورة، المستخدم =" + JSON.toJSONString (loginUser))؛

}

كوكي الكوكيز = request.getCookies ()؛

إذا (الكوكيز! = فارغة && cookies.length >  0) {

ل(كوكي كوكي: الكوكيز) {

logger.info (cookie.getName () + ":" + cookie.getValue ())؛

}

}

خريطة < سلسلة، كائن >  التركيب = HashMap جديد < سلسلة، كائن > ()؛

resp.put ( "كود"، "000000")؛

resp.put ( "جي اس"، "صفقة ناجحة")؛

returnresp.

}

/ **

* احصل على مستخدمي الدورة.

*

* طلبparam

*Return

* /

RequestMapping ( "المستخدم / / getUser")

ResponseBody

الجمهور خريطة < سلسلة، كائن >  getUser (HttpServletRequest الطلب) {

خريطة < سلسلة، كائن >  التركيب = HashMap جديد < سلسلة، كائن > ()؛

resp.put ( "كود"، "000000")؛

resp.put ( "جي اس"، "صفقة ناجحة")؛

resp.put ( "الهيئة"، request.getSession () getAttribute ( "loginUser"))؛

كوكي الكوكيز = request.getCookies ()؛

إذا (الكوكيز! = فارغة && cookies.length >  0) {

ل(كوكي كوكي: الكوكيز) {

logger.info (cookie.getName () + ":" + cookie.getValue ())؛

}

}

returnresp.

}

}

5، بدء المشروع، عرض سجل إطلاق OK

6، والوصول باستخدام جوجل واجهة متصفح

واجهة تسجيل الدخول بأول زيارة: HTTP: //127.0.0.1: 7200 / المستخدم / تسجيل الدخول

طباعة وحدة التحكم:

الثانية إلى n-عشر: وحدة التحكم طباعة

الحصول على جلسة واجهة الوصول: المستخدم إرجاع البيانات المطابقة

7، عرض خدمة البيانات من خلال ريدس رديس العميل رديس-المبادرة القطرية

WTA القرطم 30000 تجميل الأنف، وبعد ضحك يجري الاصدقاء في القبيح، والتعرض غاضبا: لا بد لي من تأجيل حفل الزفاف

الربيع سحابة الإصدار 2.x سلسلة من قواطع الدوائر الكهربائية تتجمع رصد الطور.

مشاركة وو هسين الزي اليومي لارتداء بدلة أنيقة مع النظارات الشمسية بارد وسيم

SpringCloud2.x متكاملة F سلسلة springboot

سرق الرجل البالغ من العمر سبع سنوات UAV الملحقات ليتم بيعها وغير المرغوب فيه

SpringCloud2.x التكامل سلسلة springboot.

هايدن تحمل خطيبها كثيرا ما تظهر المودة والمحبة حتى فخورة بها، وقالت انها كانت جميلة جدا

لديك رسائل يو هوا الفرصة للحصول على كتاب التوقيع! يوم الكتاب العالمي تشوهاى أي واحد كنت مثل معظم لحضور؟

الرجال شهرين لتغيير طفلك أدى إلى كسر في الساعة 20

تسليط الضوء على "طول الطريق" روح جولة النبيذ التشيلي عن الجمعية الصينية المنظمة انه "على غرار التشيلي" المشروع رسميا في بكين

GaoYuanYuan تعرض الحوامل بطن الصورة، تشاو ساعد بعناية زوجها

وكانت ناننينغ دائرة امرأة من الأصدقاء "صن لايف" لصوص اجتذبت بالفعل، تمكن من الفرار بعد تسليم 100،000 يوان