<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: ALLWIN</title>
    <description>The latest articles on DEV Community by ALLWIN (@allwinsolutions).</description>
    <link>https://dev.to/allwinsolutions</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F1092902%2F3ed31199-fa98-4a58-b5e0-c3c1624766d0.png</url>
      <title>DEV Community: ALLWIN</title>
      <link>https://dev.to/allwinsolutions</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/allwinsolutions"/>
    <language>en</language>
    <item>
      <title>Embarking on Sitecore Headless: Our First Project</title>
      <dc:creator>ALLWIN</dc:creator>
      <pubDate>Sun, 09 Jul 2023 08:54:26 +0000</pubDate>
      <link>https://dev.to/allwinsolutions/embarking-on-sitecore-headless-our-first-project-33pp</link>
      <guid>https://dev.to/allwinsolutions/embarking-on-sitecore-headless-our-first-project-33pp</guid>
      <description>&lt;p&gt;We recently undertook our first headless project using Sitecore Headless 10.2 and Next.js SDK with SSR. This shift in our tech stack brought significant changes to our development processes.  &lt;/p&gt;

&lt;p&gt;Previously, Sitecore MVC development relied heavily on C#, .NET, and the Sitecore SDK and APIs. Now, with Sitecore Headless Services, most of the implementation has moved to the consumer, namely our Next.js application. The front-end had to display data from various sources, including layout and components from Sitecore, as well as marketing and business data from other API sources. &lt;/p&gt;

&lt;p&gt;To overcome dependencies and unblock front-end development, we adopted an approach that emphasized front-end independence. Leveraging Sitecore JSS SDK's "disconnected" mode, frontend developers worked with YAML mock files representing page data. OpenAPI documentation allowed us to easily mock 3rd party APIs using Next.js, enabling us to switch between mocked and live data. API contracts were crucial in resolving development dependencies and synchronizing workflows between teams, facilitating the testing of full user stories. &lt;/p&gt;

&lt;p&gt;While transitioning to the new tech stack, we faced technical challenges as Sitecore developers. Understanding Sitecore Headless Services and Next.js SDK was crucial. Sitecore's robust client library support for Headless made it easier to grasp and utilize. Frontend developers needed to learn about essential Sitecore concepts such as page structure, layouts, placeholders, renderings, and various field types. This foundational knowledge allowed them to create page mock-ups that could be reviewed and adjusted by the Sitecore team. Additionally, selecting the right rendering method and hosting solution on the frontend presented further challenges.  &lt;/p&gt;

&lt;p&gt;Ultimately, embracing a headless approach and leveraging JavaScript on the client side streamlined our development process, with clearer roles for different teams and faster iteration compared to deploying .NET assemblies for each change. &lt;/p&gt;

&lt;p&gt;Read the full article &lt;a href="https://www.allwin-solutions.com/post/our-first-sitecore-headless-project-2"&gt;HERE&lt;/a&gt;!&lt;/p&gt;

</description>
      <category>sitecore</category>
      <category>api</category>
      <category>testing</category>
      <category>webdev</category>
    </item>
    <item>
      <title>Achieving Zero-Downtime Deployment with Azure Kubernetes Service: A Step-by-Step Guide</title>
      <dc:creator>ALLWIN</dc:creator>
      <pubDate>Fri, 23 Jun 2023 14:38:57 +0000</pubDate>
      <link>https://dev.to/allwinsolutions/achieving-zero-downtime-deployment-with-azure-kubernetes-service-a-step-by-step-guide-5343</link>
      <guid>https://dev.to/allwinsolutions/achieving-zero-downtime-deployment-with-azure-kubernetes-service-a-step-by-step-guide-5343</guid>
      <description>&lt;p&gt;This blog post provides a solution for achieving zero-downtime deployment in Azure Kubernetes Service (AKS). We'll explore different deployment strategies and choose the one that best fits our requirements. We'll then outline the necessary Kubernetes objects in AKS and present an Azure DevOps deployment pipeline for achieving zero-downtime deployment. &lt;/p&gt;

&lt;p&gt;There are several deployment strategies available for deploying applications to production or other environments. Each strategy has its own use cases, benefits, and drawbacks.&lt;/p&gt;

