2015-11-25 10 views
49

मैं, विकासशील microservices लिए नया हूँ, हालांकि मैं थोड़ी देर के लिए इस बारे में शोध किया गया है दोनों वसंत के डॉक्स और Netflix के पढ़ने।समझौता स्प्रिंग बादल यूरेका सर्वर आत्म संरक्षण और नवीनीकृत सीमा

मैं एक साधारण परियोजना available on Github शुरू कर दिया है। यह मूल रूप से यूरेका सर्वर (आर्किमिडीज) और तीन यूरेका क्लाइंट माइक्रोसर्विसेज (एक सार्वजनिक एपीआई और दो निजी) है। एक विस्तृत विवरण के लिए जिथूब के रीडमे की जांच करें।

मुद्दा यह है कि जब सब कुछ चल रहा है मैं चाहूँगा कि अगर निजी microservices में से एक की मौत हो गई है, यूरेका सर्वर का एहसास है और रजिस्ट्री से यह दूर करता है।

I found this question on Stackoverflow, और समाधान यूरेका सर्वर कॉन्फ़िगरेशन में enableSelfPreservation:false का उपयोग करके गुजरता है। थोड़ी देर बाद ऐसा करने के बाद मारे गए सेवा की उम्मीद के रूप में गायब हो जाता है।

आत्म संरक्षण मोड OFF.THIS कर दिया जाता है नेटवर्क/अन्य समस्याओं के मामले में रक्षा नहीं हो सकते उदाहरण EXPIRY:

हालांकि मैं निम्न संदेश देख सकते हैं।

1. आत्म संरक्षण का उद्देश्य क्या है? doc राज्यों पर आत्म संरक्षण "ग्राहकों उदाहरणों कि अब मौजूद नहीं है प्राप्त कर सकते हैं" के साथ कि। तो यह कब चालू/बंद करने की सलाह दी जाती है?

इसके अलावा, जब आत्म संरक्षण पर है, तो आप एक उत्कृष्ट संदेश यूरेका सर्वर कंसोल चेतावनी में प्राप्त कर सकते हैं:

आपातकालीन! यूरेका गलत तरीके से दावा दृष्टांत कर रहे हैं जब वे नहीं हैं हो सकता। नवीकरण में कम से THRESHOLD और इसलिए उदाहरणों सुरक्षित रहने के लिए नहीं कर रहे हैं सीमा समाप्त किया जा रहा है।

अब, वसंत यूरेका कंसोल के साथ चल रहा है।

Lease expiration enabled true/false 
Renews threshold 5 
Renews (last min) 4 

मैं सीमा गिनती का एक अजीब व्यवहार सामने आने वाले: जब मैं यूरेका सर्वर अकेले शुरू, सीमा 1.

2. मैं एक एकल यूरेका सर्वर है और registerWithEureka: false साथ कॉन्फ़िगर किया गया है इसे किसी अन्य सर्वर पर पंजीकरण करने से रोकने के लिए। फिर, यह थ्रेसहोल्ड गिनती में क्यों दिखता है?

3. प्रत्येक ग्राहक के लिए मैं थ्रेसहोल्ड गिनती +2 से बढ़ता हूं। मुझे लगता है कि ऐसा इसलिए है क्योंकि वे प्रति मिनट 2 नवीनीकरण संदेश भेजते हैं, क्या मैं सही हूँ?

4. यूरेका सर्वर कभी नवीनीकरण नहीं भेजता है, इसलिए अंतिम न्यूनतम नवीनीकरण सीमा के नीचे हमेशा होता है। क्या यह सामान्य है?

renew threshold 5 
rewnews last min: (client1) +2 + (client2) +2 -> 4 

सर्वर cfg:

server: 
    port: ${PORT:8761} 

eureka: 
    instance: 
    hostname: localhost 
    client: 
    registerWithEureka: false 
    fetchRegistry: false 
    serviceUrl: 
     defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/ 
    server: 
    enableSelfPreservation: false 
