<?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: OSVALDO ALVES</title>
    <description>The latest articles on DEV Community by OSVALDO ALVES (@osvaldofa).</description>
    <link>https://dev.to/osvaldofa</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%2F487059%2F58f6cc04-1a82-4d93-b911-489730b3a3a3.jpeg</url>
      <title>DEV Community: OSVALDO ALVES</title>
      <link>https://dev.to/osvaldofa</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/osvaldofa"/>
    <language>en</language>
    <item>
      <title>The Era of Engineers: Is Code Becoming a Commodity?</title>
      <dc:creator>OSVALDO ALVES</dc:creator>
      <pubDate>Sat, 28 Mar 2026 11:57:51 +0000</pubDate>
      <link>https://dev.to/osvaldofa/the-era-of-engineers-is-code-becoming-a-commodity-ofl</link>
      <guid>https://dev.to/osvaldofa/the-era-of-engineers-is-code-becoming-a-commodity-ofl</guid>
      <description>&lt;p&gt;&lt;strong&gt;TL;DR:&lt;/strong&gt; 🚀 In the age of GitHub Copilot and Cursor, generating code is becoming a commodity. The real value is shifting from &lt;em&gt;writing&lt;/em&gt; code to &lt;em&gt;designing&lt;/em&gt; solutions. We are entering the &lt;strong&gt;Era of Engineers&lt;/strong&gt;, where architectural thinking and technical curatorship are the ultimate competitive advantages.&lt;/p&gt;




&lt;h1&gt;
  
  
  The Era of Engineers
&lt;/h1&gt;

&lt;p&gt;Over more than two decades leading software projects, I have witnessed languages being born, paradigms shifting, and productivity tools jumping from simple text editors to complex AI-powered ecosystems. &lt;/p&gt;

&lt;p&gt;However, for a long time, one truth seemed immutable: a developer's direct impact was measured, invariably, by their ability to deliver functional code.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Code was the goal. Today, it is merely the means.&lt;/strong&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  🧠 The Senior’s Silence vs. The Junior’s Rush
&lt;/h3&gt;

&lt;p&gt;Anyone who has lived the daily routine of a software house knows this scene: faced with a complex problem, the &lt;strong&gt;senior developer&lt;/strong&gt; often spends more time staring at a whiteboard (or into space) than at the keyboard. They seek to understand flows, anticipate flaws, and design the solution. When they finally start typing, the code flows naturally and assertively.&lt;/p&gt;

&lt;p&gt;On the other hand, &lt;strong&gt;junior professionals&lt;/strong&gt; often have an urgent hunger to "open the IDE." For them, code is the discovery tool. But this "exploratory coding" frequently ignores business nuances, leading to costly rework and "course corrections" later in the project.&lt;/p&gt;

&lt;p&gt;The shift? This "rush" now has a powerful—and sometimes deceptive—ally: &lt;strong&gt;Generative AI.&lt;/strong&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  🌊 "Vibe Coding" and the Commoditization of Syntax
&lt;/h3&gt;

&lt;p&gt;We are fully entering the age of &lt;strong&gt;Vibe Coding&lt;/strong&gt;. With tools like &lt;strong&gt;GitHub Copilot, Cursor, and Antigravity&lt;/strong&gt;, the technical barrier to "writing something that works" has dropped drastically. &lt;/p&gt;

&lt;p&gt;If AI can generate the code, where does our value reside? It has moved from &lt;strong&gt;doing&lt;/strong&gt; to &lt;strong&gt;designing&lt;/strong&gt;. &lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;The Big Shift:&lt;/strong&gt; We have officially moved from the Era of Programmers to the &lt;strong&gt;Era of Engineers.&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;In this new phase, the differentiator is no longer syntax or mastering a specific framework, but:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Problem Decomposition:&lt;/strong&gt; Breaking down the "what" before the "how."&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Resilient Architecture:&lt;/strong&gt; Building systems that don't crumble under change.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Context Engineering:&lt;/strong&gt; Providing the right mental model to guide the AI.&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  🛡️ Curatorship: The New Technical Depth
&lt;/h3&gt;

&lt;p&gt;This isn't a threat to those starting their careers—it's a &lt;strong&gt;clarion call&lt;/strong&gt;. There is a false sense of security in simply knowing how to "operate" an AI. &lt;/p&gt;

&lt;p&gt;AI is an excellent co-pilot but a poor captain. The new software engineer must be, first and foremost, a &lt;strong&gt;curator&lt;/strong&gt;. To challenge the quality of an AI-generated artifact, you need an even more solid technical foundation than before. You must understand if that code is scalable, if it respects security principles, and if it isn't creating unpayable technical debt for the future.&lt;/p&gt;

&lt;h3&gt;
  
  
  🚀 The Future: Fewer Builders, More Architects
&lt;/h3&gt;

&lt;p&gt;I have no doubt that we will increasingly be judged not by "how many lines we delivered," but by "how well-structured our solution is." &lt;/p&gt;

&lt;p&gt;For managers and executives, the challenge is to recalibrate success metrics. For developers, the path is a return to the fundamentals: &lt;strong&gt;systems analysis, software design, and a deep understanding of the business.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The Era of Engineers is not about the end of code; it’s about the supremacy of thought. Ultimately, valuable software isn't just the one that runs—it's the one designed to solve the right problem in the smartest way possible.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;What do you think?&lt;/strong&gt; Are we becoming "AI Orchestrators," or is the fundamental role of an Engineer still the same? Let's discuss in the comments! 👇&lt;/p&gt;

