configuration beyond java ee 8

49
BASEL BERN BRUGG DÜSSELDORF FRANKFURT A.M. FREIBURG I.BR. GENF HAMBURG KOPENHAGEN LAUSANNE MÜNCHEN STUTTGART WIEN ZÜRICH Configuration beyond Java EE Configuration with Apache Tamaya and Microprofile.io

Upload: anatole-tresch

Post on 11-Apr-2017

448 views

Category:

Technology


1 download

TRANSCRIPT

BASEL BERN BRUGG DÜSSELDORF FRANKFURT A.M. FREIBURG I.BR. GENF HAMBURG KOPENHAGEN LAUSANNE MÜNCHEN STUTTGART WIEN ZÜRICH

Configuration beyond Java EEConfigurationwith ApacheTamaya and Microprofile.io

Configuration beyond Java EE 828.03.2017

Anatole TreschPrincipal Consultant, Trivadis AG (Switzerland) Star Spec LeadTechnical Architect, Lead EngineerPPMC Member Apache Tamaya

@[email protected]@trivadis.com

2

About Me

Configuration beyond Java EE 828.03.2017

Agenda

3

● What‘s all about ?

● Framework Architecture● Accessing Configuration

● Configuration Backends

● Configuration Runtime

● Services

● Demo / Adoption Area

Configuration beyond Java EE 828.03.20174

What‘s all about ?

Configuration beyond Java EE 828.03.2017 5

What is Configuration ?

Simple Key/value pairs?

Typed values?

Configuration beyond Java EE 828.03.2017 6

When is Configuration useful?

Use Cases?

Configuration beyond Java EE 828.03.2017

7

How is it stored?

Remotely or locally?Classpath, file or ...?

Which format?All of the above (=multiple sources) ?

Configuration beyond Java EE 828.03.2017 8

When to configure?

Development time ?Build/deployment time?

Startup?Dynamic, anytime?

Configuration beyond Java EE 828.03.2017 9

Configuration Lifecycle ?

Static ?Refreshing ?

Changes triggered ?

Configuration beyond Java EE 828.03.201710

Do I need a runtime ?

Java SE?Java EE?

OSGI?Kubernetes?

Configuration beyond Java EE 828.03.2017

Framework Architecture

Configuration beyond Java EE 828.03.2017

12

What Configuration Solutions are out there?

Apache Commons ConfigApache TamayaApache DeltaspikeNetflix Archaius ConfigTypesafe ConfigMicroprofile.io...

Configuration beyond Java EE 828.03.2017 13

Common Framework Design

Accessor APIRuntimeConfiguration BackendsExtended Services

API

Runtime

Backends

Services

Configuration beyond Java EE 828.03.2017

Accessing Configuration

Configuration beyond Java EE 828.03.2017

15

Accessing configuration: Patterns

Service Locator PatternConfiguration InjectionTemplates

Configuration beyond Java EE 828.03.2017

16

Configuration cfg = ConfigurationProvider.getConfiguration();

String name = cfg.get("example.name"));String nameWithDefault = cfg.getOrDefault("example.name", "N/A");

BigDecimal bd = cfg.get("example.number", BigDecimal.class);

Map<String,String> properties = config.getProperties();

Accessing Config: Service Location Pattern

Configuration beyond Java EE 828.03.2017 17

Config config = ConfigProvider.getConfig();

Config config = ConfigProvider.getConfig( Thread.currentThread().getContextClassLoader());

String value = config.getValue("fooBar", String.class);Integer intValue = config.getValue("fooBar", Integer.class);

Optional<Integer> getOptionalValue("fooBar", Integer.class);        

Accessing Config: Service Location Pattern

Configuration beyond Java EE 828.03.2017

18

Accessing Config: Templates

MyConfigClass cfg = ConfigurationInjection.getConfigurationInjector() .getCon(MyCofignfigClass.class);

String name = cfg.getName();BigDecimal bd = cfg.getNumber();

Configuration beyond Java EE 828.03.2017

19

Accessing Config: Injection

public class NonAnnotatedConfigBean { public String simple_value = "Should be overridden!"; public String fieldKey; public String classFieldKey = "Foo"; public String fullKey; public String test2 = "This is not set.";}public class AnnotatedBean{ @Config(value = {"foo.bar.myprop", "mp"}, defaultValue = "ET") private String simpleValue; @Config String anotherValue;}

