Anatole Tresch & Werner Keil Trivadis AG @atsticks - - PowerPoint PPT Presentation

anatole tresch werner keil
SMART_READER_LITE
LIVE PREVIEW

Anatole Tresch & Werner Keil Trivadis AG @atsticks - - PowerPoint PPT Presentation

Anatole Tresch & Werner Keil Trivadis AG @atsticks @wernerkeil Apache T amaya Configuration Management Bio Anatole Tresch Principal Consultant, Trivadis AG (Switzerland) Star Spec Lead JSR 354 Technical


slide-1
SLIDE 1

Anatole Tresch & Werner Keil

Trivadis AG @atsticks @wernerkeil

slide-2
SLIDE 2

Apache T amaya

Configuration Management

slide-3
SLIDE 3

Anatole Tresch

  • Principal Consultant, Trivadis AG (Switzerland)
  • Star Spec Lead JSR 354
  • Technical Architect, Lead Engineer
  • PPMC Member Apache Tamaya
  • Twitter/Google+: @atsticks
  • anatole@apache.org
  • anatole.tresch@trivadis.com
  • JUG Switzerland, Zurich Java Community

3

Bio

slide-4
SLIDE 4

Werner Keil

  • Consultant – Coach
  • Creative Cosmopolitan
  • Open Source Evangelist
  • Software Architect
  • JCP EC Member
  • Tamaya Committer
  • Java EE | DevOps Guy …
  • Twitter/Google+: @wernerkeil
  • wkeil@apache.org

4

Bio

slide-5
SLIDE 5

Agenda

5

  • General Infos
  • What is Configuration?
  • Use Cases
  • Apache Tamaya
  • Core Concepts
  • Extensions
  • Outlook
slide-6
SLIDE 6

6

General Infos

slide-7
SLIDE 7

7

  • 2012: Configuration was voted an important

aspect for Java EE 8

  • 2013:
  • Setup of Java EE Configuration JSR failed
  • Standardization on SE Level did not have enough momentum
  • BUT:
  • Configuration is a crucial cross cutting concern
  • There is no (really NO!) defacto standard
  • Reinventing the wheel is daily business

History of Apache Tamaya

slide-8
SLIDE 8

The People behind Tamaya

8

  • John D. Ament (Mentor)
  • David Blevins (Champion)
  • Werner Keil
  • Gerhard Petracek (Mentor)
  • Mark Struberg (Mentor)
  • Anatole Tresch
  • Oliver B. Fischer
  • ...
slide-9
SLIDE 9

The Objectives of Apache Tamaya

9

  • Define a common API for accessing configuration
  • Minimalistic, also fits into ME
  • Flexible, pluggable and extendible design
  • support functional programming style
  • Be compatible with Java 7 and beyond
  • Provide a reference implementation
  • Provide Extension Modules for Additional Features
  • If possible, create a Standard!
slide-10
SLIDE 10

What is Configuration?

slide-11
SLIDE 11

What people think is configuration?

11

  • Many different interested stakeholders
  • Many things to configure
  • Divergent views
  • Setup for a server environment
  • Parameters of a runtime (staging, localization etc.)
  • Deployment descriptors
  • Technology-specific components (beans, wirings etc.)
  • Resource-specific settings (data sources, message queues etc.)
  • Dynamic scripting facility, Different scopes (global, ear, app, …)
  • Different granularities, varying levels of applicability, Different formats …
slide-12
SLIDE 12

What we think is configuration

12

Component X Component Y

<dependency>

Configuration

<dependency>

Components:

 Behaviour and state  Transitive Deps  Scopes  Code  Dynamic  Not serializalbe

Configuration:

 Data, Value Types  Transitive Deps  Scopes  Key, value pairs  Static  Serializable

slide-13
SLIDE 13

Use Cases

slide-14
SLIDE 14

UC: Access Configuration Similarly

14

Configuration

API API

MicroService Container IaaS PaaS Cache SaaS Build-Tool

  • Any Location
  • Any Format
  • Any Policy

SPI

slide-15
SLIDE 15

UC: Reduce Redundancy

15

Service Foo Cache Foo Configuration:

Service.host.ip=192.168.1.10 Service.stage=test Service.param=paramValue

Redundant!

File 1 File 2

Tamaya Configuration Foo Configuration:

Service.host.ip=${env:HOST_IP} Service.stage=${env:STAGE} Service.param=paramValue

Cache Configuration:

Cache.host.ip=192.168.1.10 Cache.stage=test Cache.param=cacheValue

Tamaya Configuration Cache Configuration:

Cache.host.ip=${env:HOST_IP} Cache.stage=${env:STAGE} Cache.param=cacheValue