</description>
      <category>career</category>
      <category>ai</category>
      <category>softwareengineering</category>
      <category>architecture</category>
    </item>
    <item>
      <title>The Architect’s Dilemma — Ep. 1: CAP Theorem in the Real World</title>
      <dc:creator>OSVALDO ALVES</dc:creator>
      <pubDate>Mon, 24 Nov 2025 12:03:49 +0000</pubDate>
      <link>https://dev.to/osvaldofa/the-architects-dilemma-ep-1-cap-theorem-in-the-real-world-1ff9</link>
      <guid>https://dev.to/osvaldofa/the-architects-dilemma-ep-1-cap-theorem-in-the-real-world-1ff9</guid>
      <description>&lt;p&gt;Most seasoned architects have been through something like this:&lt;br&gt;&lt;br&gt;
a tense meeting, several stakeholders at the table, deadlines tight — and suddenly someone asks:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;“But why can’t the system be consistent &lt;em&gt;and&lt;/em&gt; available at the same time?”&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;It’s in moments like this that we’re reminded that architecture is, above all, about making difficult decisions under non-negotiable constraints.&lt;br&gt;&lt;br&gt;
It’s about trade-offs. It’s about giving things up.&lt;br&gt;&lt;br&gt;
And this series exists to explore exactly these dilemmas.&lt;/p&gt;

&lt;p&gt;In the next episodes, we’ll dive into choices that shape modern systems: microservices vs. monoliths, CQRS, event-driven architectures, caching, idempotency, organizational scalability, and more.&lt;br&gt;&lt;br&gt;
Always from a practical, real-world perspective — far from pretty slides and close to the problems that actually hurt.&lt;/p&gt;

&lt;p&gt;So let’s begin with a classic.&lt;/p&gt;




&lt;h2&gt;
  
  
  CAP Theorem in the Real World
&lt;/h2&gt;

&lt;p&gt;The CAP Theorem is no longer an academic curiosity. Introduced by Eric Brewer in 2000, it states that a distributed system cannot simultaneously guarantee all three properties:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Consistency&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Availability&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Partition Tolerance&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;In practice, it shows up when your system grows, traffic increases, and non-functional requirements become harder. Suddenly, you’re forced to choose which type of pain you prefer.&lt;/p&gt;

&lt;p&gt;The CAP Theorem isn’t theoretical — it manifests every time you need to decide what happens when the network fails.&lt;br&gt;&lt;br&gt;
And &lt;strong&gt;networks always fail&lt;/strong&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  1. Context: When This Dilemma Appears
&lt;/h2&gt;

&lt;p&gt;CAP becomes relevant whenever you have:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Distributed data (replication, multiple nodes, multi-region)&lt;/li&gt;
&lt;li&gt;Requirements for high availability
&lt;/li&gt;
&lt;li&gt;Pressure for low latency
&lt;/li&gt;
&lt;li&gt;Users operating from multiple locations
&lt;/li&gt;
&lt;li&gt;Concurrent write operations
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Common triggers:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Traffic growth requiring replicas
&lt;/li&gt;
&lt;li&gt;Geographic expansion requiring multi-region
&lt;/li&gt;
&lt;li&gt;Increased availability requirements
&lt;/li&gt;
&lt;li&gt;Non-centralized persistence
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This leads to the big question:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Which pillar are you willing to relax — consistency, availability, or partition tolerance?&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h1&gt;
  
  
  2. The Options: What Each Alternative Means
&lt;/h1&gt;

&lt;p&gt;CAP defines three properties, but you can only guarantee two in the presence of network failure.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;C — Consistency (Strong Consistency)&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;All nodes see the same data at the same time.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;A — Availability&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;The system always responds, even if with outdated data.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;P — Partition Tolerance&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;The system continues operating even if communication between nodes is broken.&lt;/p&gt;

&lt;p&gt;⚠️ In real-world systems, &lt;strong&gt;Partition Tolerance is mandatory&lt;/strong&gt;.&lt;br&gt;&lt;br&gt;
So the choice becomes:&lt;/p&gt;

&lt;p&gt;➡️ &lt;strong&gt;CP vs. AP&lt;/strong&gt;&lt;/p&gt;




&lt;h1&gt;
  
  
  3. Trade-offs
&lt;/h1&gt;

&lt;h2&gt;
  
  
  CP (Consistency + Partition Tolerance)
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Advantages
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Strong consistency
&lt;/li&gt;
&lt;li&gt;Predictability in sensitive domains
&lt;/li&gt;
&lt;li&gt;Avoids critical data errors
&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Disadvantages
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;May reject requests during partitions
&lt;/li&gt;
&lt;li&gt;Higher latency
&lt;/li&gt;
&lt;li&gt;Lower availability perception
&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  AP (Availability + Partition Tolerance)
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Advantages
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Keeps responding even with failures
&lt;/li&gt;
&lt;li&gt;Lower latency
&lt;/li&gt;
&lt;li&gt;Great for real-time UX
&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Disadvantages
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Eventual consistency
&lt;/li&gt;
&lt;li&gt;Conflict resolution required
&lt;/li&gt;
&lt;li&gt;Higher cognitive complexity
&lt;/li&gt;
&lt;/ul&gt;




&lt;h1&gt;
  
  
  4. Decision Factors
&lt;/h1&gt;