Configuration beyond Java EE 828.03.2017

20

Accessing Config: CDI

public class AnnotatedBean{

@Inject @Config(value = {"foo.bar.myprop", "mp"}, defaultValue = "ET") private String simpleValue;

@Inject @Config String anotherValue;}

Configuration beyond Java EE 828.03.2017

21

Accessing Config: CDI

public class AnnotatedBean{

@Inject @ConfigProperty(name = "foo.bar.myprop", defaultValue = "ET") private String simpleValue;

@Inject @ConfigProperty(name = "foo.bar.myprop") String anotherValue;}

Configuration beyond Java EE 828.03.2017

Configuration Backends

Configuration beyond Java EE 828.03.2017 23

● System-, Environment Properties, CLI Args

● Files, Classpath Resources

● Git, Subversion

● Databases

● Remote Services (etcd, consul)

● Distributed Caches/Grids (Redis, Hazelcast, Infinispan etc)

● ...

Configuration Backends

Configuration beyond Java EE 828.03.2017

Backend Model: ConfigSource

24

● Add dependency org.apache.tamaya:core: 0.2-incubating● Add Config to META-INF/javaconfiguration.properties● GO!

public interface ConfigSource {

    String getValue(String propertyName);        Map<String, String> getProperties();

    default int getOrdinal() { return 100; }    String getName();}

Configuration beyond Java EE 828.03.2017

Backend Model: PropertySource

25

● Add dependency org.apache.tamaya:core: 0.2-incubating● Add Config to META-INF/javaconfiguration.properties● GO!

public interface PropertySource {

    PropertyValue get(String key);        Map<String, PropertyValue> getProperties();        int getOrdinal();    String getName();    boolean isScannable();

}

Configuration beyond Java EE 828.03.2017

Backend Model: PropertyValue

26

● Add dependency org.apache.tamaya:core: 0.2-incubating● Add Config to META-INF/javaconfiguration.properties● GO!

public final class PropertyValue{ public String getKey(); public String getValue(); public String get(String key); public Map<String,String> getMetaEntries(); ...}

Configuration beyond Java EE 828.03.2017 27

Programmatic Configuration Creation

Configuration beyond Java EE 828.03.2017

ConfigurationContextBuilder

28

● Add dependency ConfigurationContext context =                    ConfigurationProvider.getConfigurationContextBuilder()                .addPropertySources(testPropertySource, testPS2)                .loadDefaultPropertyFilters()                .addPropertyFilter(myFilter)                .build();Configuration config = builder.createConfig(context);

// OptionallyConfigurationProvider.setConfiguration(config);

Configuration beyond Java EE 828.03.2017

ConfigurationBuilder

29

● Add dependency ConfigBuilder builder;Configuration config =                    builder                .withSources(testPropertySource, testPS2)                .build();

Configuration beyond Java EE 828.03.2017

Configuration Runtime:Apache Tamaya

Configuration beyond Java EE 828.03.2017 31

● Just Java 7 or higher !

What I need to run Tamaya ?

Configuration Cluster

Java EETamaya

Java SETamaya

Tamaya

Vertx.io

TamayaTomEE

Tamaya

Spring

Tamaya

OSGI

Configuration beyond Java EE 828.03.2017 32

And how does it work ?

Configuration beyond Java EE 828.03.2017

Apache Tamaya in 120 seconds...

33

1.Configuration = ordered list of PropertySources

2.Properties found are combined using a CombinationPolicy

3.Raw properties are filtered by PropertyFilter4.For typed access PropertyConverters 

have to do work5.Extensions add more features

(discussed later)6.Component Lifecycle is controlled by the ServiceContextManager

ConfigurationContext

PropertyFilters

PropertySource

PropertySource

PropertySource

PropertySource

Configuration

Com

bina

tionP

olic

yPropertyProviders<provides>

PropertyConverter

Configuration beyond Java EE 828.03.2017

Configuration Services

Configuration beyond Java EE 828.03.2017 35

Remote configuration !

Configuration beyond Java EE 828.03.2017 36

● Configuration is read from remote source, e.g.

● Etcd cluster

● Consul cluster

