blob: 845b61230b5d6d5a533d342e378c430569d642b3 [file] [log] [blame]
<!doctype html>
<!--
Minimal Mistakes Jekyll Theme 4.4.1 by Michael Rose
Copyright 2017 Michael Rose - mademistakes.com | @mmistakes
Free for personal and commercial use under the MIT license
https://github.com/mmistakes/minimal-mistakes/blob/master/LICENSE.txt
-->
<html lang="en" class="no-js">
<head>
<meta charset="utf-8">
<!-- begin SEO -->
<title>Dynamic Configuration - Apache ServiceComb</title>
<meta name="description" content="Dynamic Configuration">
<meta name="author" content="">
<meta property="og:locale" content="en">
<meta property="og:site_name" content="Apache ServiceComb">
<meta property="og:title" content="Dynamic Configuration">
<link rel="canonical" href="https://github.com/pages/apache/incubator-servicecomb-website/docs/users/dynamic-config/">
<meta property="og:url" content="https://github.com/pages/apache/incubator-servicecomb-website/docs/users/dynamic-config/">
<meta property="og:description" content="Dynamic Configuration">
<meta name="twitter:site" content="@ServiceComb">
<meta name="twitter:title" content="Dynamic Configuration">
<meta name="twitter:description" content="Dynamic Configuration">
<meta name="twitter:url" content="">
<meta name="twitter:card" content="summary">
<script type="application/ld+json">
{
"@context" : "http://schema.org",
"@type" : "Person",
"name" : "Apache ServiceComb",
"url" : "https://github.com/pages/apache/incubator-servicecomb-website",
"sameAs" : null
}
</script>
<meta name="google-site-verification" content="HvJjNd7vvJ-yjSTHlBiIWEYxp_Hrz-PYEY5Idz9LRcA" />
<!-- end SEO -->
<link href="/feed.xml" type="application/atom+xml" rel="alternate" title="Apache ServiceComb Feed">
<!-- http://t.co/dKP3o1e -->
<meta name="HandheldFriendly" content="True">
<meta name="MobileOptimized" content="320">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<script>
document.documentElement.className = document.documentElement.className.replace(/\bno-js\b/g, '') + ' js ';
</script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/clipboard.js/1.7.1/clipboard.min.js"></script>
<script src="/assets/vendor/prism/prism.js"></script>
<script type="text/javascript" async
src="https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.1/MathJax.js?config=TeX-MML-AM_CHTML">
</script>
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0-beta/css/bootstrap.min.css" integrity="sha384-/Y6pD6FV/Vv2HJnA6t+vslU6fwYXjCFtcEpHbNJ0lyAFsXTsjBbfaDjzALeQsN6M" crossorigin="anonymous">
<script src="https://code.jquery.com/jquery-3.2.1.slim.min.js" integrity="sha384-KJ3o2DKtIkvYIK3UENzmM7KCkRr/rE9/Qpg6aAZGJwFDMVNA/GpGFF93hXpG5KkN" crossorigin="anonymous"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.11.0/umd/popper.min.js" integrity="sha384-b/U6ypiBEHpOf/4+1nzFpr53nxSS+GLCkfwBdFNTxtclqqenISfwAzpKaMNFNmj4" crossorigin="anonymous"></script>
<script src="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0-beta/js/bootstrap.min.js" integrity="sha384-h0AbiXch4ZDo7tp9hKZ4TsHbi047NrKGLO3SEJAg45jXxnGIfYzk4Si90RDIqNm1" crossorigin="anonymous"></script>
<!-- For all browsers -->
<link rel="stylesheet" href="/assets/css/main.css">
<link rel="stylesheet" href="/assets/vendor/prism/prism.css">
<!--[if lte IE 9]>
<style>
/* old IE unsupported flexbox fixes */
.greedy-nav .site-title {
padding-right: 3em;
}
.greedy-nav button {
position: absolute;
top: 0;
right: 0;
height: 100%;
}
</style>
<![endif]-->
<meta http-equiv="cleartype" content="on">
<!-- start custom head snippets -->
<!-- insert favicons. use http://realfavicongenerator.net/ -->
<link href="https://fonts.loli.net/css?family=Roboto:400,500,700|Source+Code+Pro" rel="stylesheet">
<script src="/assets/js/custom.js"></script>
<!-- end custom head snippets -->
</head>
<body class="layout--single">
<!--[if lt IE 9]>
<div class="notice--danger align-center" style="margin: 0;">You are using an <strong>outdated</strong> browser. Please <a href="http://browsehappy.com/">upgrade your browser</a> to improve your experience.</div>
<![endif]-->
<div class="masthead" onmouseleave="$('#childrenShow').css('display', 'none')">
<div class="masthead__inner-wrap">
<div class="masthead__menu">
<nav id="site-nav" class="greedy-nav">
<a class="site-title active" href="/"><img src="https://www.apache.org/img/servicecomb.png"></a>
<ul class="visible-links">
<li class="masthead__menu-item" onmouseenter="$('#childrenShow').css('display', 'none')">
<a href="/">Home</a>
</li>
<li class="masthead__menu-item" onmouseenter="$('#childrenShow').css('display', 'none')">
<a href="/developers/">Projects</a>
</li>
<li class="def-nav-li" onmouseenter="$('#childrenShow').css('display', 'block')">
<a class="active" href="/docs/users/">Documentation</a>
<ul id="childrenShow" class="def-children-show-en" onmouseleave="$('#childrenShow').css('display', 'none')">
<li><a href="/docs/getting-started/" class="">Getting started</a></li>
<li><a href="/docs/users/" class="">Docs</a></li>
<li><a href="/slides/" class="">Video</a></li>
<li><a href="/faqs/" class="">FAQ</a></li>
</ul>
</li>
<li class="masthead__menu-item" onmouseenter="$('#childrenShow').css('display', 'none')">
<a href="/developers/contributing/">Community</a>
</li>
<li class="masthead__menu-item" onmouseenter="$('#childrenShow').css('display', 'none')">
<a href="/year-archive/">Blogs</a>
</li>
<li class="masthead__menu-item" onmouseenter="$('#childrenShow').css('display', 'none')">
<a href="/release/">Downloads</a>
</li>
</ul>
<button><div class="navicon"></div></button>
<ul class="hidden-links hidden"></ul>
<div class="nav-lang">
<a href=/cn/docs/users/dynamic-config/>中文</a>
</div>
</nav>
</div>
</div>
</div>
<div id="main" role="main">
<div class="sidebar sticky">
<div class="back-to-home"><a href="/">Home</a> > Dynamic Configuration</div>
<nav class="nav__list">
<input id="ac-toc" name="accordion-toc" type="checkbox" />
<label for="ac-toc">Toggle Menu</label>
<ul class="nav__items">
<li>
<span class="nav__sub-title">Java Chassis User Guide</span>
<ul>
<li><a href="/references/java-chassis/zh_CN/" class="">2.3.0</a></li>
</ul>
</li>
<li>
<span class="nav__sub-title">Pack User Guide</span>
<ul>
<li><a href="https://github.com/apache/servicecomb-pack/blob/master/docs/user_guide.md" class="">0.5.0</a></li>
</ul>
</li>
<li>
<span class="nav__sub-title">ServiceCenter User Guide</span>
<ul>
<li><a href="https://service-center.readthedocs.io/en/latest/user-guides.html" class="">2.0.0</a></li>
</ul>
</li>
<li>
<span class="nav__sub-title">Kie User Guide</span>
<ul>
<li><a href="https://kie.readthedocs.io/en/latest/" class="">0.2.0</a></li>
</ul>
</li>
<li>
<span class="nav__sub-title">Mesher User Guide</span>
<ul>
<li><a href="https://mesher.readthedocs.io/en/latest/" class="">1.6.3</a></li>
</ul>
</li>
</ul>
</nav>
</div>
<article class="page" itemscope itemtype="http://schema.org/CreativeWork">
<meta itemprop="headline" content="Dynamic Configuration">
<meta itemprop="description" content="Dynamic Configuration">
<meta itemprop="dateModified" content="January 15, 2018">
<div class="page__inner-wrap">
<header>
<h1 class="page__title" itemprop="headline">Dynamic Configuration
</h1>
</header>
<section class="page__content" itemprop="text">
<aside class="sidebar__right">
<nav class="toc">
<!-- <header><h4 class="nav__title"><i class="fa fa-file-text"></i> On This Page</h4></header> -->
<ul class="toc__menu" id="markdown-toc">
<li><a href="#concept-description" id="markdown-toc-concept-description">Concept Description</a></li>
<li><a href="#development-example" id="markdown-toc-development-example">Development Example:</a> <ul>
<li><a href="#deploy-and-start-apollo-configuration-center" id="markdown-toc-deploy-and-start-apollo-configuration-center">Deploy and start Apollo configuration center</a></li>
<li><a href="#configure-services-and-get-a-token" id="markdown-toc-configure-services-and-get-a-token">Configure services and get a token</a></li>
<li><a href="#add-dependency-in-pomxml" id="markdown-toc-add-dependency-in-pomxml">Add dependency in pom.xml</a></li>
<li><a href="#add-configurations-in-microserviceyaml" id="markdown-toc-add-configurations-in-microserviceyaml">Add configurations in microservice.yaml</a></li>
<li><a href="#get-configurations" id="markdown-toc-get-configurations">Get configurations</a></li>
</ul>
</li>
</ul>
</nav>
</aside>
<h2 id="concept-description">Concept Description</h2>
<p>Dynamic Configuration makes it possible to update configuration items during the life-cycle of the service without re-deploying it. Users have to deploy services with those configurations in xml or properties file in traditional way and have to redeploy and restart services to update the configurations which could be very difficult to maintain and cost lots time. This problem can be solved by importing configuration center, all configuration items can be stored and maintained by configuration center, services can get latest configuration items through a fixed time period thread without redeploying themselves. Java Chassis supports Apollo configuration center currently and it's easy to extend to other kind of configuration centers by implementing provided interfaces.</p>
<h2 id="development-example">Development Example:</h2>
<h3 id="deploy-and-start-apollo-configuration-center">Deploy and start Apollo configuration center</h3>
<p>Apollo services can be easily deployed and started step by step following its <a href="https://github.com/ctripcorp/apollo/wiki/Apollo-Quick-Start-Docker%E9%83%A8%E7%BD%B2">official document</a>, You can also do that by following command:</p>
<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code> git clone https://github.com/lijasonvip/apollo-image-for-servicecomb.git
<span class="nb">cd </span>apollo-image-for-servicecomb <span class="o">&amp;&amp;</span> docker-compose up
</code></pre></div></div>
<p>When your console shows <code class="language-plaintext highlighter-rouge">Portal started. You can visit http://localhost:8070 now!</code> , it means the service is started and ready for use(It could take serval minutes which depends on machines). Visit Apollo configuration pages at <code class="language-plaintext highlighter-rouge">http://localhost:8070</code> in a browser. Please refer to <a href="https://docs.docker.com/compose/install/">Docker document</a> about <code class="language-plaintext highlighter-rouge">docker-compose</code>.</p>
<h3 id="configure-services-and-get-a-token">Configure services and get a token</h3>
<ul>
<li>
<h5 id="login-to-configuration-center-and-create-a-project">Login to Configuration center and create a project</h5>
<p>Visit the address of Apollo configuration portal service , for example: <code class="language-plaintext highlighter-rouge">http://192.168.199.1:8070</code></p>
<p><img src="/assets/images/config/login.png" alt="登录配置中心" /></p>
<p>The default account to login to Apollo configuration center is apollo and admin for username and password respectively.</p>
</li>
<li>
<h5 id="create-a-project">Create a project</h5>
<p><img src="/assets/images/config/create_project.png" alt="创建项目" /></p>
<p>There is a demo project named SampleApp, you can create a project for your service by click the green icon <code class="language-plaintext highlighter-rouge">+</code>. The picture below is a example to create a project, fill in your application ID and service name and choose the department and owner of the project and then submit them.</p>
</li>
</ul>
<p><img src="/assets/images/config/create_project2.png" alt="项目信息" /></p>
<p>​ Pay attention that you should release the project when it’s created or client will get nothing of the project. Click the release button as below.</p>
<p><img src="/assets/images/config/release_namespace.png" alt="release_namespace" /></p>
<ul>
<li>
<h5 id="generate-a-token">Generate a Token</h5>
</li>
</ul>
<p>Visit <code class="language-plaintext highlighter-rouge">http://192.168.199.1:8070/open/manage.html</code> and fill in application ID and service name you just created at last step, then choose department and owner of the project and click the create button to generate a token. The token will be used later in project code.</p>
<p><img src="/assets/images/config/token.png" alt="生成TOKEN" /></p>
<h3 id="add-dependency-in-pomxml">Add dependency in pom.xml</h3>
<div class="language-xml highlighter-rouge"><div class="highlight"><pre class="highlight"><code> <span class="nt">&lt;dependency&gt;</span>
<span class="nt">&lt;groupId&gt;</span>org.apache.servicecomb<span class="nt">&lt;/groupId&gt;</span>
<span class="nt">&lt;artifactId&gt;</span>config-apollo<span class="nt">&lt;/artifactId&gt;</span>
<span class="nt">&lt;/dependency&gt;</span>
</code></pre></div></div>
<h3 id="add-configurations-in-microserviceyaml">Add configurations in microservice.yaml</h3>
<div class="language-yaml highlighter-rouge"><div class="highlight"><pre class="highlight"><code> <span class="na">apollo</span><span class="pi">:</span>
<span class="na">config</span><span class="pi">:</span>
<span class="na">serverUri</span><span class="pi">:</span> <span class="s">http://127.0.0.1:8070</span>
<span class="na">serviceName</span><span class="pi">:</span> <span class="s">SampleApp</span>
<span class="na">env</span><span class="pi">:</span> <span class="s">DEV</span>
<span class="na">clusters</span><span class="pi">:</span> <span class="s">default</span>
<span class="na">namespace</span><span class="pi">:</span> <span class="s">application</span>
<span class="na">token</span><span class="pi">:</span> <span class="s">testtoken</span>
<span class="na">refreshInterval</span><span class="pi">:</span> <span class="m">10</span>
</code></pre></div></div>
<p>​ Configurations under <code class="language-plaintext highlighter-rouge">apollo.config</code> are parameters of the project that users created above, including serviceName, env, clusters, namespace, token and refreshInterval. Pay attention to <code class="language-plaintext highlighter-rouge">refreshInterval: 10</code>, it means service will fetch latest configuration items every each 10 seconds, default refresh cycle is 30 second if no value is configured here.
<code class="language-plaintext highlighter-rouge">serviceName</code> need to be <code class="language-plaintext highlighter-rouge">AppId</code> in apollo, please pay attention to that.</p>
<h3 id="get-configurations">Get configurations</h3>
<p>​ Creating a configuration item named <code class="language-plaintext highlighter-rouge">timeout</code> and set its value to <code class="language-plaintext highlighter-rouge">100</code> then release the configuration with some comments. Example as below: <img src="/assets/images/config/release_config.png" alt="动态属性timeout" /></p>
<p>​ You can use<code class="language-plaintext highlighter-rouge">DynamicPropertyFactory.getInstance().getProperty()</code> to get the value of configuration items.</p>
<div class="language-java highlighter-rouge"><div class="highlight"><pre class="highlight"><code> <span class="kd">public</span> <span class="kd">class</span> <span class="nc">Demo</span> <span class="o">{</span>
<span class="kd">public</span> <span class="kd">static</span> <span class="kt">void</span> <span class="nf">main</span><span class="o">(</span><span class="nc">String</span><span class="o">[]</span> <span class="n">args</span><span class="o">)</span> <span class="kd">throws</span> <span class="nc">Exception</span> <span class="o">{</span>
<span class="nc">Log4jUtils</span><span class="o">.</span><span class="na">init</span><span class="o">();</span>
<span class="nc">BeanUtils</span><span class="o">.</span><span class="na">init</span><span class="o">();</span>
<span class="k">while</span> <span class="o">(</span><span class="kc">true</span><span class="o">)</span> <span class="o">{</span>
<span class="nc">DynamicIntProperty</span> <span class="n">timeout</span> <span class="o">=</span> <span class="nc">DynamicPropertyFactory</span><span class="o">.</span><span class="na">getInstance</span><span class="o">().</span>
<span class="n">getIntProperty</span><span class="o">(</span><span class="s">"timeout"</span><span class="o">,</span> <span class="o">-</span><span class="mi">1</span><span class="o">);</span>
<span class="nc">System</span><span class="o">.</span><span class="na">out</span><span class="o">.</span><span class="na">println</span><span class="o">(</span><span class="n">timeout</span><span class="o">);</span>
<span class="nc">Thread</span><span class="o">.</span><span class="na">sleep</span><span class="o">(</span><span class="mi">3000</span><span class="o">);</span>
<span class="o">}</span>
<span class="o">}</span>
<span class="o">}</span>
</code></pre></div></div>
<p>​ When the configuration items are modified and released in Apollo configuration center, the example code above will print latest value of <code class="language-plaintext highlighter-rouge">timeout</code> after a refreshing cycle.</p>
</section>
<footer class="page__meta">
</footer>
</div>
</article>
</div>
<script async src="//pagead2.googlesyndication.com/pagead/js/adsbygoogle.js"></script>
<div align="center" style="margin: 0 0;">
<ins class="adsbygoogle"
style="display:block; border-bottom: initial;"
data-ad-client="ca-pub-7328585512091257"
data-ad-slot="3049671934"
data-ad-format="auto"></ins>
</div>
<div class="page__footer">
<footer>
<!-- start custom footer snippets -->
<!-- end custom footer snippets -->
<div class="container">
<div class="row justify-content-md-center">
<div class="col">
<ul>
<p class="header">Resources</p>
<li><a href="/docs/getting-started/">Getting started</a></li>
<li><a href="/docs/users/">User Guide</a></li>
<li><a href="/slides/">Slides</a></li>
<li><a href="/users/faq/">Common Questions</a></li>
</ul>
</div>
<div class="col">
<ul>
<p class="header">ASF</p>
<li><a href="http://www.apache.org">Foundation</a></li>
<li><a href="http://www.apache.org/licenses/">License</a></li>
<li><a href="http://www.apache.org/events/current-event">Events</a></li>
<li><a href="http://www.apache.org/foundation/sponsorship.html">Sponsorship</a></li>
<li><a href="http://www.apache.org/foundation/thanks.html">Thanks</a></li>
</ul>
</div>
<div class="col">
<ul>
<p class="header">Contribute</p>
<li><a href="http://issues.apache.org/jira/browse/SCB">Report a Doc Issue</a></li>
<li><a href="https://github.com/apache/servicecomb-website/edit/master/_users/dynamic-config.md">Edit This Page on Github</a></li>
<li><a href="/developers/submit-codes/">Code Submit Guide</a></li>
<li><a href="/security">Security</a></li>
</ul>
</div>
<div class="col">
<ul class="social-icons">
<p class="header">Community</p>
<li>
<a href="mailto:dev-subscribe@servicecomb.incubator.apache.org" rel="nofollow"><span class="mail">Mailing List</span></a>
</li>
<li>
<a href="https://github.com/apache?q=ServiceComb" target="_blank"><span class="github">Github</span></a>
</li>
<li>
<a href="https://twitter.com/ServiceComb" target="_blank"><span class="twitter">Twitter</span></a>
</li>
<li>
<a href="/feed.xml" target="_blank"><span class="rss">Feed</span></a>
</li>
</ul>
</div>
</div>
</div>
<div class="page__footer-bottom">
<div>&copy; 2021 Apache ServiceComb. Powered by <a href="http://jekyllrb.com" rel="nofollow">Jekyll</a> &amp; <a href="https://mademistakes.com/work/minimal-mistakes-jekyll-theme/" rel="nofollow">Minimal Mistakes</a>.</div>
<div>All other marks mentioned may be trademarks or registered trademarks of their respective owners.</div>
</div>
</footer>
</div>
<script src="/assets/js/main.min.js"></script>
<script>
(function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){
(i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),
m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)
})(window,document,'script','https://www.google-analytics.com/analytics.js','ga');
ga('create', 'UA-101622733-1', 'auto');
ga('send', 'pageview');
</script>
</body>
</html>