.NET में थ्रिफ्ट का उपयोग करना

मैं आपके साथ एक उदाहरण साझा करना चाहता हूं कि आप अपने .NET प्रोजेक्ट्स में थ्रिफ्ट जैसी सुविधाजनक चीज का उपयोग कैसे कर सकते हैं।

जो लोग नहीं जानते हैं, उनके लिए थ्रिफ्ट विभिन्न भाषाओं में लिखे गए कोड, जैसे कि C ++, Java, Python, PHP, Ruby, Erlang, Perl, Haskell, C #, Cocoa, Smalltalk और OCaml है।

थ्रिफ्ट का उपयोग किया जाता है और मूल रूप से फेसबुक द्वारा बनाया गया था। यहाँ भी बार-बार हब्रे पर इसका उल्लेख किया गया था, लेकिन मुझे .NET के लिए कोई उदाहरण नहीं मिला, जिस तरह से .NET के लिए एक कदम दर कदम गाइड आधिकारिक साइट पर भी गायब है। ईमानदार होने के लिए, मुझे यह Google में भी नहीं मिला, हालांकि मैंने खराब देखा हो सकता है।

थ्रिफ्ट आपको एक बार एक सेवा, डेटा संरचनाओं और यहां तक ​​कि अपवादों का वर्णन करने की अनुमति देता है, और फिर सभी समर्थित भाषाओं के लिए कोड उत्पन्न करता है। इस प्रकार, यदि आप, उदाहरण के लिए, .NET पर थ्रिफ्ट का उपयोग कर एक सर्वर लिखते हैं, तो आप
  1. क्लाइंट-सर्वर एप्लिकेशन लिखने में बहुत समय बचाएं, उदाहरण के लिए सॉकेट्स का उपयोग करना।
  2. लगभग सभी स्वचालित रूप से सभी समर्थित भाषाओं में ग्राहक मिलते हैं।
मेरे उदाहरण में, मैं सबसे सरल सेवा लागू करता हूं जो बस समय पर वापस आ जाएगी। लेकिन इस तरह के लेआउट होने से कुछ उपयोगी करने के लिए इसका विस्तार करना आसान है।


तो हमें जरूरत है:
  1. थ्रिफ्ट स्रोत - हमें अपनी परियोजना के लिए एक पुस्तकालय (कक्षा पुस्तकालय) बनाने के लिए उनकी आवश्यकता है।
  2. थ्रिफ्ट कंपाइलर - एक कंसोल यूटिलिटी जो कोड को उस भाषा में उत्पन्न करती है जिसकी हमें .thrift फ़ाइलों से आवश्यकता होती है

दोनों को यहां से ले जाया जा सकता है।

इसके अलावा लेख के अंत में मैं काम कर रहे आवेदन का स्रोत कोड दूंगा, उनके पास पहले से ही पुस्तकालय और पहले से निर्मित कंपाइलर हैं, आप वहां से सब कुछ ले सकते हैं।

चरण 1: तैयारी
इसलिए जब आप स्रोतों को डाउनलोड कर लेते हैं, तो उन्हें किसी भी निर्देशिका में अनपैक कर दें और जाएं
thrift-0.5.0\lib\csharp\src\
एक समाधान खोलें और एक परियोजना का निर्माण करें। फिर आपके पास Thrift.dll लाइब्रेरी है।

चरण 2: हमारी परियोजनाओं का निर्माण
विजुअल स्टूडियो में 3 प्रोजेक्ट बनाएं और उन्हें एक समाधान में संयोजित करें।यह इस तरह निकला:
छवि

पहले से प्राप्त थ्रिफ्ट.डेल पुस्तकालय और डाउनलोड किए गए थ्रिफ़्ट कंपाइलर को लें और उन्हें समाधान में एक निर्देशिका में डालें।

चरण 3: .rift फ़ाइल से कोड उत्पन्न करें
हम अपनी सेवा और डेटा संरचना का वर्णन करते हैं। ऐसा करने के लिए, निम्न सामग्री के साथ TimeService.thrift फ़ाइल बनाएँ:
namespace csharp TimeServer.Thrift

