Chapter 2 springboot + archaius + consul (Configuration Management) and springbootarchaius
Archaius(Produced by netflix)
Features:
- Allows you to Dynamically Retrieve configurations.
- The principle is to read the content from the configuration source every 60 s (default, configurable), so that after the configuration file is modified, the modified content can take effect without restarting the service.
- Prerequisites:Use the archaius API to read data. If you use the Environment and @ value annotations, You need to restart the service to make the new value take effect. Therefore, you often need to change the value and use the following code to read it, the values directly injected into spring bean do not need to be changed.Environment and @ value !!!
- All configured operations are thread-safe.
Purpose:
- Unified Configuration Management
- Dynamic Configuration
1. Start consul and create KV
Start consul and create KV view: Chapter 20th springboot + consul (1)
Note:You can create kv manually..
The result is as follows:
Note:
- Key:Service/"service name"/"service tag"/config
- Value: configuration content in the application. properties File
2. Programming
1. Introduce jar
1 <! -- Archaius --> 2 <dependency> 3 <groupId> com. netflix. archaius </groupId> 4 <artifactId> archaius-core </artifactId> 5 <version> 0.6.6 </version> 6 </dependency> 7 <! -- Dynamic configuration, archaius underlying layer --> 8 <dependency> 9 <groupId> commons-configuration </groupId> 10 <artifactId> commons-configuration </artifactId> 11 <version> 1.8 </version> 12 </dependency>
Note: The introducedCommons-configurationIs the underlying implementation of archaius.
2. Build the source for reading the configuration of archaius
1 package com. microservice. archaius; 2 3 import java. io. stringReader; 4 import java. util. hashMap; 5 import java. util. map; 6 import java. util. properties; 7 8 import org. apache. commons. lang3.StringUtils; 9 10 import com. google. common. base. optional; 11 import com. netflix. config. pollResult; 12 import com. netflix. config. polledConfigurationSource; 13 import com. orbitz. consul. consul; 14 import com. orbitz. consul. keyValueClient; 15 16/** 17 * specifies the archaius to read the configuration source 18 */19 public class ConsulConfigurationSource implements PolledConfigurationSource {20 21 private String keyName; 22 23 public ConsulConfigurationSource (String keyName) {24 this. keyName = keyName; 25} 26 27/** 28 * by default, this method runs once every 60 s, 29 */30 @ Override31 public PollResult poll (boolean initial, object checkPoint) throws Exception {32 Consul consul = Consul. builder (). build (); 33 KeyValueClient kvClient = consul. keyValueClient (); 34 Optional <String> kvOpt = kvClient. getValueAsString (keyName); 35 String kvStr = StringUtils. EMPTY; 36 if (kvOpt. isPresent () {37 kvStr = kvOpt. get (); 38} 39 40 Properties props = new Properties (); 41 props. load (new StringReader (kvStr); // String-> Properties42 43 Map <String, Object> propMap = new HashMap <> (); 44 for (Object key: props. keySet () {45 propMap. put (String) key, props. get (key); 46} 47 return PollResult. createFull (propMap); 48} 49 50}
Note:
- String-> properties use prop. load (new StringReader (str ));
- The poll method is executed once every 60 s (default) (that is, the value is pulled from consul)
3. Configure the manager and dynamically read
1 @ ApiOperation ("get KV from consul by archaius") 2 @ RequestMapping (value = "/kv2/", method = RequestMethod. GET) 3 public void getKVByArchaius (@ RequestParam ("key") String key) throws IOException {4 5 PolledConfigurationSource source = new ConsulConfigurationSource (key ); // define the source of the read configuration 6 AbstractPollingScheduler scheduler = new FixedDelayPollingScheduler (); // set 7 DynamicConfiguration configuration = new DynamicConfiguration (source, schedmanager); 8 9 ConfigurationManager. install (configuration); 10 11 DynamicStringProperty dsp = DynamicPropertyFactory. getInstance (). getStringProperty ("mysql. driverClassName "," zhaojigangDriver "); 12 System. out. println ("current time:" + LocalDateTime. now () + "--> value:" + dsp. get (); 13 try {14 Thread. sleep (60000); // sleep 60s15} catch (InterruptedException e) {16 e. printStackTrace (); 17} 18 System. out. println ("current time:" + LocalDateTime. now () + "--> value:" + dsp. get (); 19}
Steps:
- Build DynamicConfiguration Based on the Data configuration source PolledConfigurationSource and the scheduler abstractpollingschedconfiguration (this class is actually a Property)
- Add DynamicConfiguration to ConfigurationManager
- Use DynamicPropertyFactory. getInstance (). getStringProperty (String key, String defaultValue) to dynamically read
Configuration Management and dynamic management in microservices are complete !!!