&lt;p&gt;Let's explore some of these strategies:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Recreate&lt;/strong&gt;: This strategy involves removing instances with the old version and rolling out instances with the new version. It is commonly used during development and downtime does not matter. Kubernetes services natively support this strategy.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Ramped&lt;/strong&gt;: The ramped strategy replaces instances of the old version with the new version one by one. This strategy ensures zero downtime, but it can be time-consuming and may not have full control over traffic. Kubernetes services support this strategy.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Blue/Green&lt;/strong&gt;: In the blue/green strategy, new version instances are deployed while traffic is routed to the old instances. Once the new version is verified, the traffic is switched to the new instances, and the old instances are removed. This strategy offers zero downtime, fast rollout/rollback, and control over traffic, but it requires additional resources. It is not supported by Kubernetes services out of the box.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Canary&lt;/strong&gt;: The canary strategy involves routing weighted traffic to the new instances gradually until all traffic is directed to the new version. This allows for fast rollback, measurable performance, and more control over traffic. However, it has a slow rollout and can be expensive. It is not supported by Kubernetes services out of the box but can be implemented using an ingress controller like NGINX.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;A/B testing&lt;/strong&gt;: Similar to the canary strategy, A/B testing allows for routing a subset of users to the new instances using canary cookies or headers. This strategy provides complete control over traffic but has a slow rollout and requires a Layer-7 load balancer like NGINX. It is not supported by Kubernetes services out of the box.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Shadow&lt;/strong&gt;: The shadow strategy involves deploying new instances alongside the old instances and mirroring traffic to both versions. This allows for quick performance tests without impacting users but requires doubling the required resources.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;For more information on these deployment strategies, check out this link:  &lt;a href="https://thenewstack.io/deployment-strategies/"&gt;https://thenewstack.io/deployment-strategies/&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;em&gt;Choosing the Right Deployment Strategy&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;To achieve our requirements of fast rollout and rollback, the ability to check the new version while users are still routed to the old version, zero-downtime switch, and suitability for a production environment, we combined the Blue/Green and A/B testing strategies.&lt;/p&gt;

&lt;p&gt;We’ll follow this with an overview of the components involved in achieving zero-downtime deployment using Kubernetes services. Let’s briefly discuss deployment objects, service objects, ingress objects, and the Ingress controller.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Deployment Objects&lt;/strong&gt;: To implement the Blue/Green strategy, we utilized Kubernetes Deployment objects, which represent slots for blue and green versions of the component. Each deployment object is responsible for managing pods that contain a specific version of the component. Helm charts are used to define the deployment objects in code.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Service Objects&lt;/strong&gt;: For A/B testing, we needed to operate two different versions of a component simultaneously. To accomplish this, we employed Kubernetes Service objects. These service objects exposed a set of pods as a network service. We had a service pointing to pods running a current version and a canary service pointing to pods running the next version of the component.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Ingress Objects&lt;/strong&gt;: To route traffic from outside the cluster to the services within, we utilized Kubernetes Ingress objects. Ingress objects define HTTP and HTTPS routes and control the traffic routing based on defined rules. We created separate Ingress objects for both the service and canary service.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Ingress Controller&lt;/strong&gt;: An Ingress controller is essential for handling Ingress objects. In our solution, we used the NGINX Ingress Controller, which allowed us to route traffic to the appropriate services based on the defined rules.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Deployment Pipeline with Azure DevOps&lt;/strong&gt;: To automate the rollout of our component to Azure Kubernetes Service (AKS), we set up a deployment pipeline using Azure DevOps. &lt;/p&gt;

&lt;p&gt;The pipeline consisted of several jobs:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Deploy Job&lt;/strong&gt;: This job pulls the necessary helm charts from Azure Container Registry (ACR) and deploys the component to the desired slot using helm. It also updates the ingress release to have the canary service selectors pointing to the proper set of pods.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;User Check Job&lt;/strong&gt;: This job pauses the deployment process and allows the user to check if the new component version works properly. The user can decide to proceed or initiate a rollback.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Clean Up Deployment Job&lt;/strong&gt;: In case of a failed deployment, this job removes the new version of the component and its slot.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Swap Deployment Slots and Cleanup Job&lt;/strong&gt;: This job completes the deployment process by swapping the service and canary service to the new version of pods and removing the previous version's deployment.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The deployment process was visualized through a diagram, showcasing the various steps involved in achieving zero-downtime deployment.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;em&gt;Conclusion&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Zero-downtime deployment is achievable in the Azure cloud using Kubernetes services. By understanding your requirements and employing different deployment strategies, you can ensure uninterrupted application availability. &lt;/p&gt;

