centralized application configuration with spring and apache zookeeper

38
© 2014 SpringOne 2GX. All rights reserved. Do not distribute without permission. Centralized Application Configuration with Spring and Apache ZooKeeper By Ryan Gardner, Dealer.com

Upload: ryan-gardner

Post on 05-Dec-2014

519 views

Category:

Technology


1 download

DESCRIPTION

From talk given at Spring One 2gx Dallas, 2014 Application configuration is an evolution. It starts as a hard-coded strings in your application and hopefully progresses to something external, such as a file or system property that can be changed without deployment. But what happens when other enterprise concerns enter the mix, such as audit requirements or access control around who can make changes? How do you maintain the consistency of values across too many application servers to manage at one time from a terminal window? The next step in the application configuration evolution is centralized configuration that can be accessed by your applications as they move through your various environments on their way to production. Such a service transfers the ownership of configuration from the last developer who touched the code to a well-versed application owner who is responsible for the configuration of the application across all environments. At Dealer.com, we have created one such solution that relies on Apache ZooKeeper to handle the storage and coordination of the configuration data and Spring to handle to the retrieval, creation and registration of configured objects in each application. The end result is a transparent framework that provides the same configured objects that could have been created using a Spring configuration, configuration file and property value wiring. This talk will cover both the why and how of our solution, with a focus on how we leveraged the powerful attributes of both Apache ZooKeeper and Spring to rid our application of local configuration files and provide a consistent mechanism for application configuration in our enterprise.

TRANSCRIPT

Page 1: Centralized Application Configuration with Spring and Apache Zookeeper

© 2014 SpringOne 2GX. All rights reserved. Do not distribute without permission.

Centralized Application Configuration with Spring and Apache ZooKeeper

By Ryan Gardner, Dealer.com

Page 2: Centralized Application Configuration with Spring and Apache Zookeeper

2

How do you configure your applications?

http://b.socrative.com/login/student/

config2gx

Page 3: Centralized Application Configuration with Spring and Apache Zookeeper

3

Who is Dealer.com?

We make software that car dealers use

to fulfill their digital marketing vision.

Page 4: Centralized Application Configuration with Spring and Apache Zookeeper

4

The Remote Configuration Project

Page 5: Centralized Application Configuration with Spring and Apache Zookeeper

5

Some ways we had configured our applications

• Hardcoded values in code• Properties file – per environment or merged• Host files for database• JNDI context files

Page 6: Centralized Application Configuration with Spring and Apache Zookeeper

6

Motivating factors

• Developer Efficiency• Redeploying an application just to change a configuration is a drag• Having to edit N config files whenever a single application changed is a

hassle

• Security Compliance• Limit access to production databases• Auditing and approval process for configuration changes

• Systems Engineering• Can’t make certain changes without involving developers

Page 7: Centralized Application Configuration with Spring and Apache Zookeeper

7

Framework Development – Guns n Roses style

"Welcome to the jungle"

Thanks.

"We've got fun and games"

Cool.

"You're in the jungle"

We've established this

"You're gonna die!"

Wait what?

https://twitter.com/OhNoSheTwitnt/status/469838190141255680

Page 8: Centralized Application Configuration with Spring and Apache Zookeeper

8

High Level Overview

Page 9: Centralized Application Configuration with Spring and Apache Zookeeper

9

Three main components

Page 10: Centralized Application Configuration with Spring and Apache Zookeeper

10

Page 11: Centralized Application Configuration with Spring and Apache Zookeeper

11

Key Concepts in the Remote Configuration

ConfigurationA set of properties or values necessary to create an object.

Examples:

Database configuration, FTP endpoint configuration,

HTTP Proxy Factory Bean Configuration,

Page 12: Centralized Application Configuration with Spring and Apache Zookeeper

12

Tripoli – editing a configuration

Page 13: Centralized Application Configuration with Spring and Apache Zookeeper

13

Separation of environments

• We edit our configurations in one spot, but applications are only able to retrieve configurations for the environment they are running in

• Secrets – such as passwords or encryption keys – are encrypted with an environment-specific key

• Tripoli has all the keys, each environment will only have a key specific to it

Page 14: Centralized Application Configuration with Spring and Apache Zookeeper

14

Configuration inheritance – avoiding copy & paste

By Environment• Configuration can be set at a global level

and overridden at each environment

By Path• Nodes added with /’s in the name will inherit data from nodes

above them. • /remoting/core-services/UserLocator inherits values from

/remoting/core-services

Page 15: Centralized Application Configuration with Spring and Apache Zookeeper

15

Key Concepts in the Remote Configuration

BindingsIdentifying which configurations an application uses, and what the application wants to call them

Example: An application that needs to talk to a certain database, look up users from a remote service, and send data to a remote SFTP site would have bindings such as:

jdbc/user-database is bound to the configuration called user-database-config

Page 16: Centralized Application Configuration with Spring and Apache Zookeeper

16

Tripoli – editing bindings

Page 17: Centralized Application Configuration with Spring and Apache Zookeeper

17

Creating objects, not properties*

• Configure once – use everywhere• Avoid having to copy-and-paste boilerplate setup code

* properties are supported too