● Any Web URL

● ...

Remote PropertySources

Service Location Layer

Configuration Cluster

<dependency>    <groupId>org.apache.tamaya.ext</groupId>    <artifactId>tamaya­etcd</artifactId>    <version>...</version></dependency>

Configuration beyond Java EE 828.03.2017 37

Easy Configuration:

„Meta“-Configuration !

Configuration beyond Java EE 828.03.2017 38

● Configuration that configures configuration

● E.g. at META­INF/tamaya­config.xml

● Allows easy and quick setup of your configuration environment

● Allows dynamic enablement of property sources

● ...

Meta-Configuration DRAFT !

Configuration beyond Java EE 828.03.2017 39

<configuration> <context> <context-param name="stage">DEV</context-param> </context> <sources> <source type="env-properties" enabled="${stage=TEST || stage=PTA || stage=PROD}" ordinal="200"/> <source type="sys-properties" /> <source type="file"> <observe period="20000">true</observe> <location>./config.json</location> </source> <source type="resources" multiple="true"> <multiple>true</multiple> <location>/META-INF/application-config.yml</location> </source> <source type="ch.mypack.MyClassSource"> <locale>de</locale> </source> <source type="includes" enabled="${context.cstage==TEST}"> <include>TEST.properties</include> </source> </sources></configuration>

DRAFT !

Configuration beyond Java EE 828.03.2017 40

Property resolution...

java.home=/usr/lib/java

compiler=${ref:java.home}/bin/javac

<dependency>    <groupId>org.apache.tamaya.ext</groupId>    <artifactId>tamaya­resolver</artifactId>    <version>...</version></dependency>

Configuration beyond Java EE 828.03.2017 41

Resource expressions…public class MyProvider extends AbstractPathPropertySourceProvider{

  public MyProvider(){

    super(“classpath:/META­INF/config/**/*.properties“);

  }

  @Override

  protected Collection<PropertySource> getPropertySources(URL url) {

      // TODO map resource to property sources

      return Collections.emptySet();

  }

}

<dependency>    <groupId>org.apache.tamaya.ext</groupId>    <artifactId>tamaya­resources</artifactId>    <version>...</version></dependency>

Configuration beyond Java EE 828.03.2017

And more: a topic on its own!

42

● Tamaya-spi-support: Some handy base classes to implement SPIs● Tamaya-functions: Functional extension points (e.g. remapping, scoping)● Tamaya-events: Detect and publish ConfigChangeEvents● Tamaya-optional: Minimal access layer with optional Tamaya support● Tamaya-filter: Thread local filtering● Tamaya-usagetracker: Tracking use and stats for configuration consumption● Tamaya-validation*: Configuration Documentation and Validation● Format Extensions: yaml, json, ini, … including formats-SPI● Integrations with Vertx, CDI, Spring, OSGI*, Camel, etcd, Consul● Tamaya-mutable-config: Writable ConfigChangeRequests● Tamaya-metamodel*: Configuration Meta-Model● Tamaya-collections*: Collection Support● Tamaya-resolver: Expression resolution, placeholders, dynamic values● Tamaya-resources: Ant styled resource resolution•... * experimental

Configuration beyond Java EE 828.03.2017

DemoAdoption Area: We 13:00h

(Community Hall)

Configuration beyond Java EE 828.03.2017

Summary

Configuration beyond Java EE 828.03.2017

Summary

45

● Work on config JSR for a EE 8 has been stopped by Oracle

● Community work is done in Microprofile.io and ASF

● Microprofile API is very minimal, but will evolve.

● Apache Tamaya provides most features you will ever need and supports

all major runtimes.

Configuration beyond Java EE 828.03.201746

You like it ?

Configuration beyond Java EE 828.03.201747

„It is your turn !“

● Use it● Evangelize it● Join the force!

Configuration beyond Java EE 828.03.2017

Links●Project Page: http://tamaya.incubator.apache.org ●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/ ● http://microprofile.io ●Microprofile Config API source: https://github.com/eclipse/microprofile-config

48

Configuration beyond Java EE 828.03.2017

Q&A

49

Thank you! @atsticks [email protected]

Anatole TreschTrivadis AGPrincipal ConsultantTwitter/Google+: @atsticks [email protected] [email protected]