<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Spring-Boot on Yonatan Karp-Rudin</title><link>https://yonatankarp.github.io/he/tags/spring-boot/</link><description>Recent content in Spring-Boot on Yonatan Karp-Rudin</description><generator>Hugo</generator><language>he</language><lastBuildDate>Wed, 05 Jun 2024 00:00:00 +0100</lastBuildDate><atom:link href="https://yonatankarp.github.io/he/tags/spring-boot/index.xml" rel="self" type="application/rss+xml"/><item><title>איך לתקן קונפיגורציות שגויות ב-RedisTemplate</title><link>https://yonatankarp.github.io/he/blog/fix-misconfigurations-redistemplate/</link><pubDate>Wed, 05 Jun 2024 00:00:00 +0100</pubDate><guid>https://yonatankarp.github.io/he/blog/fix-misconfigurations-redistemplate/</guid><description>&lt;h2 id="מבוא"&gt;מבוא&lt;/h2&gt;
&lt;p&gt;הסיפור שלנו מתחיל עם עמית ואני שמנסים לדבג בעיה בפרויקט שלנו כמה שעות. היינו צריכים לשלוף ערך מ-Redis, אבל בכל פעם שהשירות רץ, הערך שחזר היה &lt;code&gt;null&lt;/code&gt;. למרות המאמצים שלנו, לא מצאנו פתרון באינטרנט, ולמרות הכל — הקוד שלנו היה מכוסה בטסטים שכולם עברו!&lt;/p&gt;
&lt;p&gt;במאמר הזה נחקור בעיה נפוצה כשמשתמשים ב-&lt;code&gt;RedisTemplate&lt;/code&gt; באפליקציות Spring. נדגים איך קונפיגורציות שגויות יכולות לגרום לכך שהטסטים עוברים אבל שליפת הנתונים הנכונים נכשלת. בנוסף, נראה איך לקנפג &lt;code&gt;RedisTemplate&lt;/code&gt; בצורה נכונה כדי להימנע מהבעיה.&lt;/p&gt;</description></item><item><title>Observability בפעולה: איך להשתמש ב-OpenTelemetry</title><link>https://yonatankarp.github.io/he/blog/observability-in-action-opentelemetry/</link><pubDate>Tue, 17 Oct 2023 00:00:00 +0100</pubDate><guid>https://yonatankarp.github.io/he/blog/observability-in-action-opentelemetry/</guid><description>&lt;h2 id="מבוא"&gt;מבוא&lt;/h2&gt;
&lt;p&gt;במאמר הזה נצלול לתוך השלבים של הוספת observability לקוד שלכם באמצעות OpenTelemetry. קודם, נפתח ספרייה שמושכת נתונים מ-remote API. אחרי זה, נבנה שירות שמשתמש בספרייה הזו לשליפה ושמירה של הנתונים במסד נתונים.&lt;/p&gt;
&lt;p&gt;תוך כדי, נשלב OpenTelemetry ב-Kotlin backend service שלנו, ונדגים את ההתנהגות בסביבה שדומה לפרודקשן. אחרי שהשירות יהיה מצויד ב-instrumentation, נוסיף לו filter שדוחה בקשות גדולות מדי. גם ה-filter הזה יהיה עם instrumentation.&lt;/p&gt;
&lt;p&gt;כל דוגמאות הקוד לסדרה הזו זמינות ב-GitHub:&lt;/p&gt;</description></item><item><title>איך לבנות Domain Gateway עם OpenApi</title><link>https://yonatankarp.github.io/he/blog/build-domain-gateway-openapi/</link><pubDate>Wed, 14 Dec 2022 00:00:00 +0100</pubDate><guid>https://yonatankarp.github.io/he/blog/build-domain-gateway-openapi/</guid><description>&lt;div class="editors-note"&gt;
&lt;p&gt;&lt;strong&gt;TL;DR:&lt;/strong&gt; המאמר הזה מסביר מה זה domain gateway, איך לבנות אחד ולמה תרצו אותו.&lt;/p&gt;
&lt;/div&gt;
&lt;h2 id="מה-זה-domain-gateway"&gt;מה זה Domain Gateway?&lt;/h2&gt;
&lt;p&gt;domain gateway הוא מקרה פרטי של ה-API gateway pattern. האתר &lt;a href="https://java-design-patterns.com/patterns/api-gateway/"&gt;java-design-patterns&lt;/a&gt; מגדיר את ה-gateway pattern כך:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;With the Microservices pattern, a client may need data from multiple different microservices. If the client called each microservice directly, that could contribute to longer load times, since the client would have to make a network request for each microservice called. Moreover, having the client call each microservice directly ties the client to that microservice – if the internal implementations of the microservices change (for example, if two microservices are combined sometime in the future) or if the location (host and port) of a microservice changes, then every client that makes use of those microservices must be updated. The intent of the API Gateway pattern is to alleviate some of these issues. In the API Gateway pattern, an additional entity (the API Gateway) is placed between the client and the microservices. The job of the API Gateway is to aggregate the calls to the microservices. Rather than the client calling each microservice individually, the client calls the API Gateway a single time. The API Gateway then calls each of the microservices that the client needs.&lt;/p&gt;</description></item><item><title>איך להשתמש ב-OpenApi לבניית RESTful API חזק</title><link>https://yonatankarp.github.io/he/blog/openapi-robust-restful-api/</link><pubDate>Sun, 04 Dec 2022 00:00:00 +0100</pubDate><guid>https://yonatankarp.github.io/he/blog/openapi-robust-restful-api/</guid><description>&lt;div class="editors-note"&gt;
&lt;p&gt;&lt;strong&gt;הערת עורך:&lt;/strong&gt; הפוסט הזה נכתב על ידי במקור ופורסם בבלוג של SumUp. אבל הרבה השתנה מאז. אני כבר לא עובד ב-SumUp, OpenAPI שחרר שתי גרסאות major, ל-Spring Boot היה release major, ואפילו ל-Gradle היו כמה releases major. לא רק זאת, כישורי הכתיבה שלי השתפרו דרמטית מאז, ולאורך זמן מצאתי כמה טעויות קטנות במאמר המקורי. מאחר שהמאמר המקורי הוא אחד המוצלחים שלי, החלטתי לכתוב אותו מחדש ולפרסם גרסה מעודכנת.&lt;/p&gt;
&lt;/div&gt;
&lt;h2 id="מבוא"&gt;מבוא&lt;/h2&gt;
&lt;h3 id="restful-api--הצד-המכוער"&gt;RESTful API — הצד המכוער&lt;/h3&gt;
&lt;p&gt;כמהנדסת/מהנדס backend, פיתחתי APIs רבים ב-REST במהלך הקריירה שלי. אחת הבעיות הכי מעצבנות שנתקלתי בה שוב ושוב הייתה חוסר בשילוב חלק בין ה-backend לבין הלקוחות. שגיאות כתיב ב-URLs, חוסר עקביות ב-JSON (camel case לעומת snake case), העברת ערכים מהסוג הלא נכון (לדוגמה, string במקום integer) ועוד טעויות דומות קרו לי הרבה פעמים.&lt;/p&gt;</description></item><item><title>יצירת Spring Boot App Banner מותאם אישית</title><link>https://yonatankarp.github.io/he/blog/custom-spring-boot-banner/</link><pubDate>Fri, 02 Dec 2022 00:00:00 +0100</pubDate><guid>https://yonatankarp.github.io/he/blog/custom-spring-boot-banner/</guid><description>&lt;p&gt;היום אני רוצה לשתף אתכם בפיצ&amp;rsquo;ר כיפי של Spring. הוא לא חדש או קריטי, אבל הוא בהחלט מהנה!&lt;/p&gt;
&lt;p&gt;בדרך כלל, כשמפעילים את אפליקציית Spring Boot, רואים banner סטנדרטי ב-logs כזה:&lt;/p&gt;
&lt;p&gt;&lt;img src="https://yonatankarp.github.io/images/blog/medium-1*qhCPGhoCfVHDiV_8C2w-IQ.png" alt="Spring Boot Banner"&gt;&lt;/p&gt;
&lt;p&gt;אבל האם אי פעם חשבתם להחליף את ה-Spring banner ב-banner מותאם אישית? אם כן, המאמר הזה בשבילכם!&lt;/p&gt;
&lt;p&gt;כדי להתחיל, בואו נגש ל-&lt;a href="https://patorjk.com/"&gt;https://patorjk.com/&lt;/a&gt; — אתר שעוזר לנו ליצור טקסט מותאם אישית. אפשר להכניס את הטקסט הרצוי ל-log ולבחור מתוך מגוון גופנים. לדוגמה:&lt;/p&gt;</description></item><item><title>איך להזריק כמה מימושים ב-Spring Framework</title><link>https://yonatankarp.github.io/he/blog/inject-multiple-implementations-spring/</link><pubDate>Fri, 11 Feb 2022 00:00:00 +0100</pubDate><guid>https://yonatankarp.github.io/he/blog/inject-multiple-implementations-spring/</guid><description>&lt;p&gt;לא מזמן היה לי דיון עם אחד מהעמיתים שלי במהלך code review. דיברנו על גביש נסתר ב-Spring (וגם ב-frameworks אחרים כמו Micronaut) שיכול לפשט את הקוד שלנו.&lt;/p&gt;
&lt;p&gt;בואו נחשוב על משימה: פיתוח מערכת ברכות בוקר טוב שתומכת בעברית ובאנגלית. המערכת צריכה לברך אותנו בכל אחת מהשפות האלה.&lt;/p&gt;
&lt;p&gt;נתחיל עם המימוש הפשוט על ידי הגדרת ה-greeters:&lt;/p&gt;
&lt;div class="highlight-wrapper"&gt;
 &lt;button class="copy-code-btn" type="button" aria-label="Copy code to clipboard"&gt;
 &lt;svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"&gt;
 &lt;rect x="9" y="9" width="13" height="13" rx="2" ry="2"&gt;&lt;/rect&gt;
 &lt;path d="M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1"&gt;&lt;/path&gt;
 &lt;/svg&gt;
 &lt;span class="copy-text"&gt;Copy&lt;/span&gt;
 &lt;/button&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-Kotlin" data-lang="Kotlin"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;HebrewGreeter&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;fun&lt;/span&gt; &lt;span class="nf"&gt;sayGoodMorning&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;println&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;בוקר טוב&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;EnglishGreeter&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;fun&lt;/span&gt; &lt;span class="nf"&gt;sayGoodMorning&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;println&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;Good morning&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;עכשיו ניצור קלאס שמחזיק את ה-greeters ומפעיל אותם:&lt;/p&gt;</description></item></channel></rss>