Tamaya Configuration Tamaya Configuration

slide-16
SLIDE 16

UC: Convention over Configuration

16

Foo Configuration:

Service.host.ip=${cfg:env.host.ip} Service.stage=${cfg:env.stage} Service.param=paramValue

Cache Configuration:

Cache.host.ip=${cfg:env.host.ip} Cache.stage=${cfg:env.stage} Cache.param=cacheValue

Defaults:

env.host.ip=${env:HOST_IP} env.stage=${env:STAGE}

Service Foo Cache Tamaya Configuration Tamaya Configuration

slide-17
SLIDE 17

UC: Pluggable Config Backends

Classic: Tamaya Configuration

17

Distributed:

ZooKeeper Etcd ...

Classic Policy (PropertySources)

Myproject/bin/... Myproject/conf/server.xml Myproject/conf/cluster.xml Myproject/conf/security.xml Myproject/lib/...

...

Unified Config API

Remote Policy (PropertySources) ??? Unified API for configuration access Policies can be provided as jar- artifacts separately Additional benefits: config documentation Your Project

slide-18
SLIDE 18

UC: Enterprise Integration

18

Company X: Config SOAP

Myproject/bin/... Myproject/conf/server.xml Myproject/conf/cluster.xml Myproject/conf/security.xml Myproject/lib/... ...

Company Z: Config Rest Company Y: etcd

Company A: Legacy Config

Tamaya Configuration Classic Policy (PropertySources)

Unified Config API

Config Integration (PropertySources) Your Project

slide-19
SLIDE 19

19

Service Foo Cache

Tamaya Configuration Tamaya Configuration

Locations:

 file:${filedir}  classpath:META-INF/defaults/

configuration.*

 classpath:META-INF/${STAGE}/

configuration.*

 url:http://myserver.int/cfg  System properties  Env. Properties

Formats:

 properties  xml  json  yaml

Config Policy <implements>

Define, implement and distribute Company Wide Configuration Policy Policy Policy

<implements>

UC: Enforceable Policies

slide-20
SLIDE 20

20

  • Reinventing the wheel is daily business, leading to
  • Higher Efforts in Enterprise Integration
  • Configuration Redundancies and Inconsistencies
  • Unclear or Complex Handling when remote Configuration should be

supported as well

  • Make Projects Integration Raedy with Company Infrastructure
  • Make your Configuration Backends Pluggable

Summary: Why we need Tamaya?

slide-21
SLIDE 21

The API

21

slide-22
SLIDE 22

Let's start simple!

22

  • Add dependency
  • rg.apache.tamaya:core:1.0-incubating
  • Add Config to META-INF/javaconfiguration.properties
  • Use it!

Configuration config = ConfigurationProvider.getConfiguration(); String name = config.getOrDefault("name", "John"); int ChildNum = config.get("childNum", int.class);

slide-23
SLIDE 23

ConfigurationProvider

23

public class ConfigurationProvider{ public static Configuration getConfiguration(); public static ConfigurationContext getConfigurationContext(); public static ConfigurationContextBuilder getConfigurationContextBuilder() public static void setConfigurationContext( ConfigurationContext context); }

slide-24
SLIDE 24

24

public interface Configuration{ String get(String key); String getOrDefault(String key, String defaultValue); <T> T get(String key, Class<T> type); <T> T get(String key, TypeLiteral<T> type); <T> T getOrDefault(String key, Class<T> type, T defaultValue); <T> T getOrDefault(String key, TypeLiteral<T> type, T defaultValue); Map<String,String> getProperties(); // Functional Extension Points Configuration with(ConfigOperator operator): <T> T query(ConfigQuery<T> query); }

Configuration

slide-25
SLIDE 25

Core Concepts

25

  • Configuration provides properties
  • built up by an ordered list of

PropertySources

  • SPI
  • PropertyConverter
  • CombinationPolicy
  • PropertyFilter
  • Extensions (discussed later)

ConfigurationContext PropertyFilters PropertySource PropertySource PropertySource PropertySource Configuration CombinationPolicy PropertyProviders

<provides>

P r

  • p

e r t y C