//Structure for returning Time
struct TimeInfoStruct{
1: string Time
}

//Service
service TimeService
{
TimeInfoStruct GetTime()
}


* This source code was highlighted with Source Code Highlighter .


और TimeServerCore प्रोजेक्ट में डालें । चरण # 1 में प्राप्त Thrift.dll के लिए एक लिंक (संदर्भ) परियोजना में भी जोड़ें।

महत्वपूर्ण: यूनिकोड एन्कोडिंग में .thrift फाइल को सेव न करें, मेरे लिए थ्रिफ्ट कंपाइलर इसमें से कुछ भी उत्पन्न नहीं करना चाहता था, जब तक कि फाइल-> एडवांस्ड सेव ऑप्शन में मैंने यूनिकोड को अन्य एन्कोडिंग में नहीं बदल दिया।

इस फ़ाइल में हमारे क्लाइंट-सर्वर एप्लिकेशन का लगभग संपूर्ण विवरण है।

आप .thrift फ़ाइल निर्दिष्ट करके और आवश्यक कक्षाएं प्राप्त करके मैन्युअल रूप से थ्रिफ्ट कंपाइलर को कॉल कर सकते हैं, लेकिन हमारी परियोजना में पूर्व-निर्माण घटना को जोड़ना बेहतर है, यदि हम TimeService.thrift को बदलते हैं

मेरी निर्देशिका पदानुक्रम के साथ, मुझे यह कॉल मिला
$(SolutionDir)\Thrift\thrift-0.5.0.exe -gen csharp -o $(ProjectDir) $(ProjectDir)\TimeService.thrift

"थ्रिफ्ट-0.5.0.exe" स्वयं कंपाइलर है, विकल्प "-gen csharp" यह बताता है कि हमें C # के लिए कक्षाओं की आवश्यकता है, विकल्प "-o $ (ProjectDir)" बताता है कि परिणाम कहां डालना है, और शेष "$" (ProjectDir) ) \ TimeService.thrift " इंगित करता है कि किस फ़ाइल को संकलित करना है।

इस प्रकार, निर्माण के बाद (वास्तव में, पहले, हमारे पास एक पूर्व-निर्माण घटना है) टाइमसेवरकोर , हम 2 कक्षाएं बनाएंगे
TimeInfoStruct.cs - समय को स्थानांतरित करने के लिए एक संरचना, सिद्धांत रूप में, एक सेवा पद्धति बस एक स्ट्रिंग वापस कर सकती है, लेकिन एक दिलचस्प संरचना के साथ।
TimeService.cs हमारी एकमात्र विधि के साथ एक सेवा है।

उनके पास सीरियलाइज़ेशन / डीरिएरलाइज़ेशन, विज़ुअल टौररिंग और कुछ और के लिए कोड भी है।

वे \ TimeServerCore \ gen-csharp \ TimeServer \ Thrift में झूठ बोलेंगे। यदि एक से अधिक भाषाओं को निर्दिष्ट किया जाता है, तो जीन-सीएसएआरपी निर्देशिका हमेशा अलग-अलग भाषाओं के लिए कोड को अलग-अलग फ़ोल्डरों में फैलाने के लिए दिखाई देगी, और पदानुक्रम फ़ाइल में निर्दिष्ट नामस्थान के कारण पदानुक्रम (\ TimeServer \ Thrift) में दो निर्देशिकाएँ बनाई जाती हैं।

परियोजना के लिए इन 2 फ़ाइलों को जोड़ना आवश्यक है, इसके बाद यह इस तरह से निकला:
छवि

चरण 4: सर्वर
चलो एक सर्वर लेते हैं। TimeServer में Thrift.dll, साथ ही हमारे समाधान में TimeServerCore प्रोजेक्ट के लिए एक संदर्भ जोड़ें। फिर एक नया वर्ग TimeServiceImplementation.cs बनाएं

इस वर्ग में, हम अपनी सेवा के तरीकों को लागू करते हैं। उत्पन्न फ़ाइल में TimeService.cs थ्रिफ्ट हमारे लिए एक विशेष इंटरफ़ेस है जिसे हमें लागू करना चाहिए।