# waitTimeInMsWhenSyncEmpty: 0 

ग्राहक 1 cfg:

spring: 
    application: 
    name: random-image-microservice 

server: 
    port: 9999 

eureka: 
    client: 
    serviceUrl: 
     defaultZone: http://localhost:8761/eureka/ 
    healthcheck: 
     enabled: true 
+2

मैं इस प्रश्न का उत्तर देने के लिए समय लेना चाहता हूं। यह जटिल है। कुछ जवाब नेटफ्लिक्स कोड में हैं और अन्य कॉन्फ़िगरेशन हैं। मैं चाहता हूं कि मेरा उत्तर स्प्रिंग क्लाउड प्रलेखन के हिस्से के रूप में समाप्त हो जाए, लेकिन यह संभवतः थैंक्सगिविंग के बाद होगा जब तक कि मेरे सहयोगी पहले जवाब न दें। – spencergibb

+0

यह नेटफ्लिक्स से थोड़ी सी पृष्ठभूमि है: https://github.com/Netflix/eureka/wiki/Understanding-Eureka-Peer-to-Peer- संचार – spencergibb

+0

यहां कुछ और पृष्ठभूमि है: https://github.com/spring- क्लाउड/स्प्रिंग-क्लाउड-नेटफ्लिक्स/अंक/373 – spencergibb

उत्तर

33

मैं के रूप में @codependent मुलाकात एक ही सवाल है, मैं एक बहुत googled और कुछ किया प्रयोग, यहां मैं यूरेका सर्वर और उदाहरण के काम के बारे में कुछ जानकारी देने आया हूं।

प्रत्येक उदाहरण को प्रति 30 सेकंड प्रति एक बार आवृत्ति के साथ यूरेका सर्वर पर अपने पट्टे को नवीनीकृत करने की आवश्यकता होती है, जिसे eureka.instance.leaseRenewalIntervalInSeconds में परिभाषित किया जा सकता है।

नवीनिकृत (पिछला मिनट): नवीनिकृत कि यूरेका सर्वर प्रति मिनट यूरेका उदाहरण से प्राप्त की उम्मीद: कितने यूरेका उदाहरण से अंतिम समय में प्राप्त नवीनिकृत

सीमा नवीनीकरण होता है प्रतिनिधित्व करता है।

उदाहरण के लिए, registerWithEurekaझूठी पर सेट है, eureka.instance.leaseRenewalIntervalInSeconds 30 और रन 2 यूरेका उदाहरण के लिए निर्धारित है। दो यूरेका उदाहरण भेज देंगे मिनट प्रति यूरेका सर्वर से नवीनिकृत, यूरेका सर्वर न्यूनतम सीमा है (कोड में लिखा), इसलिए सीमा है (यह संख्या एक कारक eureka.server.renewalPercentThreshold जो बाद में चर्चा की जाएगी गुणा हो जाएगा)।

आत्म संरक्षण मोड: अगर नवीनिकृत (पिछला मिनट)से भी कम है सीमा नवीनीकरण होता है, आत्म संरक्षण मोड सक्रिय हो जाएगा।

तो ऊपरी उदाहरण में, स्वयं संरक्षण मोड सक्रिय है, क्योंकि दहलीज 5 है, लेकिन यूरेका सर्वर केवल 4 नवीनीकरण/मिनट प्राप्त कर सकता है।

  1. प्रश्न 1:

आत्म संरक्षण मोड गरीब नेटवर्क कनेक्टिविटी विफलता से बचने के लिए डिजाइन है। यूरेका इंस्टेंस ए और बी के बीच कनेक्टिविटी अच्छा है, लेकिन कनेक्टिविटी हिचकी के कारण बी कम अवधि में यूरेका सर्वर पर अपने पट्टे को नवीनीकृत करने में असफल रहा है, इस समय यूरेका सर्वर बस उदाहरण बी को बाहर नहीं निकाल सकता है। अगर ऐसा होता है, उदाहरण बी उपलब्ध होने के बावजूद यूरेका सर्वर से पंजीकृत सेवा उपलब्ध नहीं होगी। तो यह स्वयं संरक्षण मोड का उद्देश्य है, और इसे चालू करना बेहतर है।

  1. प्रश्न 2:

न्यूनतम सीमा 1 कोड में लिखा है। registerWithEureka झूठ पर सेट है इसलिए कोई यूरेका इंस्टेंस रजिस्ट्रार नहीं होगा, थ्रेसहोल्ड 1.

उत्पादन वातावरण में, आम तौर पर हम दो यूरेका सर्वर और registerWithEureka को तैनात करेंगे।तो दहलीज 2 होगी, और यूरेका सर्वर खुद को दो बार/मिनट में पट्टा नवीनीकृत करेगा, इसलिए RENEWALS ARE LESSER THAN THRESHOLD कोई समस्या नहीं होगी।

  1. प्रश्न 3:

हाँ, आप सही हैं। eureka.instance.leaseRenewalIntervalInSeconds परिभाषित करता है कि सर्वर प्रति मिनट कितने नवीनीकरण भेजे गए हैं, लेकिन यह ऊपर वर्णित एक कारक eureka.server.renewalPercentThreshold गुणा करेगा, डिफ़ॉल्ट मान 0.85 है।

  1. प्रश्न 4:

हाँ, यह सामान्य है, क्योंकि सीमा प्रारंभिक मूल्य registerWithEureka गलत पर सेट है, तो 1. तो करने के लिए सेट कर दिया जाता है, नवीनिकृत सीमा से नीचे हमेशा होता है ।

मैं इस के लिए दो सुझाव हैं:

  1. तैनात दो यूरेका सर्वर और registerWithEureka सक्षम करें।
  2. तुम सिर्फ डेमो/dev वातावरण में तैनात करने के लिए चाहते हैं, आप 0.49 को eureka.server.renewalPercentThreshold सेट कर सकते हैं, इसलिए जब आप अकेले एक यूरेका सर्वर शुरू, सीमा 0.
+0

हाय नी Xing, क्या आप जानते हैं कि लेबल का अर्थ क्या है: "लीज समाप्ति सक्षम:" – jabrena

+0

हाय @jabrena, मुझे लगता है इसका मतलब है कि पट्टा समाप्त हो जाएगा यदि उदाहरण यूरेका सर्वर पर अपने पट्टे को नवीनीकृत नहीं करता है। यह eureka.instance.leaseExpirationDurationInSeconds से संबंधित हो सकता है जो डिफ़ॉल्ट रूप से 90 सेकंड है। यदि आप इस मान को 0 या ऋणात्मक संख्या पर सेट करते हैं, तो लेबल "समाप्त समाप्ति सक्षम: गलत" हो सकता है। आप इसे आजमा सकते हैं। –

+0

क्या आप इस https://stackoverflow.com/questions/48437752/eureka-renews-threshold-renews-last-min –

16

मैं एक ब्लॉग पोस्ट बना लिया हो जाएगा यूरेका here के ब्योरे के साथ, जो स्प्रिंग डॉक या नेटफ्लिक्स ब्लॉग से कुछ गायब विवरण में भर जाता है। यह स्रोत कोड के माध्यम से डीबगिंग और खुदाई के कई दिनों का परिणाम है। मैं समझता हूं कि बाहरी यूआरएल से जोड़ने के बजाय कॉपी-पेस्ट करना बेहतर है, लेकिन सामग्री SO SO के लिए बहुत बड़ी है।

+1

इस स्पष्टीकरण पोस्ट को जोड़ने के लिए धन्यवाद दे सकते हैं। एक अनुशंसित पढ़ने !! – codependent

+1

हाय @ अहिजीत सरकार, लेख अद्भुत है। मैंने कई विन्यास संदेह हल किए। – jabrena

संबंधित मुद्दे