&lt;h3&gt;
  
  
  4.1. Nature of the data
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Critical → &lt;strong&gt;CP&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Approximate → &lt;strong&gt;AP&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  4.2. UX latency expectations
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Can wait → &lt;strong&gt;CP&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Must be instant → &lt;strong&gt;AP&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  4.3. Geographic distribution
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Single region → flexible
&lt;/li&gt;
&lt;li&gt;Multi-region → often &lt;strong&gt;AP&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  4.4. Acceptable latency
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Low latency → &lt;strong&gt;AP&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  4.5. Team maturity
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Less experience → CP
&lt;/li&gt;
&lt;li&gt;Higher expertise → AP
&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  4.6. Business impact
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Errors are costly → CP
&lt;/li&gt;
&lt;li&gt;Errors are tolerable → AP
&lt;/li&gt;
&lt;/ul&gt;




&lt;h1&gt;
  
  
  5. Use Cases
&lt;/h1&gt;

&lt;h2&gt;
  
  
  Choose CP when:
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Financial transactions
&lt;/li&gt;
&lt;li&gt;Critical inventory
&lt;/li&gt;
&lt;li&gt;Process orchestration
&lt;/li&gt;
&lt;li&gt;High auditability
&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Choose AP when:
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Social networks
&lt;/li&gt;
&lt;li&gt;Counters, metrics, likes
&lt;/li&gt;
&lt;li&gt;Read-heavy catalogs
&lt;/li&gt;
&lt;li&gt;Global low-latency apps
&lt;/li&gt;
&lt;li&gt;Recommendations
&lt;/li&gt;
&lt;/ul&gt;




&lt;h1&gt;
  
  
  6. Warning Signs of a Wrong Choice
&lt;/h1&gt;

&lt;h2&gt;
  
  
  In CP:
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Slowness complaints
&lt;/li&gt;
&lt;li&gt;Traffic spikes compromising nodes
&lt;/li&gt;
&lt;li&gt;Replication bottlenecks
&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  In AP:
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Inconsistencies generate rework
&lt;/li&gt;
&lt;li&gt;Write conflicts become frequent
&lt;/li&gt;
&lt;li&gt;UX fluctuation (data “jumping”)
&lt;/li&gt;
&lt;/ul&gt;




&lt;h1&gt;
  
  
  7. How to Evolve Between Models
&lt;/h1&gt;

&lt;h2&gt;
  
  
  From CP → AP:
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Prepare models for divergence
&lt;/li&gt;
&lt;li&gt;Add conflict resolution
&lt;/li&gt;
&lt;li&gt;Implement read-repair
&lt;/li&gt;
&lt;li&gt;Reduce transactional boundaries
&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  From AP → CP:
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Identify critical domains
&lt;/li&gt;
&lt;li&gt;Centralize degree of truth
&lt;/li&gt;
&lt;li&gt;Use event logs
&lt;/li&gt;
&lt;li&gt;Reduce distributed surfaces
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Architecture is about &lt;strong&gt;balance, not extremes&lt;/strong&gt;.&lt;/p&gt;




&lt;h1&gt;
  
  
  Conclusion
&lt;/h1&gt;

&lt;p&gt;The CAP Theorem is a practical reminder:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;There is no perfect distributed system.&lt;br&gt;&lt;br&gt;
There is only the system that best fits your context.&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Architecture is about choices — and every choice has a cost.&lt;/p&gt;

&lt;p&gt;If this helped clarify a decision, leave a like and share your experience in the comments.&lt;br&gt;&lt;br&gt;
Let’s learn together.&lt;/p&gt;

</description>
      <category>architecture</category>
      <category>distributedsystems</category>
      <category>systemdesign</category>
    </item>
    <item>
      <title>Cloud App Journey: Ep. 5 — Cloud Security: Protecting APIs, Credentials, and Data on Azure</title>
      <dc:creator>OSVALDO ALVES</dc:creator>
      <pubDate>Tue, 11 Nov 2025 19:08:05 +0000</pubDate>
      <link>https://dev.to/osvaldofa/cloud-app-journey-ep-8-cloud-security-protecting-apis-credentials-and-data-on-azure-4oe8</link>
      <guid>https://dev.to/osvaldofa/cloud-app-journey-ep-8-cloud-security-protecting-apis-credentials-and-data-on-azure-4oe8</guid>
      <description>&lt;p&gt;In the previous chapters of the Cloud App Journey series, we explored deployment, containers, scalability, observability, and performance optimization. Now it's time to face one of the most critical topics in any distributed cloud application:&lt;/p&gt;

&lt;p&gt;Security.&lt;/p&gt;

&lt;p&gt;Here are a few questions you’ve probably asked yourself at some point (or should have):&lt;/p&gt;

&lt;p&gt;How can I ensure that only authorized users can access my APIs?&lt;/p&gt;

&lt;p&gt;How do I store sensitive secrets (like connection strings) without exposing them in code or config files?&lt;/p&gt;

&lt;p&gt;How do I prevent leaked credentials from compromising the entire production environment?&lt;/p&gt;

&lt;p&gt;In this episode, we’ll walk through how to address these challenges in Azure using .NET, with practical examples for modern microservices.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;1. How do we ensure that only authorized users can access the API?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The standard approach today is to protect APIs using OAuth 2.0 + OpenID Connect, with Azure Entra ID as the identity provider.&lt;/p&gt;

