<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Architecture &#8211; blog.boro2g .co.uk</title>
	<atom:link href="https://blog.boro2g.co.uk/category/architecture/feed/" rel="self" type="application/rss+xml" />
	<link>https://blog.boro2g.co.uk</link>
	<description>Some ideas about coding, dev and all things online.</description>
	<lastBuildDate>Tue, 30 Mar 2021 14:29:32 +0000</lastBuildDate>
	<language>en-US</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=6.5.8</generator>
	<item>
		<title>Why is choosing a CMS so damn hard?</title>
		<link>https://blog.boro2g.co.uk/why-is-choosing-a-cms-so-damn-hard/</link>
					<comments>https://blog.boro2g.co.uk/why-is-choosing-a-cms-so-damn-hard/#respond</comments>
		
		<dc:creator><![CDATA[boro]]></dc:creator>
		<pubDate>Tue, 30 Mar 2021 13:36:58 +0000</pubDate>
				<category><![CDATA[Architecture]]></category>
		<category><![CDATA[CMS]]></category>
		<category><![CDATA[Contentful]]></category>
		<category><![CDATA[Mach]]></category>
		<category><![CDATA[Sitecore]]></category>
		<guid isPermaLink="false">https://blog.boro2g.co.uk/?p=1163</guid>

					<description><![CDATA[<p>Imagine the scenario &#8211; you start on a new feature or project and there is a need for dynamic content. Sounds simple right? Just pick a CMS platform, setup an account, update a bit of content, publish and you are done. Well, if only it was that simple! * *Note &#8211; this post assumes that [&#8230;]</p>
<p>The post <a rel="nofollow" href="https://blog.boro2g.co.uk/why-is-choosing-a-cms-so-damn-hard/">Why is choosing a CMS so damn hard?</a> appeared first on <a rel="nofollow" href="https://blog.boro2g.co.uk">blog.boro2g .co.uk</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<p>Imagine the scenario &#8211; you start on a new feature or project and there is a need for dynamic content. Sounds simple right? Just pick a CMS platform, setup an account, update a bit of content, publish and you are done. Well, if only it was that simple! *</p>



<p><em>*Note &#8211; this post assumes that a platform like WordPress isn&#8217;t sufficient for your requirements</em> </p>



<p><strong>Where to start?</strong></p>



<p>If you look at <a rel="noreferrer noopener" href="https://en.wikipedia.org/wiki/List_of_content_management_systems" target="_blank">https://en.wikipedia.org/wiki/List_of_content_management_systems</a>, it certainly won&#8217;t clear things up. There are a LOT of options! So, what sort of information should you use to feed into your decision process?</p>



<p><strong>A few core CMS concepts</strong></p>



<p>Before we go further, let&#8217;s define a few key concepts:</p>



<ul><li>Headless Content Management System (CMS) &#8211; &#8220;A headless CMS is a content management system that provides a way to author content, but instead of having your content coupled to a particular output (like web page rendering), it provides your content as data over an API.&#8221; <a rel="noreferrer noopener" href="https://www.sanity.io/blog/headless-cms-explained" target="_blank">https://www.sanity.io/blog/headless-cms-explained</a></li><li>Digital Experience Platform (DXP) &#8211; &#8220;Gartner defines a digital experience platform (DXP) as an integrated set of technologies, based on a common platform, that provides a broad range of audiences with consistent, secure and personalized access to information and applications across many digital touchpoints.&#8221; <a rel="noreferrer noopener" href="https://www.gartner.com/reviews/market/digital-experience-platforms" target="_blank">https://www.gartner.com/reviews/market/digital-experience-platforms</a></li></ul>



<p>It&#8217;s worth noting that certain vendors aim to fulfil both entries above, whereas others operate purely as headless, cloud native SAAS providers.</p>



<p><strong>How to help you make a decision?</strong></p>



<p><em>Ah, but what if the decision has already been made</em>? </p>



<p>Within your team(s) or business(es), do you have an existing CMS? If so, can it be scaled or modified to serve your new needs. It&#8217;s worth considering that &#8216;scaled&#8217; here covers many things &#8211; licensing, usability, modifiability, supportability, physical capacity and a raft more. This discussion often leads to some interesting outcomes and can easily expose issues, or the opposite, a positive view of existing tooling.</p>



<p><em>Ok, so we already successfully use CMS X</em></p>



<p>We&#8217;re getting warmer, but I&#8217;d suggest you still need to answer a few more questions:</p>



<ul><li>Is it fit for purpose?</li><li>Do it&#8217;s content delivery approaches fit the needs of your new requirements?</li><li>Will the team that use the system be the same as the existing editors?</li></ul>



<p><strong>How to select a <em>new </em>CMS?</strong></p>



<p>I&#8217;d recommend you build up your own criteria for assessing different tools, here are a few thought starters:</p>



<ul><li>Cost<ul><li>What are the license fees, and how do they scale?<ul><li>Is it a consistent cost year by year?</li><li>What if you need more editors?</li><li>What if you need more content items, or media items?</li><li>What if you need to serve more traffic?</li><li>How much would a new environment cost?</li></ul></li><li>How much does it cost to run and maintain the system?<ul><li>What hosting costs will you incur?</li><li>How much does a release cost?</li><li>What cost lies with your different DR options?</li><li>How will the infra receive security patches and software upgrades?</li><li>What does an upgrade of the tool look like? Is it handled for you, or do you need to own an upgrade?<ul><li>Note. This has stung us hard in the past with certain vendors!</li></ul></li></ul></li></ul><ul><li>How much effort/cost is required to set it up before you can focus on delivery of features to the customer?</li></ul></li><li>Features<ul><li>Does the tool support the features you require?</li><li>Or, does the tool come with features you don&#8217;t require?<ul><li>This is an interesting point &#8211; are you buying a Ferrari when all you need is a Ford?</li></ul></li><li>Are your competitors using the same tool?<ul><li>Does it suit your business model?</li></ul></li><li>What multi-lingual requirements do you have?<ul><li>And how does that map to content and presentation?</li></ul></li></ul></li><li>Technology constraints<ul><li>Are there any technology restrictions imposed by the tools<ul><li>E.g. hosting options, language choices, CI/CD patterns, tooling constraints</li><li>Who owns the hosted platform, and how do backups work?</li><li>Does the location of data matter for your business?</li></ul></li></ul></li><li>Platform vs a tool<ul><li>This ties into the concepts above, do you want a DXP or a headless CMS</li><li>Is a <a rel="noreferrer noopener" href="https://www.avenga.com/magazine/composable-architecture" target="_blank">composable architecture</a> desirable for your team(s)?</li></ul></li><li>Out the box vs bespoke<ul><li>What comes &#8216;for free&#8217;? And, do you even want the &#8216;free&#8217; features?<ul><li>If we think of enterprise platforms such as Sitecore, you get a lot OTB for free. E.g. the concept of sites, pipelines, commands and many more. </li><li>If you go down the headless route this lies in your dev teams hands.</li></ul></li></ul></li><li>Building a team<ul><li>Can you even build a team around tool X?</li><li>Do you have in-house experience in the tool or associated tools?</li></ul></li><li>Support<ul><li>What if something goes wrong, what support can you get?<ul><li>Note, I&#8217;d see support running from before you sign the contracts all the way through to post live ongoing support</li></ul></li></ul></li><li>Scalability, performance and common NFR&#8217;s<ul><li>Will the tool scale and perform to your requirements?</li></ul></li></ul>



<p>It&#8217;s worth noting, this is not meant to be an exhaustive list &#8211; every project will have different requirements and metrics that get prioritized. The goal is to provide some thought starters in areas we&#8217;ve found useful in the past.</p>



<p><strong>Finally, the fun part &#8211; rolling it out</strong></p>



<figure class="wp-block-image size-large"><a href="https://blog.boro2g.co.uk/wp-content/uploads/2021/03/a8d4e44df35f2f5f42ebe27a2bd272d674253259f5d7862ab6624effbd3d484b1.jpg"><img fetchpriority="high" decoding="async" width="400" height="400" src="https://blog.boro2g.co.uk/wp-content/uploads/2021/03/a8d4e44df35f2f5f42ebe27a2bd272d674253259f5d7862ab6624effbd3d484b1.jpg" alt="" class="wp-image-1170" srcset="https://blog.boro2g.co.uk/wp-content/uploads/2021/03/a8d4e44df35f2f5f42ebe27a2bd272d674253259f5d7862ab6624effbd3d484b1.jpg 400w, https://blog.boro2g.co.uk/wp-content/uploads/2021/03/a8d4e44df35f2f5f42ebe27a2bd272d674253259f5d7862ab6624effbd3d484b1-300x300.jpg 300w, https://blog.boro2g.co.uk/wp-content/uploads/2021/03/a8d4e44df35f2f5f42ebe27a2bd272d674253259f5d7862ab6624effbd3d484b1-150x150.jpg 150w" sizes="(max-width: 400px) 100vw, 400px" /></a></figure>



<p>Well, almost. Now the <s>fun</s> / <s>hard</s> part (omit for your preference :)). </p>



<p>You have your new tool, but how does it map to the business? How will the editors get on with it? What does multi-lingual design look like? What technology do you use to build the front ends? Where to start? What is the meaning of life?</p>



<p>Maybe that&#8217;s content for another blog post&#8230;</p>



<p><em>Happy editing!</em></p>
<p>The post <a rel="nofollow" href="https://blog.boro2g.co.uk/why-is-choosing-a-cms-so-damn-hard/">Why is choosing a CMS so damn hard?</a> appeared first on <a rel="nofollow" href="https://blog.boro2g.co.uk">blog.boro2g .co.uk</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://blog.boro2g.co.uk/why-is-choosing-a-cms-so-damn-hard/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Monolith, microservice or something in-between</title>
		<link>https://blog.boro2g.co.uk/monolith-microservice-or-something-in-between/</link>
					<comments>https://blog.boro2g.co.uk/monolith-microservice-or-something-in-between/#respond</comments>
		
		<dc:creator><![CDATA[boro]]></dc:creator>
		<pubDate>Fri, 18 Sep 2020 15:05:49 +0000</pubDate>
				<category><![CDATA[Architecture]]></category>
		<category><![CDATA[Webapi]]></category>
		<guid isPermaLink="false">https://blog.boro2g.co.uk/?p=1129</guid>

					<description><![CDATA[<p>In a recent project we had an interesting challenge as to how we structured and architected our dotnetcore web api&#8217;s. We wanted development and deployment agility, but to maintain the flexibility that comes from micro(macro*)services. * Arguably the term you use here depends on how you choose to cut your system and services What to [&#8230;]</p>
<p>The post <a rel="nofollow" href="https://blog.boro2g.co.uk/monolith-microservice-or-something-in-between/">Monolith, microservice or something in-between</a> appeared first on <a rel="nofollow" href="https://blog.boro2g.co.uk">blog.boro2g .co.uk</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<p>In a recent project we had an interesting challenge as to how we structured and architected our dotnetcore web api&#8217;s. We wanted development and deployment agility, but to maintain the flexibility that comes from micro(macro*)services. </p>



<p><em>* Arguably the term you use here depends on how you choose to cut your system and services</em></p>



<p><strong>What to expect</strong></p>



<p>Well, maybe lets start with the opposite &#8211; what not to expect?</p>



<ul><li>This isn&#8217;t aimed to be a starter kit, it&#8217;s goal is to provide examples</li><li>How you choose to cut up your apis, well that&#8217;s one for you too &#8211; sorry</li><li>And finally, how you choose to name things (models vs data, services vs domain, core vs base, shared vs common) &#8211; yep, that&#8217;s also up to you</li></ul>



<p>Now the good bits, what to expect?</p>



<p>The goal of the example project (<a rel="noreferrer noopener" href="https://github.com/boro2g/MonolithToMicroserviceApi" target="_blank">https://github.com/boro2g/MonolithToMicroserviceApi</a>) is to show working examples of the following scenarios:</p>



<ul><li>Each WebApi project can run in isolation, without knowledge of others<ul><li>The same mindset applies to deployments &#8211; each WebApi can be deployed in isolation</li></ul></li><li>All the WebApi&#8217;s can be run and deployed as a single application</li></ul>



<p><strong>Why add this extra complexity?</strong></p>



<p>Good question. The key thing for me is flexibility. If it&#8217;s done right you give yourself options &#8211; you want to deploy as a monolith, no problem. You want to deploy each bit in isolation, well that&#8217;s fine too.</p>



<p><strong>How does it look?</strong></p>



<figure class="wp-block-image size-large"><img decoding="async" width="387" height="231" src="https://blog.boro2g.co.uk/wp-content/uploads/2020/09/image.png" alt="" class="wp-image-1131" srcset="https://blog.boro2g.co.uk/wp-content/uploads/2020/09/image.png 387w, https://blog.boro2g.co.uk/wp-content/uploads/2020/09/image-300x179.png 300w" sizes="(max-width: 387px) 100vw, 387px" /></figure>



<p>Some key highlights of the image above:</p>



<ol><li><em>MonolithToMicroserviceApi.WebApi</em><ol><li>This is the shared singular WebApi project that brings everything together</li><li>You can run this via IISExpress, or IIS etc and all the Api&#8217;s from the other projects will work within it</li></ol></li><li><em>MonolithToMicroserviceApi.Search.WebApi</em><ol><li>This is the search micro(macro) service</li><li>You can run this in isolation, much like you can the common one</li></ol></li><li><em>MonolithToMicroserviceApi.Weather.WebApi</em><ol><li>The same concept as Search, but with other example controllers and code</li></ol></li><li><em>MonolithToMicroserviceApi.Shared.*</em><ol><li>These libraries contain common functionality that&#8217;s shared between each WebApi</li></ol></li></ol>



<p><strong>Adding a new WebApi</strong></p>



<p>The search project has a good example of this. If you look in <em>MonolithToMicroserviceApi.Search.WebApi.Startup</em> </p>



<figure class="wp-block-image size-large"><img decoding="async" width="623" height="395" src="https://blog.boro2g.co.uk/wp-content/uploads/2020/09/image-1.png" alt="" class="wp-image-1134" srcset="https://blog.boro2g.co.uk/wp-content/uploads/2020/09/image-1.png 623w, https://blog.boro2g.co.uk/wp-content/uploads/2020/09/image-1-300x190.png 300w" sizes="(max-width: 623px) 100vw, 623px" /></figure>



<p>You need to add the ApiConfiguration class itself (see the project for examples), the ApiConfigurations code above and then register them all.</p>



<p>Similarly in the common project startup (<em>MonolithToMicroserviceApi.WebApi.Startup</em>). Simply add each ApiConfiguration and register them.</p>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="323" height="108" src="https://blog.boro2g.co.uk/wp-content/uploads/2020/09/image-2.png" alt="" class="wp-image-1135" srcset="https://blog.boro2g.co.uk/wp-content/uploads/2020/09/image-2.png 323w, https://blog.boro2g.co.uk/wp-content/uploads/2020/09/image-2-300x100.png 300w" sizes="(max-width: 323px) 100vw, 323px" /></figure>



<p><strong>The Api glue</strong></p>



<p>So how does it all glue together? The key underlying code that allows you to pool controllers from one project into another is:</p>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="485" height="22" src="https://blog.boro2g.co.uk/wp-content/uploads/2020/09/image-3.png" alt="" class="wp-image-1136" srcset="https://blog.boro2g.co.uk/wp-content/uploads/2020/09/image-3.png 485w, https://blog.boro2g.co.uk/wp-content/uploads/2020/09/image-3-300x14.png 300w" sizes="(max-width: 485px) 100vw, 485px" /></figure>



<p><strong>What issues you might run into?</strong></p>



<ul><li>Routing<ul><li>There is a commented out example of this &#8211; in the core project and weather project we have a &#8216;WeatherForecastController&#8217; &#8211; if both of these have the same [Route] attribute you will get an exception. </li><li>A simple fix is to ensure each controller has isolated routes. I&#8217;m sure a more clever approach could be used if you have LOTS of WebApi projects, but I&#8217;ll leave that for you to work out</li></ul></li></ul>



<figure class="wp-block-image"><img loading="lazy" decoding="async" width="465" height="121" src="https://blog.boro2g.co.uk/wp-content/uploads/2020/09/image-4.png" alt="" class="wp-image-1137" srcset="https://blog.boro2g.co.uk/wp-content/uploads/2020/09/image-4.png 465w, https://blog.boro2g.co.uk/wp-content/uploads/2020/09/image-4-300x78.png 300w" sizes="(max-width: 465px) 100vw, 465px" /></figure>



<ul><li>Dependency bleeding<ul><li>I don&#8217;t feel like this approach introduces any more risk of either cyclic dependencies or &#8216;<a href="https://en.wikipedia.org/wiki/Big_ball_of_mud" target="_blank" rel="noreferrer noopener">balls of mud</a>&#8216; &#8211; IMO that comes down the discipline of the team building your solutions.</li></ul></li></ul>



<p><strong>Summary</strong></p>



<p>What I like about this approach is flexibility. On day 1 you can deploy your common project to a single box and all your api&#8217;s are working in one place. Over time, as complexity grows, or your dev teams evolve, different parts can be cut apart but without any fundamental changes needed.</p>



<p>You need to scale your search api, well no problem &#8211; deploy it as a single api and scale as you need. </p>



<p>You need to push the weather api to multiple data centres for geo reasons, cut it out and deploy as you want.</p>



<p>Another team needs to own search, again thats fine &#8211; you could even pull out to another solution, remove the ApiConfiguration and everyone is happy!? <img src="https://s.w.org/images/core/emoji/15.0.3/72x72/1f642.png" alt="🙂" class="wp-smiley" style="height: 1em; max-height: 1em;" /></p>



<p>I hope it provides some good inspiration. It really doesn&#8217;t take much code, or configuration to build what I&#8217;d consider to be a very flexible approach to structuring your dotnetcore WebApi projects.</p>
<p>The post <a rel="nofollow" href="https://blog.boro2g.co.uk/monolith-microservice-or-something-in-between/">Monolith, microservice or something in-between</a> appeared first on <a rel="nofollow" href="https://blog.boro2g.co.uk">blog.boro2g .co.uk</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://blog.boro2g.co.uk/monolith-microservice-or-something-in-between/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
	</channel>
</rss>