यहाँ इंटरफ़ेस है:
public class TimeService { //

public interface Iface {
TimeInfoStruct GetTime();
}
//...
}


* This source code was highlighted with Source Code Highlighter .


जैसा कि आप देख सकते हैं कि केवल एक फ़ंक्शन है जिसे हमने .thrift फ़ाइल में वर्णित किया है।

यहाँ इस इंटरफ़ेस का मेरा कार्यान्वयन है:
class TimeServiceImplementation : TimeService.Iface
{
public TimeInfoStruct GetTime()
{
return new TimeInfoStruct() { Time = DateTime .Now.ToString() };
}
}


* This source code was highlighted with Source Code Highlighter .


और इसलिए सब कुछ लगभग तैयार है, आपको सर्वर को शुरू करने के लिए मजबूर करना होगा जब एप्लिकेशन शुरू होता है और ग्राहकों की प्रतीक्षा करता है:
static void Main( string [] args)
{
TimeServiceImplementation service = new TimeServiceImplementation();
TProcessor processor = new TimeService.Processor(service);
TServerTransport transport = new TServerSocket(1337, 1000);
TServer server = new TSimpleServer(processor, transport);

server.Serve();
}


* This source code was highlighted with Source Code Highlighter .


हम सर्वर इंटरफ़ेस के हमारे कार्यान्वयन को बनाते हैं, जिसके बाद हम सर्वर को पोर्ट 1337 पर लॉन्च करते हैं और कनेक्शन की प्रतीक्षा करते हैं। यहां और सरल कोड बनाने के लिए सभी कोड आवश्यक हैं।
TSimpleServer सर्वर कार्यान्वयन के अलावा, Thrift.dll लाइब्रेरी में TThreadedServer और TThreadPoolServer हैं।

चरण 5: ग्राहक

ग्राहक का कार्यान्वयन और भी आसान है:

static void Main( string [] args)
{
TTransport transport = new TSocket( "localhost" , 1337);
TProtocol proto = new TBinaryProtocol(transport);
TimeService.Client client = new TimeService.Client(proto);

transport.Open();
TimeInfoStruct result = client.GetTime();

Console .WriteLine(result.ToString());
Console .ReadKey();
}


* This source code was highlighted with Source Code Highlighter .


ग्राहक प्रोजेक्ट के लिए Thrift.dll और TimeServerCore प्रोजेक्ट को जोड़ना न भूलें।

जिसके बाद, आप पहले सर्वर शुरू कर सकते हैं, और फिर क्लाइंट। जिसे वर्तमान समय प्रिंट करना चाहिए।

वह सब है। और ज्यादातर समय हमने थ्रिफ्ट के साथ प्रारंभिक सेटअप और परिचित पर खर्च किया, और तब भी इतना नहीं। अब हम अपनी .thirft फ़ाइल में नई संरचनाओं और तरीकों को अपनी सेवा में जोड़ सकते हैं, जिसके बाद हम केवल सर्वर विधियों के कार्यान्वयन लिखते हैं।
ठीक है, अगर आपको अन्य भाषाओं में लिखे गए क्लाइंट या सर्वर की आवश्यकता है, तो थ्रिफ्ट का उपयोग करके उनके लिए कक्षाएं भी उत्पन्न की जा सकती हैं।

उदाहरण के लिए, थ्रिफ्ट का उपयोग करते हुए, कैसंड्रा डेटाबेस के लिए .NET क्लाइंट प्राप्त किया गया था। हालांकि कैसंड्रा बनाने के लिए, फेसबुक .NET ग्राहकों का समर्थन करने की संभावना नहीं थी :)

यहाँ वादा किए गए स्रोत हैं:
dl.dropbox.com/u/3945288/Thirft-Time-Server-.NET-Sample.zip
github.com/kmuzykov/Thirft-Time-Server-.NET-Sample

यहाँ थ्रिफ्ट विकी का लिंक दिया गया है, हालाँकि .NET के लिए ज्यादा जानकारी नहीं है।

Source: https://habr.com/ru/post/In106839/


All Articles