&lt;p&gt;The flow is straightforward:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;The user (or another application) obtains a JWT token from Azure Entra ID.&lt;/li&gt;
&lt;li&gt;The token is sent in the request header:
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Authorization: Bearer &amp;lt;token&amp;gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;The API validates that token and determines whether the request should be served.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Example: API requiring a specific Role&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="k"&gt;using&lt;/span&gt; &lt;span class="nn"&gt;Microsoft.AspNetCore.Authorization&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;using&lt;/span&gt; &lt;span class="nn"&gt;Microsoft.AspNetCore.Mvc&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;ApiController&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nf"&gt;Route&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"api/reports"&lt;/span&gt;&lt;span class="p"&gt;)]&lt;/span&gt;
&lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;ReportsController&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;ControllerBase&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="c1"&gt;// Only users with the role "admin.app" can access&lt;/span&gt;
    &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nf"&gt;HttpGet&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"financial"&lt;/span&gt;&lt;span class="p"&gt;)]&lt;/span&gt;
    &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nf"&gt;Authorize&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Roles&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"admin.app"&lt;/span&gt;&lt;span class="p"&gt;)]&lt;/span&gt;
    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="n"&gt;IActionResult&lt;/span&gt; &lt;span class="nf"&gt;GetFinancialReport&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nf"&gt;Ok&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Sensitive financial report..."&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If the token does not include the admin.app role → access is automatically denied.&lt;br&gt;
    No manual if checks&lt;br&gt;
    No duplicated logic&lt;br&gt;
    No custom middleware hacks&lt;/p&gt;

&lt;p&gt;How does the API validate tokens?&lt;br&gt;
appsettings.json (or environment variables in containers):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="nl"&gt;"AzureAd"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"Instance"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"https://login.microsoftonline.com/"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"TenantId"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"ClientId"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"api://my-backend-id"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;

&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Program.cs:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="n"&gt;builder&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Services&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;AddAuthentication&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Bearer"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;AddJwtBearer&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Bearer"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;options&lt;/span&gt; &lt;span class="p"&gt;=&amp;gt;&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;azureAd&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;builder&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Configuration&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;GetSection&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"AzureAd"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="n"&gt;options&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Authority&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;$"&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;azureAd&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s"&gt;"Instance"&lt;/span&gt;&lt;span class="p"&gt;]}{&lt;/span&gt;&lt;span class="n"&gt;azureAd&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s"&gt;"TenantId"&lt;/span&gt;&lt;span class="p"&gt;]}&lt;/span&gt;&lt;span class="s"&gt;/v2.0"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="n"&gt;options&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Audience&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;azureAd&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s"&gt;"ClientId"&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;
    &lt;span class="p"&gt;});&lt;/span&gt;

&lt;span class="n"&gt;builder&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Services&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;AddAuthorization&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Once configured → your API now only responds to identities recognized and authorized by Azure.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;2. How do we securely store sensitive data for microservices?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;A common example:&lt;br&gt;
Production database connection strings should not be stored in:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;appsettings.json&lt;/li&gt;
&lt;li&gt;.env files&lt;/li&gt;
&lt;li&gt;repository code&lt;/li&gt;
&lt;li&gt;manually copied configurations&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The standard solution is:&lt;br&gt;
Azure Key Vault → secure secret storage.&lt;br&gt;
You store secrets in Key Vault and your application consumes them without exposing the values directly.&lt;/p&gt;

&lt;p&gt;Example: Accessing Key Vault secrets in .NET&lt;/p&gt;

&lt;p&gt;Program.cs:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="k"&gt;using&lt;/span&gt; &lt;span class="nn"&gt;Azure.Identity&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;builder&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;WebApplication&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;CreateBuilder&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;args&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;keyVaultName&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;builder&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Configuration&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s"&gt;"KeyVaultName"&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;
&lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;uri&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nf"&gt;Uri&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;$"https://&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;keyVaultName&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s"&gt;.vault.azure.net/"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="n"&gt;builder&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Configuration&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;AddAzureKeyVault&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;uri&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nf"&gt;DefaultAzureCredential&lt;/span&gt;&lt;span class="p"&gt;());&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now your connection string can be used like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;connectionString&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;builder&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Configuration&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s"&gt;"DbConnectionString"&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;No secrets in code, repository, or pipelines.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;3. How do we deliver secrets to containers in production?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;When your API is deployed to Azure Kubernetes Service or Azure App Service, Key Vault can be integrated seamlessly using:&lt;/p&gt;

&lt;p&gt;Managed Identity (automatic identity for the resource)&lt;/p&gt;

&lt;p&gt;No passwords, no keys, no tokens.&lt;/p&gt;

&lt;p&gt;What happens:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The service identifies itself to Azure automatically.&lt;/li&gt;
&lt;li&gt;Azure checks whether it has permission to read from Key Vault.&lt;/li&gt;
&lt;li&gt;Secrets are retrieved securely, without being exposed at any point.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This eliminates:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;.env files leaking in logs&lt;/li&gt;
&lt;li&gt;secrets embedded in build pipelines&lt;/li&gt;
&lt;li&gt;hardcoded credentials&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;And strengthens:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Security&lt;/li&gt;
&lt;li&gt;Auditability&lt;/li&gt;
&lt;li&gt;Governance&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;Conclusion&lt;/p&gt;

&lt;p&gt;When it comes to cloud applications, security is not just about “enabling HTTPS.”&lt;br&gt;
It’s about protecting identity, authorization, and secrets consistently across environments.&lt;/p&gt;

&lt;p&gt;The good news is:&lt;br&gt;
With .NET and Azure, this strategy can be clear, robust, and maintainable.&lt;/p&gt;

