WCF 4.0 - Service Discovery
סביר להניח כי כל ארכיטקט תוכנה הנאבק עם האתגרים של אפליקציה מרובת Services ומחשבים, ימצא את עצמו מתמודד, במוקדם או במאוחר, עם הצורך לספק Service Discovery.
הפתרון הקלאסי והותיק ביותר הוא UDDI
בפוסט זה אתמקד בפתרון של WCF 4.0 ה- WS - Discovery.

איך מוצאים את השירות שאנחנו מחפשים?
מה זה WS – Discovery?
זהו פרוטוקול שמתאר איך מתבצע תהליך הגילוי. בשלב הראשון שולח כל שרות שעולה הודעת Hello ב- Multicast.

בשלב השני, כאשר שרות או לקוח מחפש שרות הוא שולח הודעת Probe ב- Multicast.

כל שרות שמתאים לבקשת ה- Probe מחזיר ישירות למבקש Probe Match.

כאשר שרות יורד הוא שולח הודעת By ב- Multicast.

תיאור שסופק לעיל הוא סכמטי וכללי, פירוט מדויק של הפרוטוקול אפשר לקרוא כאן.
איך WS-Discovery ו-WCF עובדים ביחד?
1. צריך להוסיף ל- WCF Service ה- Endpoint מסוג udpDiscoveryEndpoint ( ראו פוסט קודם שלי על Kind ). זה EP שישלח את ההודעות Hello , Probe Match ו- By. ה- Kind למעשה שותל ב- Service Description תחת ה- Property Endpoints את DiscoveryEndpoint.

2. צריך להוסיף ל- Service Behaviors את ServiceDiscoveryBehavior כדי שהוא ישתול לכל EP תחת ה- Behaviors את EndpointDiscoveryMetadataInitalizer, בשביל שה- DiscoveryEndpoint יכול לדעת מה לענות כאשר הוא מקבל הודעת Probe. דוגמא לאיך מגדירים את ה- Discovery ב- WCF.
חשוב לציין שה- Discoveryלא מצריך כלום ממפתח ה- Service, רק להגדיר נכון את EP הקובץ הקונפיג.
3. איך נראה ה- Service Description ע"י הכלי WCF Debugger Visualizer.

4. צריך להגדיר Dynamic Endpoint בצד ה- Proxy כדי שנוכל למצוא את השרות המבוקש. לדוגמא:

בדוגמא כאן ה- CalcClient מחפש שרות שהחוזה שלו הוא ICalc וה- Binding שלו הוא NetTcpBinding.
איך מגדירים את ה- Multicast?
בקובץ קונפיג. דוגמא:

סיכום:
סוג ה- Discovery הזה נקרא Ad hoc והוא מאוד "יפה ונחמד" עד שמגלים שברוב הארגונים היכולת של ה- Multicast סגורה. ולכן יש עוד שיטה שמאוד מזכירה את UDDI והיא נקראת Managed Discovery, אך זה בפוסט הבא.
נקודה אישית:
אני חושב שהגילוי של השירותים לא צריך להתבצע ע"פ דרישה אלא להדחף ללקוחות. אני עושה את זה בתוך מערכות סגורות ע"י Distributed Cache, כל שרות שולח את הודעות ה- WS-Discovery ל- Distributed Cache וכל צרכן מושך אותם משם.
אשמח לענות לשאלות לכל מי שרוצה, אני זמין גם בקבוצה שלי בלינקדאין - I Love C# אשמח אם תצטרפו.