{"id":1567,"date":"2014-12-16T19:24:27","date_gmt":"2014-12-16T19:24:26","guid":{"rendered":"https:\/\/www.couchbase.com\/blog\/?p=1567"},"modified":"2025-06-13T23:50:17","modified_gmt":"2025-06-14T06:50:17","slug":"couchbase-net-sdk-20-development-series-part-1-1-server-configuration","status":"publish","type":"post","link":"https:\/\/www.couchbase.com\/blog\/couchbase-net-sdk-20-development-series-part-1-1-server-configuration\/","title":{"rendered":"Couchbase DOTNET SDK 2.0 Development Series: Part 1-1: Server Config"},"content":{"rendered":"<p>In the <a href=\"https:\/\/www.couchbase.com\/blog\/introducing-couchbase-net-sdk-20-development-blog-series\/\">introduction to this series<\/a>, I discussed some of the motivation for rewriting .NET SDK, the goals, objectives and the major features of the upcoming 2.0 release, and we examined the high-level architecture (10000 feet view) of a Couchbase Server Client SDK. In this post we will go over the design and development of one of the core configuration components of a Couchbase SDK: Server Configuration.<\/p>\n<h1>Introduction<\/h1>\n<p>A Couchbase SDK client requires configuration from two sources: the Client Configuration, which defines the IP of the cluster to connect to, number of connections to use and other important information regarding how the client will interact with the cluster and the Server Configuration, which defines the current state of the cluster (e.g. number of nodes, buckets that are available, etc.), thus driving the internal state of a client (<a href=\"https:\/\/www.couchbase.com\/couchbase-server\/architecture\/\">Cluster Map<\/a>)<\/p>\n<p>This post will only discuss the Server Configuration aspects and will largely revolve around implementing several well-defined interfaces or contracts.<\/p>\n<h2>HTTP Streaming Configuration<\/h2>\n<p>Currently, most clients use a \u201cbootstrapping\u201d technique via client configuration and a \u201cStreaming Configuration\u201d exposed by the <a href=\"https:\/\/docs.couchbase.com\/couchbase-manual-2.0\/#using-the-rest-api\">Couchbase REST API<\/a>. This is supported by versions of Couchbase from 2.2 and back. The usual approach is as follows:<\/p>\n<div>\n<ol>\n<li>Within the \u201curis\u201d element of a Client Configuration (semantics very per client), a URL is defined for which to start the <a href=\"https:\/\/docs.couchbase.com\/couchbase-manual-2.0\/#managing-clusters\">bootstrapping process<\/a>:<br \/>\nhttps:\/\/[SERVER]:8091\/pools<\/li>\n<li>The response is then parsed and the a request is made to get the <a href=\"https:\/\/docs.couchbase.com\/couchbase-manual-2.0\/#managing-buckets\">buckets configuration<\/a>:<br \/>\nhttps:\/\/[SERVER]:8091\/pools\/default?uuid=[UUID]<\/li>\n<li>This response is parsed and another request is made to get <a href=\"https:\/\/docs.couchbase.com\/couchbase-manual-2.0\/#using-the-bucket-streaming-uri\">streaming URL<\/a> from:<br \/>\nhttps:\/\/[SERVER]:8091\/pools\/default\/buckets?v=[VERSION]&amp;uuid=[UUID]<\/li>\n<li>Finally, the streaming URL connection is made which is long-lived and raises events in the client with respect to changes in the cluster:<br \/>\nhttps:\/\/[SERVER]:8091\/pools\/default\/bucketsStreaming\/default?bucket_uuid=[UUID]<\/li>\n<li>The client will then change its internal state to match that of the current server configuration.<\/li>\n<\/ol>\n<\/div>\n<p>There are some problems with this approach, among others:<\/p>\n<ul>\n<li>The \u201cstreaming URL\u201d is resource intensive to create and maintain (mainly memory) on the server-side<\/li>\n<li>During a rebalance or failover situation, the cluster configuration may change many, many times. Each time this happens the client must tear down all of its resources (socket connections, VBucket mappings) and build its state up again and again, which can leads to reduced throughput, latency, higher than expected memory and CPU usage, and so on and so forth\u2026<\/li>\n<li>Operations that are in-flight may be terminated and then re-tried on a new config state \u2013 it\u2019s as if the \u201c<em>carpet has been pulled out from underneath them<\/em>\u201d.<\/li>\n<li>Responding to NOT_MY_VBUCKET responses are handled in-efficiently by simple trying the next node in the list \u2013 there is no information to help the client in which node to re-direct the operation to.<\/li>\n<\/ul>\n<h2>A New Model for Configuration Management: <s>CCCP<\/s> Optimized connection management<\/h2>\n<p>While the streaming HTTP \u201cbootstrapping\u201d approach has worked reasonably well for most clients, the downsides have begun to outweigh the plusses, thus a new model for updating client configuration has been defined is available starting with the 2.5 version of the Couchbase Server: <a href=\"https:\/\/www.couchbase.com\/wiki\/display\/couchbase\/Cluster+Configuration+Carrier+Publication\/\"><s>Client Cluster Configuration Publication or \u201cCCCP\u201d<\/s> Optimized connection management.<\/a> <s>CCCP\u00a0 <\/s>Optimized connection management introduces a new operation to be used before or after authentication to request configuration as well as a mechanism for returning configuration information when a NOT_MY_VBUCKET response is returned for a failed operation.<\/p>\n<p>In this case <s>CCCP<\/s> Optimized connection management supporting SDK, the client will react by using the configuration to update itself before resending the operation. Note that a NOT_MY_VBUCKET is the standard response that is returned by the cluster when the cluster itself has changed (during a rebalance or failover scenario for example) and the client has not yet \u201csynched\u201d up and is using a stale configuration, resulting in an invalid key mapping. Whereas the \u201cbootstrapping\u201d approach is somewhat of a \u201cpull\u201d type operation, <s>CCCP<\/s> Optimized connection management is either \u201cpush\u201d or \u201cpull\u201d depending upon whether the request was initiated by the client (via an explicit CMD_GET_CLUSTER_CONFIG operation) or by the server itself (via a NOT_MY_VBUCKET response to an operation). We will go over <s>CCCP<\/s>\u00a0Optimized connection management in more detail in a later post.<\/p>\n<p><em>*Edit: CCCP is now known as &#8220;Optimized connection management&#8221;<\/em><\/p>\n<h2>File Based Configuration<\/h2>\n<p>One other semi-supported configuration option exists: file based configuration. File based configuration is primarily useful for testing and development and we will provide an implementation in the test projects to remove some of the dependencies that are difficult to replicate and or cause false positives when running the test suite.<\/p>\n<h1>Structural Architecture View<\/h1>\n<p>Internally the Server Configuration component of the client is a provider based model, in which multiple implementations of a configuration provider can be configured in the client and then a strategy can be chosen to determine which provider should be used. The default is a simple linear, fallback approach where the first configured provider is used and then if it fails the next provider in sequence will take its place.<\/p>\n<p>Here is a diagram showing the main actor objects and the relationships with some of other key objects within the client which will be discussed in subsequent posts:<\/p>\n<p class=\"rtecenter\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-medium wp-image-5299\" src=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2014\/12\/config-provider-and-config-info-1-300x156.png\" alt=\"\" width=\"300\" height=\"156\" srcset=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2014\/12\/config-provider-and-config-info-1-300x156.png 300w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2014\/12\/config-provider-and-config-info-1-20x10.png 20w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2014\/12\/config-provider-and-config-info-1.png 674w\" sizes=\"auto, (max-width: 300px) 100vw, 300px\" \/><\/p>\n<p>A description of each follows:<\/p>\n<ul>\n<li><strong>ConfigurationProvider:<\/strong> a source which shall yield a new ConfigInfo. It\u2019s the responsibility of the provider to provide the mechanism for fetching the configuration from its source.<\/li>\n<li><strong>ConfigurationInformation:<\/strong> the configuration info contains a list of possible nodes and the VBucket map informing clients about which servers within said nodes a given key should be forwarded to.<\/li>\n<li><strong>ConfigurationManager:<\/strong> bridge between the client and the providers and the strategy taken to determine which provider to use and what retry logic to apply.<\/li>\n<\/ul>\n<p>A more detailed document of this architecture can be found <a href=\"https:\/\/docs.google.com\/document\/d\/1bSMt0Sj1uQtm0OYolQaJDJg4sASfoCEwU6_gjm1he8s\/edit?pli=1\">here<\/a>. Please note that this, like all development, is an evolutionary process, so expect some changes and revisions over time.<\/p>\n<h1>Conclusion and Next Steps<\/h1>\n<p>This post discussed the history (HTTP Streaming) and the future (<s>CCCP<\/s> Optimized connection management) of Couchbase SDK Server Configuration Management. In the next post we will go into detail the implementation of the HTTP Streaming configuration provider which is required for clients targeting pre-2.5 versions of the Couchbase Server.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>In the introduction to this series, I discussed some of the motivation for rewriting .NET SDK, the goals, objectives and the major features of the upcoming 2.0 release, and we examined the high-level architecture (10000 feet view) of a Couchbase [&hellip;]<\/p>\n","protected":false},"author":21,"featured_media":13873,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"inline_featured_image":false,"footnotes":""},"categories":[1811],"tags":[],"ppma_author":[8970],"class_list":["post-1567","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-dotnet"],"acf":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v25.8 (Yoast SEO v25.8) - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Couchbase DOTNET SDK 2.0 Development Series : Server Config<\/title>\n<meta name=\"description\" content=\"The blog post explains the design and development of one of the the core configuration components of a Couchbase SDK: Server Configuration.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.couchbase.com\/blog\/couchbase-net-sdk-20-development-series-part-1-1-server-configuration\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Couchbase DOTNET SDK 2.0 Development Series: Part 1-1: Server Config\" \/>\n<meta property=\"og:description\" content=\"The blog post explains the design and development of one of the the core configuration components of a Couchbase SDK: Server Configuration.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.couchbase.com\/blog\/couchbase-net-sdk-20-development-series-part-1-1-server-configuration\/\" \/>\n<meta property=\"og:site_name\" content=\"The Couchbase Blog\" \/>\n<meta property=\"article:published_time\" content=\"2014-12-16T19:24:26+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2025-06-14T06:50:17+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2014\/12\/config-provider-and-config-info-1.png\" \/>\n\t<meta property=\"og:image:width\" content=\"674\" \/>\n\t<meta property=\"og:image:height\" content=\"350\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\n<meta name=\"author\" content=\"Jeff Morris, Senior Software Engineer, Couchbase\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:creator\" content=\"@jeffrysmorris\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Jeff Morris, Senior Software Engineer, Couchbase\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"5 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/couchbase-net-sdk-20-development-series-part-1-1-server-configuration\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/couchbase-net-sdk-20-development-series-part-1-1-server-configuration\/\"},\"author\":{\"name\":\"Jeff Morris, Senior Software Engineer, Couchbase\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/b678bdd9f7b21a33d43ea965865a3341\"},\"headline\":\"Couchbase DOTNET SDK 2.0 Development Series: Part 1-1: Server Config\",\"datePublished\":\"2014-12-16T19:24:26+00:00\",\"dateModified\":\"2025-06-14T06:50:17+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/couchbase-net-sdk-20-development-series-part-1-1-server-configuration\/\"},\"wordCount\":1043,\"commentCount\":2,\"publisher\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/#organization\"},\"image\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/couchbase-net-sdk-20-development-series-part-1-1-server-configuration\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png\",\"articleSection\":[\".NET\"],\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/www.couchbase.com\/blog\/couchbase-net-sdk-20-development-series-part-1-1-server-configuration\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/couchbase-net-sdk-20-development-series-part-1-1-server-configuration\/\",\"url\":\"https:\/\/www.couchbase.com\/blog\/couchbase-net-sdk-20-development-series-part-1-1-server-configuration\/\",\"name\":\"Couchbase DOTNET SDK 2.0 Development Series : Server Config\",\"isPartOf\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/couchbase-net-sdk-20-development-series-part-1-1-server-configuration\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/couchbase-net-sdk-20-development-series-part-1-1-server-configuration\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png\",\"datePublished\":\"2014-12-16T19:24:26+00:00\",\"dateModified\":\"2025-06-14T06:50:17+00:00\",\"description\":\"The blog post explains the design and development of one of the the core configuration components of a Couchbase SDK: Server Configuration.\",\"breadcrumb\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/couchbase-net-sdk-20-development-series-part-1-1-server-configuration\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.couchbase.com\/blog\/couchbase-net-sdk-20-development-series-part-1-1-server-configuration\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/couchbase-net-sdk-20-development-series-part-1-1-server-configuration\/#primaryimage\",\"url\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png\",\"contentUrl\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png\",\"width\":1800,\"height\":630},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/couchbase-net-sdk-20-development-series-part-1-1-server-configuration\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/www.couchbase.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Couchbase DOTNET SDK 2.0 Development Series: Part 1-1: Server Config\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#website\",\"url\":\"https:\/\/www.couchbase.com\/blog\/\",\"name\":\"The Couchbase Blog\",\"description\":\"Couchbase, the NoSQL Database\",\"publisher\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/www.couchbase.com\/blog\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Organization\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#organization\",\"name\":\"The Couchbase Blog\",\"url\":\"https:\/\/www.couchbase.com\/blog\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#\/schema\/logo\/image\/\",\"url\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2023\/04\/admin-logo.png\",\"contentUrl\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2023\/04\/admin-logo.png\",\"width\":218,\"height\":34,\"caption\":\"The Couchbase Blog\"},\"image\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/#\/schema\/logo\/image\/\"}},{\"@type\":\"Person\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/b678bdd9f7b21a33d43ea965865a3341\",\"name\":\"Jeff Morris, Senior Software Engineer, Couchbase\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/image\/73188ee2831025d81740e12e1ed80812\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/5f910befdbd58de8bac85293df7f544680843061ecc921ba7d293d6d52076ab3?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/5f910befdbd58de8bac85293df7f544680843061ecc921ba7d293d6d52076ab3?s=96&d=mm&r=g\",\"caption\":\"Jeff Morris, Senior Software Engineer, Couchbase\"},\"description\":\"Jeff Morris is a Senior Software Engineer at Couchbase. Prior to joining Couchbase, Jeff spent six years at Source Interlink as an Enterprise Web Architect. Jeff is responsible for the development of Couchbase SDKs and how to integrate with N1QL (query language).\",\"sameAs\":[\"https:\/\/x.com\/jeffrysmorris\"],\"url\":\"https:\/\/www.couchbase.com\/blog\/author\/jeff-morris\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Couchbase DOTNET SDK 2.0 Development Series : Server Config","description":"The blog post explains the design and development of one of the the core configuration components of a Couchbase SDK: Server Configuration.","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.couchbase.com\/blog\/couchbase-net-sdk-20-development-series-part-1-1-server-configuration\/","og_locale":"en_US","og_type":"article","og_title":"Couchbase DOTNET SDK 2.0 Development Series: Part 1-1: Server Config","og_description":"The blog post explains the design and development of one of the the core configuration components of a Couchbase SDK: Server Configuration.","og_url":"https:\/\/www.couchbase.com\/blog\/couchbase-net-sdk-20-development-series-part-1-1-server-configuration\/","og_site_name":"The Couchbase Blog","article_published_time":"2014-12-16T19:24:26+00:00","article_modified_time":"2025-06-14T06:50:17+00:00","og_image":[{"width":674,"height":350,"url":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2014\/12\/config-provider-and-config-info-1.png","type":"image\/png"}],"author":"Jeff Morris, Senior Software Engineer, Couchbase","twitter_card":"summary_large_image","twitter_creator":"@jeffrysmorris","twitter_misc":{"Written by":"Jeff Morris, Senior Software Engineer, Couchbase","Est. reading time":"5 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.couchbase.com\/blog\/couchbase-net-sdk-20-development-series-part-1-1-server-configuration\/#article","isPartOf":{"@id":"https:\/\/www.couchbase.com\/blog\/couchbase-net-sdk-20-development-series-part-1-1-server-configuration\/"},"author":{"name":"Jeff Morris, Senior Software Engineer, Couchbase","@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/b678bdd9f7b21a33d43ea965865a3341"},"headline":"Couchbase DOTNET SDK 2.0 Development Series: Part 1-1: Server Config","datePublished":"2014-12-16T19:24:26+00:00","dateModified":"2025-06-14T06:50:17+00:00","mainEntityOfPage":{"@id":"https:\/\/www.couchbase.com\/blog\/couchbase-net-sdk-20-development-series-part-1-1-server-configuration\/"},"wordCount":1043,"commentCount":2,"publisher":{"@id":"https:\/\/www.couchbase.com\/blog\/#organization"},"image":{"@id":"https:\/\/www.couchbase.com\/blog\/couchbase-net-sdk-20-development-series-part-1-1-server-configuration\/#primaryimage"},"thumbnailUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png","articleSection":[".NET"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.couchbase.com\/blog\/couchbase-net-sdk-20-development-series-part-1-1-server-configuration\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.couchbase.com\/blog\/couchbase-net-sdk-20-development-series-part-1-1-server-configuration\/","url":"https:\/\/www.couchbase.com\/blog\/couchbase-net-sdk-20-development-series-part-1-1-server-configuration\/","name":"Couchbase DOTNET SDK 2.0 Development Series : Server Config","isPartOf":{"@id":"https:\/\/www.couchbase.com\/blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.couchbase.com\/blog\/couchbase-net-sdk-20-development-series-part-1-1-server-configuration\/#primaryimage"},"image":{"@id":"https:\/\/www.couchbase.com\/blog\/couchbase-net-sdk-20-development-series-part-1-1-server-configuration\/#primaryimage"},"thumbnailUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png","datePublished":"2014-12-16T19:24:26+00:00","dateModified":"2025-06-14T06:50:17+00:00","description":"The blog post explains the design and development of one of the the core configuration components of a Couchbase SDK: Server Configuration.","breadcrumb":{"@id":"https:\/\/www.couchbase.com\/blog\/couchbase-net-sdk-20-development-series-part-1-1-server-configuration\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.couchbase.com\/blog\/couchbase-net-sdk-20-development-series-part-1-1-server-configuration\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.couchbase.com\/blog\/couchbase-net-sdk-20-development-series-part-1-1-server-configuration\/#primaryimage","url":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png","contentUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png","width":1800,"height":630},{"@type":"BreadcrumbList","@id":"https:\/\/www.couchbase.com\/blog\/couchbase-net-sdk-20-development-series-part-1-1-server-configuration\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.couchbase.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Couchbase DOTNET SDK 2.0 Development Series: Part 1-1: Server Config"}]},{"@type":"WebSite","@id":"https:\/\/www.couchbase.com\/blog\/#website","url":"https:\/\/www.couchbase.com\/blog\/","name":"The Couchbase Blog","description":"Couchbase, the NoSQL Database","publisher":{"@id":"https:\/\/www.couchbase.com\/blog\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.couchbase.com\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Organization","@id":"https:\/\/www.couchbase.com\/blog\/#organization","name":"The Couchbase Blog","url":"https:\/\/www.couchbase.com\/blog\/","logo":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/logo\/image\/","url":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2023\/04\/admin-logo.png","contentUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2023\/04\/admin-logo.png","width":218,"height":34,"caption":"The Couchbase Blog"},"image":{"@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/logo\/image\/"}},{"@type":"Person","@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/b678bdd9f7b21a33d43ea965865a3341","name":"Jeff Morris, Senior Software Engineer, Couchbase","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/image\/73188ee2831025d81740e12e1ed80812","url":"https:\/\/secure.gravatar.com\/avatar\/5f910befdbd58de8bac85293df7f544680843061ecc921ba7d293d6d52076ab3?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/5f910befdbd58de8bac85293df7f544680843061ecc921ba7d293d6d52076ab3?s=96&d=mm&r=g","caption":"Jeff Morris, Senior Software Engineer, Couchbase"},"description":"Jeff Morris is a Senior Software Engineer at Couchbase. Prior to joining Couchbase, Jeff spent six years at Source Interlink as an Enterprise Web Architect. Jeff is responsible for the development of Couchbase SDKs and how to integrate with N1QL (query language).","sameAs":["https:\/\/x.com\/jeffrysmorris"],"url":"https:\/\/www.couchbase.com\/blog\/author\/jeff-morris\/"}]}},"authors":[{"term_id":8970,"user_id":21,"is_guest":0,"slug":"jeff-morris","display_name":"Jeff Morris, Senior Software Engineer, Couchbase","avatar_url":"https:\/\/secure.gravatar.com\/avatar\/5f910befdbd58de8bac85293df7f544680843061ecc921ba7d293d6d52076ab3?s=96&d=mm&r=g","author_category":"","last_name":"Jeff Morris, Senior Software Engineer, Couchbase","first_name":"Jeff","job_title":"","user_url":"","description":"Jeff Morris is a Senior Software Engineer at Couchbase. Prior to joining Couchbase, Jeff spent six years at Source Interlink as an Enterprise Web Architect. Jeff is responsible for the development of Couchbase SDKs and how to integrate with N1QL (query language)."}],"_links":{"self":[{"href":"https:\/\/www.couchbase.com\/blog\/wp-json\/wp\/v2\/posts\/1567","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.couchbase.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.couchbase.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/wp-json\/wp\/v2\/users\/21"}],"replies":[{"embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/wp-json\/wp\/v2\/comments?post=1567"}],"version-history":[{"count":0,"href":"https:\/\/www.couchbase.com\/blog\/wp-json\/wp\/v2\/posts\/1567\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/wp-json\/wp\/v2\/media\/13873"}],"wp:attachment":[{"href":"https:\/\/www.couchbase.com\/blog\/wp-json\/wp\/v2\/media?parent=1567"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/wp-json\/wp\/v2\/categories?post=1567"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/wp-json\/wp\/v2\/tags?post=1567"},{"taxonomy":"author","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/wp-json\/wp\/v2\/ppma_author?post=1567"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}