&lt;p&gt;Security becomes part of the architecture, not an afterthought.&lt;/p&gt;

</description>
      <category>csharp</category>
      <category>azure</category>
      <category>security</category>
      <category>softwaredevelopment</category>
    </item>
    <item>
      <title>Cloud App Journey: Ep. 4 — Boosting Performance with Redis Cache on Azure</title>
      <dc:creator>OSVALDO ALVES</dc:creator>
      <pubDate>Tue, 21 Oct 2025 12:41:31 +0000</pubDate>
      <link>https://dev.to/osvaldofa/app-in-the-cloud-series-ep-4-boosting-performance-with-redis-cache-on-azure-f32</link>
      <guid>https://dev.to/osvaldofa/app-in-the-cloud-series-ep-4-boosting-performance-with-redis-cache-on-azure-f32</guid>
      <description>&lt;p&gt;When an application grows and the number of users increases, so does the number of database queries.&lt;br&gt;
What once worked perfectly can suddenly become a bottleneck — APIs slow down, response times increase, and performance starts to deteriorate.&lt;/p&gt;

&lt;p&gt;At that point, one question becomes inevitable:&lt;/p&gt;

&lt;p&gt;How can I make my application faster and more efficient without rewriting the entire codebase?&lt;/p&gt;

&lt;p&gt;That’s where caching comes in — one of the most effective and elegant solutions for improving performance in cloud applications.&lt;br&gt;
And in this seventh episode of the App in the Cloud series, we’ll explore how to use Azure Cache for Redis to boost your app’s performance and efficiency.&lt;/p&gt;

&lt;p&gt;⚡ The Role of Caching in Application Performance&lt;/p&gt;

&lt;p&gt;Every time an application retrieves data from a database or external service, it consumes resources — CPU, memory, and time.&lt;br&gt;
If the same information is requested repeatedly, it makes little sense to fetch it from the source every time.&lt;/p&gt;

&lt;p&gt;Caching allows us to temporarily store frequently accessed data in memory, so subsequent requests can be answered almost instantly.&lt;/p&gt;

&lt;p&gt;In practice, caching can:&lt;/p&gt;

&lt;p&gt;Reduce latency in API calls&lt;/p&gt;

&lt;p&gt;Decrease database load&lt;/p&gt;

&lt;p&gt;Improve scalability and resilience&lt;/p&gt;

&lt;p&gt;Lower operational costs&lt;/p&gt;

&lt;p&gt;In cloud environments, caching becomes even more strategic: it helps maintain performance consistency, even when demand spikes.&lt;/p&gt;

&lt;p&gt;☁️ Azure Cache for Redis: What It Is and Why It Matters&lt;/p&gt;

&lt;p&gt;Azure Cache for Redis is Microsoft’s managed Redis service — fully compatible with the open-source Redis engine, but with all the scalability, monitoring, and security features that come with Azure.&lt;/p&gt;

&lt;p&gt;With it, you can:&lt;/p&gt;

&lt;p&gt;Store and retrieve data in-memory at lightning speed&lt;/p&gt;

&lt;p&gt;Cache session state or frequently accessed objects&lt;/p&gt;

&lt;p&gt;Implement distributed locks or queues&lt;/p&gt;

&lt;p&gt;Scale elastically according to your workload&lt;/p&gt;

&lt;p&gt;And the best part: you don’t have to worry about managing infrastructure, nodes, or clusters — Azure handles that for you.&lt;/p&gt;

&lt;p&gt;🧩 Example: Integrating Redis Cache in a Java Application&lt;/p&gt;

&lt;p&gt;If you have a Spring Boot application, connecting to Azure Cache for Redis is quite straightforward.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;@Configuration
public class RedisConfig {

    @Bean
    public LettuceConnectionFactory redisConnectionFactory() {
        return new LettuceConnectionFactory("your-redis-name.redis.cache.windows.net", 6380);
    }

    @Bean
    public RedisTemplate&amp;lt;String, Object&amp;gt; redisTemplate() {
        RedisTemplate&amp;lt;String, Object&amp;gt; template = new RedisTemplate&amp;lt;&amp;gt;();
        template.setConnectionFactory(redisConnectionFactory());
        return template;
    }
}

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Once connected, your application can use RedisTemplate to store and retrieve data — without constantly hitting the database.&lt;br&gt;
You can cache anything from small objects to entire API responses, depending on your use case.&lt;/p&gt;

&lt;p&gt;🚀 Best Practices for Efficient Caching&lt;/p&gt;

&lt;p&gt;When caching is used wisely, it can drastically improve both user experience and system stability.&lt;br&gt;
Here are some best practices to keep in mind:&lt;/p&gt;

&lt;p&gt;Define appropriate expiration times (TTL):&lt;br&gt;
Never keep data in cache longer than necessary.&lt;/p&gt;

&lt;p&gt;Cache only what’s stable:&lt;br&gt;
Avoid caching data that changes frequently or is highly dynamic.&lt;/p&gt;

&lt;p&gt;Use eviction policies:&lt;br&gt;
Redis supports policies such as Least Recently Used (LRU) and Least Frequently Used (LFU) — choose the one that fits your needs.&lt;/p&gt;

&lt;p&gt;Monitor your cache performance:&lt;br&gt;
Pay attention to metrics like hit/miss ratio — it reveals how effective your caching strategy really is.&lt;/p&gt;

&lt;p&gt;Plan for elasticity, not just scalability:&lt;br&gt;
Your cache should not only grow when demand increases but also shrink when it drops.&lt;br&gt;
That’s what defines a truly elastic architecture.&lt;/p&gt;