Page 18: Centralized Application Configuration with Spring and Apache Zookeeper

18

Behind the Scenes

Page 19: Centralized Application Configuration with Spring and Apache Zookeeper

19

Apache Zookeeper

• Hierarchical data registers• Designed for high-throughput, low-latency, highly-available • Nodes in zookeeper are called “znodes”

• Each path can stored data

• Designed for storing small amounts of data in the znodes (KB, not MB)

• For more info: • https://cwiki.apache.org/confluence/display/ZOOKEEPER/

ProjectDescription

Page 20: Centralized Application Configuration with Spring and Apache Zookeeper

20

Where do we store this data?

• Versioned configuration in ZooKeeper as JSON• In ZooKeeper znodes:

• /bindings/<binding name>overrides:• /bindings/<habitat>/<datacenter>/<binding name>• /configurations/<configuration name>/

Page 21: Centralized Application Configuration with Spring and Apache Zookeeper

21

Talking to ZooKeeper

• Use Curator framework• We use ACLs in ZooKeeper ensure apps can’t read data for other

environments• We use a SASL config file on the machines to provide the

ZooKeeper credentials

Page 22: Centralized Application Configuration with Spring and Apache Zookeeper

22

Exhibitor – makes managing ZooKeeper easier

Page 23: Centralized Application Configuration with Spring and Apache Zookeeper

23

How do the objects get created?

• Two classes for each remotely-configurable object, the config and the creator

• Configs use bean-validation annotations and a special annotation on the config-field to explain what the config field does.

• This populates the tool-tips in the browser window and is used to ensure that only valid entries are put into the fields

Page 24: Centralized Application Configuration with Spring and Apache Zookeeper

24

An example config class

@ConfigCategory("ftp”)public class SpringIntegrationSftpSessionFactoryConfig extends Config {

@Required @ConfigField(description = "The host name of the SFTP server.”) private String host; @Port @ConfigField(description = "The port of the SFTP server. Defaults to 22.”) private Integer port;

Page 25: Centralized Application Configuration with Spring and Apache Zookeeper

25

A config class (continued)

@Required@Password@ConfigField(description = "The private key used to establish the SFTP

connection.”)private ConfigPassword privateKey; @Password@ConfigField(description = "The passphrase for the private key. Defaults to

empty string.”)private ConfigPassword privateKeyPassphrase;

Page 26: Centralized Application Configuration with Spring and Apache Zookeeper

26

Creators take the config and return an object

public class ExampleObjectCreator extends ObjectCreator<SomeConfig,ExampleObject> {

@Overridepublic ExampleObject create(SomeConfig) {

// do whatever is needed to create the objectreturn new ExampleObject();

}}

Page 27: Centralized Application Configuration with Spring and Apache Zookeeper

27

Kinds of creators we have made

• Database connection (various connection pools)• Mongo connection pools• RPC remoting proxies (Spring HTTP Invoker, etc)• REST resources• Redis connections• Properties / System properties • FTP and SFTP connections• Executor services• RabbitMQ • SOLR • ElasticSearch• … more

Page 28: Centralized Application Configuration with Spring and Apache Zookeeper

28

How do apps use this?

Page 29: Centralized Application Configuration with Spring and Apache Zookeeper

29

First pass – XML namespace parser

<beans … xmlns:remote-config=“http://www.dealer.com/schema/remote-config”

…> <remote-config:lookup id="dataSource" name=”jdbc/my-datasource" />

<remote-config:remote-config-property-source id="myProps" name="properties/my-props" />

</beans>

Page 30: Centralized Application Configuration with Spring and Apache Zookeeper

30

Second pass – Auto-config with XML

<beans … xmlns:remote-config=“http://www.dealer.com/schema/remote-config”

…>…

<remote-config:auto-create /> …</beans>

Page 31: Centralized Application Configuration with Spring and Apache Zookeeper

31

Third pass - @EnableRemoteConfig

@EnableRemoteConfigpublic class ApplicationConfig {

// insert tweetable app here. }

Page 32: Centralized Application Configuration with Spring and Apache Zookeeper

32

Accessing properties

Page 33: Centralized Application Configuration with Spring and Apache Zookeeper

33

Integrating remote properties into spring

• We create a PropertySource • And we create a PropertySourcesPlaceholderConfigurer

Page 34: Centralized Application Configuration with Spring and Apache Zookeeper

34

Using properties via @Value

@Beanpublic SomeBean someBean (@Value(“${some.value}”) someValue) {

return new SomeBean(someValue)}…@Value(“${some.remote.property.value}”)private String someValue;

Page 35: Centralized Application Configuration with Spring and Apache Zookeeper

35

Deeper dive – demo &look at some of the code

Page 36: Centralized Application Configuration with Spring and Apache Zookeeper

36

Future plans & extensions for this

Page 37: Centralized Application Configuration with Spring and Apache Zookeeper

37

Questions?

Page 38: Centralized Application Configuration with Spring and Apache Zookeeper

38

Learn More. Stay Connected

Tweet: “#s2gx talk about zookeeper blew my mind! Thanks @ryebrye and @springcentral”

@springcentral | spring.io/video