अवलोकन
यह पेज आपके एप्लिकेशन के साथ संपूर्ण I2P router बाइनरी को बंडल करने के बारे में है। यह I2P के साथ काम करने वाला एप्लिकेशन लिखने के बारे में नहीं है (चाहे वह बंडल हो या बाहरी)। हालांकि, router को बंडल न करने की स्थिति में भी कई दिशानिर्देश उपयोगी हो सकते हैं।
बहुत सारी परियोजनाएं I2P को बंडल कर रही हैं, या बंडल करने की बात कर रही हैं। यह बहुत अच्छा है अगर यह सही तरीके से किया जाए। अगर गलत तरीके से किया जाए, तो यह हमारे नेटवर्क को वास्तविक नुकसान पहुंचा सकता है। I2P router जटिल है, और आपके उपयोगकर्ताओं से सारी जटिलता को छुपाना एक चुनौती हो सकती है। यह पृष्ठ कुछ सामान्य दिशानिर्देशों पर चर्चा करता है।
इनमें से अधिकांश दिशानिर्देश Java I2P या i2pd दोनों पर समान रूप से लागू होते हैं। हालांकि, कुछ दिशानिर्देश Java I2P के लिए विशिष्ट हैं और नीचे उल्लेख किए गए हैं।
हमसे बात करें
एक संवाद शुरू करें। हम यहाँ मदद के लिए हैं। I2P को एम्बेड करने वाले एप्लिकेशन हमारे लिए नेटवर्क को बढ़ाने और सभी के लिए गुमनामी में सुधार करने के सबसे आशाजनक - और रोमांचक - अवसर हैं।
अपना router बुद्धिमानी से चुनें
यदि आपका एप्लिकेशन Java या Scala में है, तो यह एक आसान विकल्प है - Java router का उपयोग करें। यदि C/C++ में है, तो हम i2pd की सिफारिश करते हैं। i2pcpp का विकास बंद हो गया है। अन्य भाषाओं में apps के लिए, SAM या BOB या SOCKS का उपयोग करना और Java router को एक अलग प्रक्रिया के रूप में bundle करना सबसे अच्छा है। निम्नलिखित में से कुछ केवल Java router पर लागू होता है।
लाइसेंसिंग
सुनिश्चित करें कि आप जिस सॉफ़्टवेयर को बंडल कर रहे हैं, उसकी लाइसेंस आवश्यकताओं को पूरा करते हैं।
कॉन्फ़िगरेशन
डिफ़ॉल्ट कॉन्फ़िगरेशन सत्यापित करें
एक सही default configuration अत्यंत महत्वपूर्ण है। अधिकांश उपयोगकर्ता defaults को नहीं बदलेंगे। आपके application के लिए defaults उस router के defaults से अलग हो सकते हैं जिसे आप bundle कर रहे हैं। यदि आवश्यक हो तो router defaults को override करें।
समीक्षा करने के लिए कुछ महत्वपूर्ण डिफ़ॉल्ट सेटिंग्स: अधिकतम bandwidth, tunnel की मात्रा और लंबाई, अधिकतम participating tunnels। इसमें से बहुत कुछ आपके app की अपेक्षित bandwidth और उपयोग के पैटर्न पर निर्भर करता है।
अपने उपयोगकर्ताओं को नेटवर्क में योगदान करने की अनुमति देने के लिए पर्याप्त bandwidth और tunnel कॉन्फ़िगर करें। बाहरी I2CP को अक्षम करने पर विचार करें, क्योंकि आपको शायद इसकी आवश्यकता नहीं है और यह किसी अन्य चल रहे I2P instance के साथ टकराव करेगा। उदाहरण के लिए, exit पर JVM की हत्या को अक्षम करने के लिए configs को भी देखें।
भागीदारी ट्रैफिक विचार
आपके लिए participating traffic को disable करना आकर्षक लग सकता है। इसे करने के कई तरीके हैं (hidden mode, max tunnels को 0 पर set करना, shared bandwidth को 12 KBytes/sec से कम set करना)। participating traffic के बिना, आपको graceful shutdown की चिंता नहीं करनी पड़ती, आपके users को उनके द्वारा generate नहीं किए गए bandwidth usage दिखाई नहीं देते, आदि। हालांकि, participating tunnels को allow करने के कई कारण हैं।
सबसे पहले, router उतनी अच्छी तरह से काम नहीं करता अगर उसे नेटवर्क के साथ “एकीकृत” होने का मौका नहीं मिलता, जिसमें दूसरों द्वारा आपके माध्यम से tunnel बनाना बहुत मदद करता है।
दूसरे, मौजूदा नेटवर्क में 90% से अधिक routers भाग लेने वाले ट्रैफिक की अनुमति देते हैं। Java router में यह डिफ़ॉल्ट है। यदि आपका एप्लिकेशन दूसरों के लिए route नहीं करता और यह वास्तव में लोकप्रिय हो जाता है, तो यह नेटवर्क पर एक leech बन जाता है, और यह हमारे वर्तमान संतुलन को बिगाड़ देता है। यदि यह वास्तव में बड़ा हो जाता है, तो हम Tor बन जाते हैं, और अपना समय लोगों से relaying सक्षम करने की भीख मांगने में बिताते हैं।
तीसरे, भाग लेने वाला ट्रैफिक कवर ट्रैफिक है जो आपके उपयोगकर्ताओं की गुमनामी में मदद करता है।
हम आपको डिफ़ॉल्ट रूप से participating traffic को अक्षम करने से दृढ़ता से हतोत्साहित करते हैं। यदि आप ऐसा करते हैं और आपका एप्लिकेशन बहुत लोकप्रिय हो जाता है, तो यह नेटवर्क को नुकसान पहुंचा सकता है।
स्थिरता
आपको router के runs के बीच router का डेटा (netdb, कॉन्फ़िगरेशन, आदि) सेव करना होगा। I2P अच्छी तरह से काम नहीं करता यदि आपको हर startup पर reseed करना पड़े, और यह हमारे reseed servers पर बहुत बड़ा लोड डालता है, और anonymity के लिए भी बहुत अच्छा नहीं है। भले ही आप router infos bundle करें, I2P को सबसे अच्छी performance के लिए सेव किए गए profile data की जरूरत होती है। persistence के बिना, आपके users को startup का खराब अनुभव होगा।
यदि आप persistence प्रदान नहीं कर सकते हैं तो दो संभावनाएं हैं। इनमें से कोई भी आपके project का हमारे reseed servers पर load समाप्त कर देगी और startup time में काफी सुधार करेगी।
अपना स्वयं का project reseed server(s) सेट करें जो reseed में सामान्य संख्या से कहीं अधिक router infos प्रदान करे, जैसे कि कई सौ। router को केवल आपके servers का उपयोग करने के लिए configure करें।
अपने installer में एक से दो हज़ार router infos को bundle करें।
इसके अलावा, अपने tunnel स्टार्टअप में देरी या अंतराल रखें, ताकि router को बहुत सारे tunnels बनाने से पहले integrate होने का मौका मिल सके।
कॉन्फ़िगरेबिलिटी
अपने उपयोगकर्ताओं को महत्वपूर्ण सेटिंग्स की कॉन्फ़िगरेशन बदलने का तरीका दें। हम समझते हैं कि आप शायद I2P की अधिकांश जटिलता को छिपाना चाहेंगे, लेकिन कुछ बुनियादी सेटिंग्स दिखाना महत्वपूर्ण है। ऊपर दी गई डिफ़ॉल्ट सेटिंग्स के अतिरिक्त, UPnP, IP/port जैसी कुछ नेटवर्क सेटिंग्स सहायक हो सकती हैं।
Floodfill विचारणाएं
एक निश्चित bandwidth सेटिंग के ऊपर, और अन्य स्वास्थ्य मानदंडों को पूरा करने पर, आपका router floodfill बन जाएगा, जिससे connections और memory usage में बड़ी वृद्धि हो सकती है (कम से कम Java router के साथ)। इस बारे में सोचें कि क्या यह ठीक है। आप floodfill को disable कर सकते हैं, लेकिन फिर आपके सबसे तेज़ users उतना योगदान नहीं कर रहे होंगे जितना वे कर सकते हैं। यह आपके application के लिए सामान्य uptime पर भी निर्भर करता है।
रीसीडिंग
तय करें कि आप router infos को bundle कर रहे हैं या हमारे reseed hosts का उपयोग कर रहे हैं। Java reseed host list source code में है, इसलिए यदि आप अपने source को अद्यतन रखते हैं, तो host list भी अद्यतन रहेगी। शत्रुतापूर्ण सरकारों द्वारा संभावित अवरोधन (blocking) से सावधान रहें।
साझा क्लाइंट्स का उपयोग करें
Java I2P i2ptunnel shared clients का समर्थन करता है, जहाँ clients को एक single pool का उपयोग करने के लिए configure किया जा सकता है। यदि आपको multiple clients की आवश्यकता है, और यदि यह आपके security goals के अनुकूल है, तो clients को shared होने के लिए configure करें।
Tunnel की मात्रा सीमित करें
विकल्प inbound.quantity और outbound.quantity के साथ tunnel की मात्रा को स्पष्ट रूप से निर्दिष्ट करें। Java I2P में डिफ़ॉल्ट 2 है; i2pd में डिफ़ॉल्ट अधिक है। दोनों router के साथ संगत सेटिंग प्राप्त करने के लिए SAM का उपयोग करके SESSION CREATE लाइन में निर्दिष्ट करें। अधिकांश कम-से-मध्यम bandwidth और कम-से-मध्यम fanout applications के लिए प्रत्येक में दो in/out पर्याप्त है। Server और उच्च-fanout P2P applications को अधिक की आवश्यकता हो सकती है। उच्च-ट्रैफिक server और applications के लिए आवश्यकताओं की गणना पर मार्गदर्शन के लिए इस forum post
देखें।
SAM SIGNATURE_TYPE निर्दिष्ट करें
SAM destinations के लिए डिफ़ॉल्ट रूप से DSA_SHA1 का उपयोग करता है, जो आप नहीं चाहते। Ed25519 (type 7) सही विकल्प है। DEST GENERATE command में SIGNATURE_TYPE=7 जोड़ें, या DESTINATION=TRANSIENT के लिए SESSION CREATE command में जोड़ें।
SAM सत्रों को सीमित करें
अधिकांश एप्लिकेशन को केवल एक SAM session की आवश्यकता होगी। SAM स्थानीय router को, या यहां तक कि व्यापक नेटवर्क को भी जल्दी से अभिभूत करने की क्षमता प्रदान करता है, यदि बड़ी संख्या में sessions बनाए जाते हैं। यदि कई उप-सेवाएं एक ही session का उपयोग कर सकती हैं, तो उन्हें एक PRIMARY session और SUBSESSIONS के साथ सेट करें (वर्तमान में i2pd पर समर्थित नहीं है)। sessions की एक उचित सीमा कुल 3 या 4 है, या शायद दुर्लभ स्थितियों के लिए 10 तक। यदि आपके पास कई sessions हैं, तो प्रत्येक के लिए कम tunnel मात्रा निर्दिष्ट करना सुनिश्चित करें, ऊपर देखें।
लगभग किसी भी स्थिति में आपको प्रति-कनेक्शन unique session की आवश्यकता नहीं होनी चाहिए। सावधानीपूर्वक डिज़ाइन के बिना, यह जल्दी ही network को DDoS कर सकता है। सावधानीपूर्वक विचार करें कि क्या आपके security लक्ष्यों के लिए unique sessions की आवश्यकता है। प्रति-कनेक्शन sessions लागू करने से पहले कृपया Java I2P या i2pd developers से सलाह लें।
नेटवर्क संसाधन उपयोग कम करें
ध्यान दें कि ये विकल्प वर्तमान में i2pd पर समर्थित नहीं हैं। ये विकल्प I2CP और SAM के माध्यम से समर्थित हैं (delay-open को छोड़कर, जो केवल i2ptunnel के माध्यम से है)। विवरण के लिए I2CP दस्तावेज़ीकरण (और delay-open के लिए, i2ptunnel कॉन्फ़िगरेशन दस्तावेज़ीकरण) देखें।
अपनी application tunnels को delay-open, reduce-on-idle और/या close-on-idle पर सेट करने पर विचार करें। यह i2ptunnel उपयोग करने पर सीधा है लेकिन यदि आप I2CP को सीधे उपयोग कर रहे हैं तो आपको इसमें से कुछ को स्वयं implement करना होगा। tunnel count को कम करने और फिर tunnel को बंद करने वाले कोड के लिए i2psnark देखें, यहाँ तक कि कुछ background DHT activity की उपस्थिति में भी।
जीवन चक्र
अपडेट करने की क्षमता
यदि बिल्कुल संभव हो तो एक ऑटो-अपडेट फीचर रखें, या कम से कम नए संस्करण की ऑटो-अधिसूचना। हमारा सबसे बड़ा डर यह है कि बाहर बहुत सारे router हों जो अपडेट नहीं हो सकते। हमारे पास Java router के साल में लगभग 6-8 रिलीज़ होते हैं, और यह नेटवर्क की स्वास्थ्य के लिए महत्वपूर्ण है कि उपयोगकर्ता अपडेट रहें। आमतौर पर रिलीज़ के 6 सप्ताह के भीतर नेटवर्क का 80% से अधिक हिस्सा नवीनतम रिलीज़ पर होता है, और हम इसे इसी तरह बनाए रखना चाहते हैं। आपको router के अंतर्निहित ऑटो-अपडेट फ़ंक्शन को निष्क्रिय करने की चिंता करने की आवश्यकता नहीं है, क्योंकि वह कोड router console में है, जिसे आप संभवतः बंडल नहीं कर रहे हैं।
रोलआउट
एक क्रमिक rollout योजना बनाएं। नेटवर्क पर एक साथ अत्यधिक भार न डालें। वर्तमान में हमारे पास प्रतिदिन लगभग 25K अद्वितीय उपयोगकर्ता और प्रति माह 40K अद्वितीय उपयोगकर्ता हैं। हम संभवतः प्रति वर्ष 2-3X की वृद्धि को बिना किसी बड़ी समस्या के संभाल सकते हैं। यदि आप इससे तेज़ रैंपअप की अपेक्षा करते हैं, या आपके userbase का bandwidth वितरण (या uptime वितरण, या कोई अन्य महत्वपूर्ण विशेषता) हमारे वर्तमान userbase से काफी अलग है, तो वास्तव में हमें चर्चा करनी होगी। आपकी वृद्धि योजनाएं जितनी बड़ी होंगी, इस checklist की अन्य सभी चीजें उतनी ही महत्वपूर्ण होंगी।
लंबे समय तक चालू रहने के लिए डिज़ाइन करें और इसे प्रोत्साहित करें
अपने उपयोगकर्ताओं को बताएं कि I2P सबसे अच्छा काम करता है जब यह लगातार चलता रहता है। शुरुआत के बाद अच्छी तरह से काम करने में कई मिनट लग सकते हैं, और पहली बार इंस्टॉल के बाद और भी अधिक समय लग सकता है। यदि आपका औसत uptime एक घंटे से कम है, तो शायद I2P गलत समाधान है।
उपयोगकर्ता इंटरफेस
स्थिति दिखाएं
उपयोगकर्ता को कुछ संकेत प्रदान करें कि एप्लिकेशन tunnels तैयार हैं। धैर्य रखने के लिए प्रेरित करें।
सुव्यवस्थित शटडाउन
यदि संभव हो, तो अपने participating tunnels की समाप्ति तक shutdown को देर से करें। अपने उपयोगकर्ताओं को tunnels को आसानी से तोड़ने न दें, या कम से कम उनसे पुष्टि करने के लिए कहें।
शिक्षा और दान
यह अच्छा होगा यदि आप अपने उपयोगकर्ताओं को I2P के बारे में और जानने और दान करने के लिए लिंक प्रदान करें।
External Router विकल्प
आपके उपयोगकर्ता आधार और एप्लिकेशन के आधार पर, एक बाहरी router का उपयोग करने के लिए एक विकल्प या अलग पैकेज प्रदान करना सहायक हो सकता है।
अन्य विषय
अन्य सामान्य सेवाओं का उपयोग
यदि आप अन्य सामान्य I2P सेवाओं (न्यूज़ फ़ीड, hosts.txt सब्सक्रिप्शन, trackers, outproxies, आदि) का उपयोग करने या उनसे लिंक करने की योजना बना रहे हैं, तो सुनिश्चित करें कि आप उन्हें अधिक लोड नहीं दे रहे हैं, और उन्हें चलाने वाले लोगों से बात करें कि यह ठीक है या नहीं।
समय / NTP समस्याएं
नोट: यह खंड Java I2P को संदर्भित करता है। i2pd में SNTP client शामिल नहीं है।
I2P में एक SNTP client शामिल है। I2P को संचालित होने के लिए सही समय की आवश्यकता होती है। यह विकृत system clock की भरपाई करेगा लेकिन इससे startup में देरी हो सकती है। आप I2P के SNTP queries को अक्षम कर सकते हैं, लेकिन यह सलाह नहीं दी जाती जब तक कि आपका application यह सुनिश्चित न करे कि system clock सही है।
चुनें कि आप क्या और कैसे बंडल करते हैं
नोट: यह सेक्शन केवल Java I2P को संदर्भित करता है।
न्यूनतम आपको i2p.jar, router.jar, streaming.jar, और mstreaming.jar की आवश्यकता होगी। आप datagram-only app के लिए दो streaming jars को छोड़ सकते हैं। कुछ apps को अधिक की आवश्यकता हो सकती है, जैसे i2ptunnel.jar या addressbook.jar। jbigi.jar को भूलना मत, या उसके एक subset को उन platforms के लिए जिन्हें आप support करते हैं, crypto को बहुत तेज़ बनाने के लिए। Build करने के लिए Java 7 या उससे ऊपर की आवश्यकता है। यदि आप Debian / Ubuntu packages बना रहे हैं, तो आपको इसे bundle करने के बजाय हमारे PPA से I2P package की आवश्यकता होनी चाहिए। उदाहरण के लिए, आपको निश्चित रूप से susimail, susidns, router console, और i2psnark की आवश्यकता नहीं है।
निम्नलिखित फाइलें I2P installation directory में शामिल होनी चाहिए, जो “i2p.dir.base” property के साथ निर्दिष्ट की गई है। certificates/ directory को न भूलें, जो reseeding के लिए आवश्यक है, और IP validation के लिए blocklist.txt। geoip directory वैकल्पिक है, लेकिन अनुशंसित है ताकि router स्थान के आधार पर निर्णय ले सके। यदि geoip को शामिल कर रहे हैं, तो उस directory में GeoLite2-Country.mmdb फाइल को रखना सुनिश्चित करें (इसे installer/resources/GeoLite2-Country.mmdb.gz से gunzip करें)। hosts.txt फाइल आवश्यक हो सकती है, आप इसे अपने application द्वारा उपयोग किए जाने वाले किसी भी hosts को शामिल करने के लिए संशोधित कर सकते हैं। आप प्रारंभिक defaults को override करने के लिए base directory में router.config फाइल जोड़ सकते हैं। clients.config और i2ptunnel.config फाइलों की समीक्षा करें और उन्हें संपादित करें या हटाएं।
लाइसेंस आवश्यकताओं के लिए आपको LICENSES.txt फ़ाइल और licenses डायरेक्टरी को शामिल करना पड़ सकता है।
- आप एक hosts.txt फ़ाइल को भी बंडल करना चाह सकते हैं।
- यदि आप अपनी रिलीज़ के लिए Java I2P को कंपाइल कर रहे हैं, हमारी binaries लेने के बजाय, तो bootclasspath निर्दिष्ट करना सुनिश्चित करें।
Android संबंधी विचार
नोट: यह खंड केवल Java I2P को संदर्भित करता है।
हमारा Android router ऐप कई clients द्वारा साझा किया जा सकता है। यदि यह इंस्टॉल नहीं है, तो उपयोगकर्ता को client ऐप शुरू करते समय संकेत दिया जाएगा।
कुछ डेवलपर्स ने चिंता व्यक्त की है कि यह एक खराब उपयोगकर्ता अनुभव है, और वे अपने ऐप में router को embed करना चाहते हैं। हमारे roadmap में एक Android router service library है, जो embedding को आसान बना सकती है। अधिक जानकारी की आवश्यकता है।
यदि आपको सहायता की आवश्यकता है, तो कृपया हमसे संपर्क करें।
Maven jars
नोट: यह भाग केवल Java I2P को संदर्भित करता है।
हमारे पास Maven Central पर अपने jars की सीमित संख्या है। हमारे पास कई trac tickets हैं जिन्हें संबोधित करना है जो Maven Central पर जारी किए गए jars में सुधार और विस्तार करेंगे।
यदि आपको सहायता की आवश्यकता है, तो कृपया हमसे संपर्क करें।
Datagram (DHT) विचारणाएं
यदि आपका एप्लिकेशन I2P datagrams का उपयोग कर रहा है, जैसे कि DHT के लिए, तो overhead कम करने और विश्वसनीयता बढ़ाने के लिए कई उन्नत विकल्प उपलब्ध हैं। इसे अच्छी तरह से काम करने के लिए कुछ समय और प्रयोग की आवश्यकता हो सकती है। size/reliability tradeoffs के बारे में सचेत रहें। सहायता के लिए हमसे बात करें। एक ही Destination पर Datagrams और Streaming दोनों का उपयोग करना संभव है - और अनुशंसित भी है। इसके लिए अलग Destinations न बनाएं। मौजूदा network DHTs (iMule, bote, bittorrent, और router) में अपना असंबंधित डेटा स्टोर करने की कोशिश न करें। अपना खुद का बनाएं। यदि आप seed nodes को hardcode कर रहे हैं, तो हम अनुशंसा करते हैं कि आपके पास कई हों।
आउटप्रॉक्सी
I2P outproxies से clearnet तक एक सीमित संसाधन हैं। outproxies का उपयोग केवल सामान्य उपयोगकर्ता-प्रारंभित वेब ब्राउज़िंग या अन्य सीमित ट्रैफ़िक के लिए करें। किसी भी अन्य उपयोग के लिए, outproxy ऑपरेटर से सलाह लें और अनुमोदन प्राप्त करें।
सह-विपणन
आइए मिलकर काम करते हैं। इसके पूरा होने का इंतजार न करें। हमें अपना Twitter handle दें और इसके बारे में tweet करना शुरू करें, हम भी आपका साथ देंगे।
मैलवेयर
कृपया I2P का उपयोग बुरे काम के लिए न करें। इससे हमारे network और हमारी प्रतिष्ठा दोनों को बहुत नुकसान हो सकता है।
हमसे जुड़ें
यह स्पष्ट हो सकता है, लेकिन समुदाय में शामिल हों। I2P को 24/7 चलाएं। अपने प्रोजेक्ट के बारे में एक I2P साइट शुरू करें। IRC #i2p-dev में घूमें। फ़ोरम पर पोस्ट करें। बात फैलाएं। हम आपको उपयोगकर्ता, परीक्षक, अनुवादक, या यहां तक कि कोडर दिलाने में मदद कर सकते हैं।
उदाहरण
एप्लिकेशन उदाहरण
आप I2P Android app को install और इस्तेमाल करना चाह सकते हैं, और उसके code को देख सकते हैं, एक ऐसे application के उदाहरण के लिए जो router को bundle करता है। देखिए कि हम user को क्या दिखाते हैं और क्या छुपाते हैं। उस state machine को देखिए जो हम router को start और stop करने के लिए इस्तेमाल करते हैं। अन्य उदाहरण हैं: Vuze, Nightweb Android app, iMule, TAILS, iCloak, और Monero।
कोड उदाहरण
नोट: यह खंड केवल Java I2P से संबंधित है।
उपरोक्त में से कोई भी वास्तव में आपको यह नहीं बताता कि Java router को bundle करने के लिए अपना code कैसे लिखना है, इसलिए निम्नलिखित एक संक्षिप्त उदाहरण है।
import java.util.Properties;
import net.i2p.router.Router;
Properties p = new Properties();
// add your configuration settings, directories, etc.
// where to find the I2P installation files
p.addProperty("i2p.dir.base", baseDir);
// where to find the I2P data files
p.addProperty("i2p.dir.config", configDir);
// bandwidth limits in K bytes per second
p.addProperty("i2np.inboundKBytesPerSecond", "50");
p.addProperty("i2np.outboundKBytesPerSecond", "50");
p.addProperty("router.sharePercentage", "80");
p.addProperty("foo", "bar");
Router r = new Router(p);
// don't call exit() when the router stops
r.setKillVMOnEnd(false);
r.runRouter();
...
r.shutdownGracefully();
// will shutdown in 11 minutes or less
यह कोड उस स्थिति के लिए है जहाँ आपका एप्लिकेशन router शुरू करता है, जैसा कि हमारे Android ऐप में होता है। आप router को clients.config और i2ptunnel.config फाइलों के माध्यम से एप्लिकेशन को शुरू करवा भी सकते हैं, Jetty webapps के साथ मिलकर, जैसा कि हमारे Java packages में किया जाता है। हमेशा की तरह, state management सबसे कठिन हिस्सा है।
यह भी देखें: router javadocs .