&lt;p&gt;🧠 &lt;strong&gt;Redis Stack: Beyond Simple Caching&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Redis has evolved a lot over the years, becoming much more than just a key-value store.&lt;br&gt;
With Redis Stack, available in Azure Cache for Redis Enterprise tiers, new capabilities expand its use cases:&lt;/p&gt;

&lt;p&gt;Feature Description Use Case&lt;br&gt;
RedisJSON   Store and query JSON documents directly APIs and microservices using structured data&lt;br&gt;
RedisSearch / Vector Search Full-text and semantic search   AI, chatbots, and recommendation systems&lt;br&gt;
RedisStreams    Event stream management Real-time data pipelines and message processing&lt;br&gt;
RedisTimeSeries Time-based data storage Monitoring, analytics, IoT metrics&lt;/p&gt;

&lt;p&gt;These features make Redis a real-time data layer capable of supporting event-driven and intelligent applications — far beyond simple caching.&lt;/p&gt;

&lt;p&gt;💬 Wrapping Up&lt;/p&gt;

&lt;p&gt;Performance is not just about writing fast code — it’s about making smart architectural decisions.&lt;br&gt;
Redis helps you do exactly that: reduce latency, offload your database, and create a smoother experience for users.&lt;/p&gt;

&lt;p&gt;And when combined with the scalability and reliability of Azure, it becomes a powerful foundation for modern applications.&lt;/p&gt;

</description>
      <category>azure</category>
      <category>architecture</category>
      <category>tutorial</category>
      <category>performance</category>
    </item>
    <item>
      <title>Cloud App Journey - Ep. 3: Publishing my Backend in Containers exploring the Cloud</title>
      <dc:creator>OSVALDO ALVES</dc:creator>
      <pubDate>Mon, 25 Aug 2025 12:27:24 +0000</pubDate>
      <link>https://dev.to/osvaldofa/cloud-app-journey-ep-3-publishing-my-backend-in-containers-exploring-the-cloud-4j7f</link>
      <guid>https://dev.to/osvaldofa/cloud-app-journey-ep-3-publishing-my-backend-in-containers-exploring-the-cloud-4j7f</guid>
      <description>&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fe5p3jkll8q3k2y9sgmp1.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fe5p3jkll8q3k2y9sgmp1.png" alt="Image with a blue background, meaning the sky, with clouds, containers,a laptop and a whale" width="800" height="532"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If you've been following the previous episodes of our "App na Cloud" series, you've already seen how easy it is to start deploying applications to the cloud—whether it's authentication with Azure services, publishing full-stack applications via App Service, or deploying lightweight and cost-effective frontends.&lt;/p&gt;

&lt;p&gt;Now it's time to talk about a very relevant topic in a developer's daily life: containers.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why Containers?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Containers are one of the most flexible and portable ways to package and distribute applications today. With them, we can:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Ensure the application runs the same way in any environment.&lt;/li&gt;
&lt;li&gt;Quickly deploy new versions without configuration headaches.&lt;/li&gt;
&lt;li&gt;Take the same image to different clouds or even run it locally.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;In other words, if you have a backend API, for example, you can package it into an image and run it exactly the same on your laptop, an on-premises server, or any cloud.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Where to Store My Images?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Before publishing containers on Azure, we need an image repository. Here are some options:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1. Docker Hub (Free and Popular)&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;By creating an account on Docker Hub, you can upload your images and use them from anywhere.&lt;/li&gt;
&lt;li&gt;Ideal for personal projects, prototypes, or when you don't need fine-grained security control.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Example of publishing an image:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;# Build the image
docker build -t my-user/my-backend:1.0 .

# Login to Docker Hub
docker login

# Push to the repository
docker push my-user/my-backend:1.0
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;2. Azure Container Registry (ACR)&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Microsoft's private image repository on Azure.&lt;/li&gt;
&lt;li&gt;Offers security, integration with Active Directory, and can be used in corporate scenarios.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Creating an ACR via Azure CLI:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;az acr create --resource-group my-group \
  --name myacrregistry \
  --sku Basic
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Logging in and pushing the image:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;# Login to the registry
az acr login --name myacrregistry

# Tag for ACR
docker tag my-backend:1.0 myacrregistry.azurecr.io/my-backend:1.0

# Push
docker push myacrregistry.azurecr.io/my-backend:1.0
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now your image is securely stored in Azure.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Publishing Containers on Azure&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Once we have the image, we need a service on Azure to run it. Here are some alternatives:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Azure Container Apps (Recommended for Simplicity)&lt;/li&gt;
&lt;li&gt;Serverless service for containers.&lt;/li&gt;
&lt;li&gt;Automatic scaling, and you only pay for usage.&lt;/li&gt;
&lt;li&gt;Great for backends and APIs.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Quick creation example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;az containerapp create \
  --name my-backend-app \
  --resource-group my-group \
  --environment my-env \
  --image myacrregistry.azurecr.io/my-backend:1.0 \
  --target-port 8080 \
  --ingress external
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Your backend will now be available at a public endpoint.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. Azure Container Instances (ACI)&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Still a valid service, focused on simplicity.&lt;/li&gt;
&lt;li&gt;Allows quickly running a single container without much configuration.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It's like a "docker run" in the cloud.&lt;/p&gt;