&lt;p&gt;All the presented source codes are available for download from the following &lt;a href="https://github.com/ALLWIN-Informatics/Allwin.ZeroDownTime-AKS"&gt;link&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Read the whole article &lt;a href="https://www.allwin-solutions.com/post/how-to-do-a-zero-downtime-deployment-using-azure-kubernetes-service"&gt;HERE&lt;/a&gt;!&lt;/p&gt;

</description>
      <category>kubernetes</category>
      <category>tutorial</category>
      <category>codenewbie</category>
      <category>development</category>
    </item>
    <item>
      <title>My Journey of Contributing to the ASP.NET Core Repository</title>
      <dc:creator>ALLWIN</dc:creator>
      <pubDate>Mon, 19 Jun 2023 09:54:35 +0000</pubDate>
      <link>https://dev.to/allwinsolutions/my-journey-of-contributing-to-the-aspnet-core-repository-52i4</link>
      <guid>https://dev.to/allwinsolutions/my-journey-of-contributing-to-the-aspnet-core-repository-52i4</guid>
      <description>&lt;p&gt;Márton, our genius software architect, shared his story of contributing to the ASP.NET Core repository. In this blog post, he recounted the challenges faced while working on a project involving an API and two React applications. Debugging efforts led him to discover issues with hosting the applications in a subdirectory, prompting him to explore the code and identify a solution.&lt;/p&gt;

&lt;p&gt;During development, Márton noticed that the admin application failed to load properly due to a problem with the proxy code. After thorough debugging, he realized that the Map middleware in ASP.NET Core did not include the prefix provided in the first parameter. Additionally, the concatenation of URI segments differed from the expected behavior with strings. He found an existing GitHub issue but decided to propose his own solution to address the problem.&lt;/p&gt;

&lt;p&gt;Márton’s initial attempt at submitting a code change incited integration test failures, which were unrelated to his modifications. After resolving the test issues by merging the latest main branch, he received approval and awaited inclusion in the main branch release with .NET 7.0. Surprisingly, another issue emerged, mirroring the previous problem with the same line of code. Driven by determination, Márton embarked on resolving both issues simultaneously.&lt;/p&gt;

&lt;p&gt;During the process, Márton collaborated with code owners who provided feedback and requested assistance with manual testing. To facilitate testing and future maintenance, he took the initiative to write unit tests for the code. Despite the complexity of testing an extension method for the HttpContext class, Márton succeeded in verifying the correctness of the URL using an HTTP client with a mocked HTTP message handler.&lt;/p&gt;

&lt;p&gt;With his tests passing and necessary adjustments made, Márton’s code was eventually merged into the main branch. His conclusion and takeaway emphasize the importance of a cautious mindset when contributing to open-source projects, especially those as complex as ASP.NET Core. The significance of semantic versioning, automated tests, and meticulous code reviews is highlighted in his blog post as essential elements for maintaining robust libraries.&lt;br&gt;
Read the full story &lt;a href="https://www.allwin-solutions.com/post/my-story-of-contributing-to-the-asp-net-core-repository"&gt;HERE&lt;/a&gt;!&lt;/p&gt;

</description>
      <category>programming</category>
      <category>aspdotnet</category>
      <category>tutorial</category>
      <category>discuss</category>
    </item>
    <item>
      <title>Introducing Sitecore's New Product Portfolio: Unlocking the Power of Experience</title>
      <dc:creator>ALLWIN</dc:creator>
      <pubDate>Thu, 08 Jun 2023 13:04:22 +0000</pubDate>
      <link>https://dev.to/allwinsolutions/introducing-sitecores-new-product-portfolio-unlocking-the-power-of-experience-nog</link>
      <guid>https://dev.to/allwinsolutions/introducing-sitecores-new-product-portfolio-unlocking-the-power-of-experience-nog</guid>
      <description>&lt;p&gt;Curious about Sitecore's latest offerings? From Content Hub One to Sitecore Search, OrderCloud, and XM Cloud, these products have been making waves in recent years. Let's explore each one from both a client and implementation perspective, gaining a deeper understanding of their purpose and where they fit within Sitecore's services.&lt;/p&gt;