  • n

v e r t e r

slide-26
SLIDE 26

Overriding Basics

26

#default ordinal = 0 name=Benjamin childNum=0 family=Tresch #override ordinal tamaya.ordinal=10 name=Anatole childNum=3 tamaya.ordinal=10 name=Anatole childNum=3 family=Tresch

slide-27
SLIDE 27

CombinationPolicy

27

list=a,b,c list{collection-type}=List tamaya.ordinal=10 list=aa,bb tamaya.ordinal=10 list=aa,bb,a,b,c list{collection-type}=List

slide-28
SLIDE 28

SPI: PropertySource PropertySourceProvider

public interface PropertySource { static final String TAMAYA_ORDINAL = "tamaya.ordinal"; String getName(); int getOrdinal(); String get(String key); Map<String, String> getProperties(); } public interface PropertySourceProvider { Collection<PropertySource> getPropertySources(); }

slide-29
SLIDE 29

Extension Modules

29

slide-30
SLIDE 30

Available Plugins

30

  • Tamaya-inject: Configuration Injection and Templates
  • Tamaya-resolver: Expression resolution, placeholders, dynamic values
  • Tamaya-resources: Ant styled resource resolution
  • Tamaya-format: Abstraction of a format, separating parsing from semantic mapping to

configuration

  • Format Extensions: yaml*, json, ini, ...
  • Tamaya-spring: Integration with Spring
  • Tamaya-classloader-support: Managing Tamaya Services within Classloading Hierarchies
  • Tamaya-cdi: Integration with CDI
  • Tamaya-server: REST/JSON Configuration Server
  • Tamaya-remote: Client PropertySource matching server component
  • Tamaya-docs*: Configuration Documentation

* work in progress

slide-31
SLIDE 31

Planned Features

31

  • Java EE: Configuring EE, where possible
  • Karaf Integration
  • Source Integrations:
  • Commons-config
  • Etcd
  • Zookeeper
  • ...
  • Runtime Integrations:
  • ???
slide-32
SLIDE 32

Configuration Injection

32

@ConfiguredType(defaultSections=”com.mycomp.tenantAdress”) public final class MyTenant{ private String name; @ConfiguredProperty @DefaultValue(”2000”) private long customerId; @ConfiguredProperty(keys={ ”privateAddress”,”businessAdress”,”[my.qualified.adress]” }) private String address; ... }

MyTenant t = new MyTenant(); ConfigurationInjection .getConfigurationInjector() .configure(t); MyTenant t = new MyTenant(); ConfigurationInjection .getConfigurationInjector() .configure(t); @RequestScoped public class MyClass{ @Inject private MyTenant t; … } @RequestScoped public class MyClass{ @Inject private MyTenant t; … }

slide-33
SLIDE 33

Configuration Template

33

@ConfiguredType(defaultSections=”com.mycomp.tenantAdress”) public interface MyTenant{ public String getName(); @ConfiguredProperty @DefaultValue(”2000”) public long getCustomerId(); @ConfiguredProperty(keys={ ”privateAddress”,”businessAdress”,”[my.qualified.adress]” }) public String getAddress(); }

MyTenant t = ConfigurationInjection .getConfigurationInjector() .createTemplate(MyTenant.class); MyTenant t = ConfigurationInjection .getConfigurationInjector() .createTemplate(MyTenant.class);

slide-34
SLIDE 34

Demo

DEMO

34

slide-35
SLIDE 35

Summary

35

Apache Tamaya Provides

  • A Complete API based on Java SE 7, compatible with SE 6
  • String key/value based thread-safe Configuration Model
  • Support for Type-Safe Configuration Value Conversion
  • Functional extension points
  • Simple Filtering and Overrides
  • Small footprint
  • Extendible with plugins
slide-36
SLIDE 36

We need help

36

Apache Tamaya is great, but we need you...

  • … using it!
  • … asking for features!
  • … envangelizing it!
  • … loving it!
  • … extending it!
  • ...
slide-37
SLIDE 37

Links

  • Twitter: @tamayaconfig
  • Blog: http://javaeeconfig.blogspot.com
  • Presentation by Mike Keith on JavaOne 2013:

https://oracleus.activeevents.com/2013/connect/sessionDetail.ww?SESSION_ID=7755

  • Apache Deltaspike: http://deltaspike.apache.org
  • Java Config Builder: https://github.com/TNG/config-builder
  • Apache Commons Configuration: http://commons.apache.org/proper/commons-configuration/
  • Jfig: http://jfig.sourceforge.net/
  • Carbon Configuration: http://carbon.sourceforge.net/modules/core/docs/config/Usage.html
  • Comparison on Carbon and Others:

http://www.mail-archive.com/commons-dev@jakarta.apache.org/msg37597.html

  • Spring Framework: http://projects.spring.io/spring-framework/
  • Owner: http://owner.aeonbits.org/

37

slide-38
SLIDE 38

Q&A

38

Thank you!

Anatole Tresch

Trivadis AG Principal Consultant Twitter/Google+: @atsticks anatole@apache.org anatole.tresch@trivadis.com