&lt;p&gt;Example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;az container create \
  --resource-group my-group \
  --name my-backend-aci \
  --image myacrregistry.azurecr.io/my-backend:1.0 \
  --ports 8080
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;3. Azure Kubernetes Services (AKS)&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;More powerful and comprehensive, but also more complex.&lt;/li&gt;
&lt;li&gt;Suitable for scaling and high availability scenarios.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Not the focus of this article, but worth noting as the alternative for robust production scenarios.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Which Path to Follow?&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Personal project / study → Docker Hub + Container Apps or Container Instances&lt;/li&gt;
&lt;li&gt;Simple corporate project → ACR + Container Apps&lt;/li&gt;
&lt;li&gt;Larger-scale production → ACR + AKS&lt;/li&gt;
&lt;/ul&gt;

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

&lt;p&gt;We've reached the end of another episode of the "App na Cloud" series. Today, we saw that deploying backends in containers can be much simpler than it seems—whether using a public repository on Docker Hub or exploring the power of Azure Container Registry combined with Azure App Service or Azure Container Apps.&lt;/p&gt;

&lt;p&gt;But publishing is just the first part of the journey. The real challenge begins when your application needs to run in production in a stable, secure, and observable manner. This is when monitoring practices and services come into play, ensuring you truly know what's happening with your app, whether it's consuming many resources, handling failures, or serving thousands of simultaneous users.&lt;/p&gt;

&lt;p&gt;In the next episode, we'll delve into these monitoring practices and tools.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Cloud App Journey - Ep. 2: Publishing My Frontend to the Cloud</title>
      <dc:creator>OSVALDO ALVES</dc:creator>
      <pubDate>Mon, 18 Aug 2025 12:52:30 +0000</pubDate>
      <link>https://dev.to/osvaldofa/cloud-app-journey-ep-3-publishing-my-frontend-to-the-cloud-18nl</link>
      <guid>https://dev.to/osvaldofa/cloud-app-journey-ep-3-publishing-my-frontend-to-the-cloud-18nl</guid>
      <description>&lt;p&gt;🚀 Welcome to the second episode of our Cloud App Journey series!&lt;br&gt;
After learning how to authenticate with Azure services and how to publish our backend, today we’ll focus on the frontend.&lt;/p&gt;

&lt;p&gt;If you’re building a Single Page Application (SPA) with frameworks like React, Angular, or Vue, you’ll see that publishing your app on Azure is simpler and cheaper than you might think.&lt;/p&gt;

&lt;p&gt;🌐 &lt;strong&gt;Choosing the Best Hosting Option&lt;/strong&gt;&lt;br&gt;
When publishing SPAs in Azure, you might think about using App Service (the same one we used for the backend).&lt;br&gt;
But here’s the trick: SPAs don’t need a full backend hosting environment.&lt;/p&gt;

&lt;p&gt;Instead, the most efficient and cost-effective way is to use Azure Storage Static Website Hosting.&lt;/p&gt;

&lt;p&gt;Why?&lt;br&gt;
✔️ Incredibly cheap (we’re talking cents per month).&lt;br&gt;
✔️ Extremely simple to configure.&lt;br&gt;
✔️ Built-in high availability.&lt;br&gt;
✔️ Integrates seamlessly with Azure CDN, for global distribution if needed.&lt;/p&gt;

&lt;p&gt;📦 &lt;strong&gt;Step 1: Preparing Your Build&lt;/strong&gt;&lt;br&gt;
If you’re using React, Angular, or another SPA framework, the first step is to build the production version of your app.&lt;/p&gt;

&lt;p&gt;For example, in Angular:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;ng build --configuration production
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;In React:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;npm run build
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This will generate a folder (usually called dist or build) with all the compiled static files (HTML, CSS, JS, and assets).&lt;/p&gt;

&lt;p&gt;☁️ &lt;strong&gt;Step 2: Creating a Storage Account&lt;/strong&gt;&lt;br&gt;
In Azure Portal:&lt;/p&gt;

&lt;p&gt;Search for Storage Account.&lt;/p&gt;

&lt;p&gt;Create a new account (standard performance is usually enough).&lt;/p&gt;

&lt;p&gt;Go to the Static Website menu (inside the storage account).&lt;/p&gt;

&lt;p&gt;Enable it and configure the index document (e.g., index.html) and error document (e.g., index.html as well, if you’re using SPA routing).&lt;/p&gt;

&lt;p&gt;This will generate a public URL for your website, something like:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;https://&amp;lt;your-storage-account&amp;gt;.zxx.web.core.windows.net
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;📂 &lt;strong&gt;Step 3: Uploading Your Files&lt;/strong&gt;&lt;br&gt;
There are different ways to upload your SPA build to the storage account:&lt;/p&gt;

&lt;p&gt;Azure Portal: upload files directly in the browser.&lt;/p&gt;

&lt;p&gt;Azure Storage Explorer (a free Microsoft tool).&lt;/p&gt;

&lt;p&gt;Azure CLI:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;az storage blob upload-batch \
  --account-name &amp;lt;your-storage-account&amp;gt; \
  --destination '$web' \
  --source ./build
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;⚡ &lt;strong&gt;Step 4: (Optional) Adding a CDN&lt;/strong&gt;&lt;br&gt;
If your users are spread across different regions, you can easily integrate a CDN to ensure your frontend loads faster worldwide.&lt;/p&gt;

&lt;p&gt;In the storage account:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Go to Front Door and CDN.&lt;/li&gt;
&lt;li&gt;Create a new CDN profile.&lt;/li&gt;
&lt;li&gt;Link it to your static website endpoint.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That’s it — now your SPA is globally distributed! 🌍&lt;/p&gt;