&lt;p&gt;In the past, Sitecore had on-premises products like Sitecore XM and Sitecore XP, but now, they have evolved into a Managed Cloud service. In short, this DevOps and hosting solution simplifies infrastructure setup, release pipelines, and environments, allowing developers to focus on delivering solutions using ASP .NET MVC or the headless approach with Sitecore Headless Services.&lt;/p&gt;

&lt;p&gt;Sitecore's Software as a Service (SaaS) products offer cloud-based, API-first solutions that are developed and maintained by Sitecore. The Content Cloud category includes products like XM Cloud, a robust CMS for enterprise needs, and Content Hub One, a lightweight solution for effective content management. Content Hub DAM serves as a dedicated Digital Asset Management platform, while Sitecore Search enhances website search capabilities with AI and personalization.&lt;/p&gt;

&lt;p&gt;In the Engagement Cloud category, Sitecore CDP collects and utilizes data to optimize customer journeys, while Sitecore Personalize enables personalized experiences based on that data. Sitecore Send offers a SaaS Email Marketing Service, and Sitecore Connect facilitates low-code integration between multiple systems.&lt;/p&gt;

&lt;p&gt;For e-commerce excellence, Commerce Cloud presents Sitecore OrderCloud, an API-first e-commerce engine, and Sitecore Discover, an AI-based search engine optimized for e-commerce solutions.&lt;/p&gt;

&lt;p&gt;Sitecore's SaaS products are flexible and compatible with non-Sitecore solutions, providing integration possibilities through their API-first approach. &lt;/p&gt;

&lt;p&gt;Choose the platform that best suits your needs and consider reaching out to us for portal implementation partnership. Unleash the power of experience with Sitecore's innovative product portfolio and take your digital experiences to new heights!&lt;/p&gt;

&lt;p&gt;Read more &lt;a href="https://www.allwin-solutions.com/post/unleashing-the-power-of-experience-introducing-sitecores-all-new-product-portfolio"&gt;HERE&lt;/a&gt;!&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>sitecore</category>
      <category>news</category>
      <category>softwareengineering</category>
    </item>
    <item>
      <title>Unleashing the Power of Nearshoring: Two Recent Case Studies of Client Success</title>
      <dc:creator>ALLWIN</dc:creator>
      <pubDate>Thu, 01 Jun 2023 09:20:18 +0000</pubDate>
      <link>https://dev.to/allwinsolutions/unleashing-the-power-of-nearshoring-two-recent-case-studies-of-client-success-2g3m</link>
      <guid>https://dev.to/allwinsolutions/unleashing-the-power-of-nearshoring-two-recent-case-studies-of-client-success-2g3m</guid>
      <description>&lt;p&gt;&lt;strong&gt;Nearshoring at Its Best&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Imagine that you are a software development company, faced with the challenge of staying current with emerging technologies to meet client demands. We have brought you two of our recent case studies which showcase our successful utilization of Azure and the MS Teams API.&lt;/p&gt;

&lt;p&gt;In the first case study, we developed a B2B platform that required the creation of Power BI reports to provide top-level management with key performance indicators. We opted to embed the reports using Power BI Embedded, allowing flexible access rights and future scalability. By implementing row-level security and embedded tokens, we achieved targeted access control and automated role definition.&lt;/p&gt;

&lt;p&gt;In the second case study, we integrated the MS Teams API to address limitations of Zoom. We used Teams invitation links to conduct conversations, providing an alternative solution for B2B users. Leveraging our expertise in MS Graph API and app registration, we programmatically managed meetings and addressed challenges related to recording and phone access.&lt;/p&gt;

&lt;p&gt;These case studies highlight the advantages of nearshoring and seeking external expertise. By collaborating with experienced teams, companies can overcome technological complexities and meet strict deadlines. Nearshoring not only ensures successful project delivery but also fosters knowledge transfer and adaptability to new technologies.&lt;/p&gt;

&lt;p&gt;In conclusion, nearshoring offers significant benefits in software development, as demonstrated by our successful integration of Azure and the MS Teams API. By leveraging external expertise, companies can navigate complex technologies and achieve project goals efficiently.&lt;/p&gt;

&lt;p&gt;Read more &lt;a href="https://www.allwin-solutions.com/post/nearshoring-at-its-best"&gt;HERE&lt;/a&gt;!&lt;/p&gt;

</description>
      <category>api</category>
      <category>azure</category>
      <category>devops</category>
      <category>discuss</category>
    </item>
  </channel>
</rss>