&lt;p&gt;🎉 &lt;strong&gt;Wrapping Up&lt;/strong&gt;&lt;br&gt;
Publishing your frontend in Azure doesn’t have to be complicated or expensive.&lt;br&gt;
With just a Storage Account, you get a secure, highly available, and low-cost hosting solution for your SPAs.&lt;/p&gt;

&lt;p&gt;👉 In the next episode, we’ll explore how to publish containerized App, front and/or backend apps.&lt;/p&gt;

&lt;p&gt;💡 Have you already tried publishing a frontend in Azure? What challenges did you face? Share your experience in the comments!&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Cloud App Journey — Ep. 1: Deploying your Backend to Azure — The Easiest Path</title>
      <dc:creator>OSVALDO ALVES</dc:creator>
      <pubDate>Wed, 06 Aug 2025 13:23:02 +0000</pubDate>
      <link>https://dev.to/osvaldofa/cloud-app-journey-ep-1-deploying-your-backend-to-azure-the-easiest-path-4cen</link>
      <guid>https://dev.to/osvaldofa/cloud-app-journey-ep-1-deploying-your-backend-to-azure-the-easiest-path-4cen</guid>
      <description>&lt;p&gt;Welcome to the first article of our new series App na Cloud — designed to help software developers who are taking their first steps with cloud development on Azure.&lt;/p&gt;

&lt;p&gt;In this series, we’ll go hands-on with common use cases, best practices, and practical guidance on how to run your apps in the cloud — with real examples using Azure services.&lt;/p&gt;

&lt;p&gt;We’ll focus on how to deploy, secure, and scale your backend applications — with minimal friction.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What Are We Building?&lt;/strong&gt;&lt;br&gt;
Every modern application needs a backend running somewhere. Azure offers several options to host and run your backend, but we’ll start by covering the three most practical and beginner-friendly options for developers:&lt;/p&gt;

&lt;p&gt;✅ Azure App Service&lt;br&gt;
✅ Azure Container Apps&lt;br&gt;
✅ Azure Functions&lt;/p&gt;

&lt;p&gt;Each one will be covered in its own article. Today, we begin with the Azure App Service, one of the simplest ways to deploy REST APIs and web applications to Azure.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What is Azure App Service?&lt;/strong&gt;&lt;br&gt;
Azure App Service is a fully managed platform for building, deploying, and scaling web apps and APIs. It takes care of the infrastructure so you can focus on your code.&lt;/p&gt;

&lt;p&gt;You can deploy .NET, Node.js, Java, Python, and more — and benefit from built-in scaling, SSL support, custom domains, staging environments, and easy CI/CD integration.&lt;/p&gt;

&lt;p&gt;Step-by-step: Publishing a .NET 9 Web API on Azure App Service&lt;br&gt;
Let’s go through how to publish a basic REST API built with ASP.NET Core (.NET 9) using Visual Studio.&lt;/p&gt;

&lt;p&gt;🔹 Step 1 – Create an App Service on Azure&lt;br&gt;
In the Azure Portal:&lt;br&gt;
Go to Create a Resource &amp;gt; App Service.&lt;/p&gt;

&lt;p&gt;🔹 Fill in the basic settings:&lt;br&gt;
    Resource Group&lt;br&gt;
    App Name (e.g. my-api-demo)&lt;br&gt;
    Runtime Stack: .NET 9 (LTS)&lt;br&gt;
    Region: Choose one close to your users&lt;/p&gt;

&lt;p&gt;🔹 Step 3 – Create your Web API Project&lt;br&gt;
In Visual Studio:&lt;br&gt;
    Create a new ASP.NET Core Web API project.&lt;br&gt;
    Choose .NET 9 as the target framework.&lt;br&gt;
    Add a simple controller like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;
[ApiController]
[Route("[controller]")]
public class HelloController : ControllerBase
{
    [HttpGet]
    public string Get() =&amp;gt; "Hello from Azure!";
}

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;🔹 Step 4 – Publish from Visual Studio&lt;br&gt;
    Right-click the project &amp;gt; Publish.&lt;br&gt;
    Choose Azure &amp;gt; App Service (Windows).&lt;br&gt;
    Sign in, select your subscription and App Service.&lt;br&gt;
    Click Publish — and you're live!&lt;/p&gt;

&lt;p&gt;Your API will be publicly available at a URL like:&lt;br&gt;
&lt;a href="https://my-api-demo.azurewebsites.net/hello" rel="noopener noreferrer"&gt;https://my-api-demo.azurewebsites.net/hello&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;✅ Why Use Azure App Service?&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;No infrastructure management&lt;/li&gt;
&lt;li&gt;Built-in DevOps support (GitHub, Azure DevOps, etc.)&lt;/li&gt;
&lt;li&gt;Automatic scaling and high availability&lt;/li&gt;
&lt;li&gt;Easy integration with Azure AD, Blob Storage, SQL, and more&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;What’s Next?&lt;/strong&gt;&lt;br&gt;
In the upcoming articles, we’ll explore:&lt;br&gt;
    Azure Container Apps — perfect for containerized apps and microservices&lt;br&gt;
    Azure Functions — ideal for serverless and event-driven architectures&lt;br&gt;
    Stay tuned and follow the series to keep learning how to build modern cloud-native backends using Azure! 🚀&lt;/p&gt;

</description>
    </item>
  </channel>
</rss>
