Hesperides

Gestion de configuration applicative

La problématique

La problématique - Le concept - L'architecture - La technique - La démo

La problématique - Le concept - L'architecture - La technique - La démo

La problématique - Le concept - L'architecture - La technique - La démo

Le concept

La problématique - Le concept - L'architecture - La technique - La démo

La problématique - Le concept - L'architecture - La technique - La démo

La problématique - Le concept - L'architecture - La technique - La démo

L'architecture

La problématique - Le concept - L'architecture - La technique - La démo

La technique

Event Sourcing

La problématique - Le concept - L'architecture - La technique - La démo

Quelques principes

La problématique - Le concept - L'architecture - La technique - La démo

1 - Chaque action sur les données est un Event

2 - Seuls les events sont sauvegardés (event store)

3 - L'état de la donnée est construit à partir des events

La problématique - Le concept - L'architecture - La technique - La démo

1 - Chaque action sur les données est un Event

2 - Seuls les events sont sauvegardés (event store)

3 - L'état de la donnée est construit à partir des events

La problématique - Le concept - L'architecture - La technique - La démo

2 - Seuls les events sont sauvegardés (event store)

3 - L'état de la donnée est construit à partir des events

La problématique - Le concept - L'architecture - La technique - La démo

1 - Chaque action sur les données est un Event

La problématique - Le concept - L'architecture - La technique - La démo

  • Création de plateforme


  • Création d'une plateforme à partir d'une autre

La problématique - Le concept - L'architecture - La technique - La démo

public final class PropertiesSavedEvent {
    private final String     applicationName;
    private final String     platformName;
    private final String     path;
    private final PropertiesData properties;
    private final String    comment;

    @JsonCreator
    public PropertiesSavedEvent(@JsonProperty("applicationName")final String applicationName,
                                @JsonProperty("platformName") final String platformName,
                                @JsonProperty("path") final String path,
                                @JsonProperty("properties") final PropertiesData properties,
                                @JsonProperty("comment") final String comment) {
        this.applicationName = applicationName;
        this.platformName = platformName;
        this.path = path;
        this.properties = properties;
        this.comment = comment;
    }

    // truncated for simplicity
}

La problématique - Le concept - L'architecture - La technique - La démo

Event Store

La problématique - Le concept - L'architecture - La technique - La démo

127.0.0.1:6379> llen module-demoKatana-war-1.0.0.1-wc
(integer) 4
127.0.0.1:6379> lrange module-demoKatana-war-1.0.0.1-wc 0 3
1) "{\"eventType\":\"com.vsct.dt.hesperides.templating.modules.ModuleCreatedEven
t\",\"data\":\"{\\\"moduleCreated\\\":{\\\"name\\\":\\\"demoKatana-war\\\",\\\"v
ersion\\\":\\\"1.0.0.1\\\",\\\"working_copy\\\":true,\\\"technos\\\":[],\\\"vers
ion_id\\\":1},\\\"templates\\\":[{\\\"name\\\":\\\"application.properties\\\",\\
\"namespace\\\":\\\"modules#demoKatana-war#1.0.0.1#WORKINGCOPY\\\",\\\"filename\
\\":\\\"application.properties\\\",\\\"location\\\":\\\"/appl/{{username}}/prope
rties\\\",\\\"content\\\":\\\"spring.datasource.jndi-name=jdbc/demoKatana\\\\nin
fo.propriete_en_dur={{propriete_a_surcharger}}\\\\n{{#test}}\\\\n\\\\t{{prop2|co
mmentaire}}\\\\n{{/test}}\\\",\\\"version_id\\\":1}]}\",\"timestamp\":1448975559
026,\"user\":\"untracked\"}"

// truncated for simplicity
Long len = jedis.llen(streamName);
int i = 0, j = 0, counter = 0;

List<byte[]> events = jedis.lrange(streamName.getBytes(StandardCharsets.UTF_8), j, j + BATCH_SIZE - 1);
for (i = 0; i < events.size(); i++) {
    Event event = MAPPER.readValue(events.get(i), Event.class);
    Object hesperidesEvent = MAPPER.readValue(event.getData(), Class.forName(event.getEventType()));
    eventConsumer.accept(hesperidesEvent);
}
// truncated for simplicity

La problématique - Le concept - L'architecture - La technique - La démo

Guava Event Bus

La problématique - Le concept - L'architecture - La technique - La démo

// 1 - Create the event bus
EventBus eventBus = new EventBus();
// 2 - Create listener
public class ModuleEventsIndexation {

    private final ElasticSearchIndexationExecutor indexer;

    public ModuleEventsIndexation(final ElasticSearchIndexationExecutor indexer) {
        this.indexer = indexer;
    }
    
    /* This is the event handler */
    @Subscribe
    public void deleteModule(final ModuleDeletedEvent event){
        this.indexer.index(new DeleteModuleCommand(event));
    }
    // truncated for simplicity
}
// 3 - Register the listener
eventBus.register(new ModuleEventsIndexation(elasticSearchIndexationExecutor));
// 4 - Propagate the event
eventBus.post(event);

La problématique - Le concept - L'architecture - La technique - La démo

Dropwizard

La problématique - Le concept - L'architecture - La technique - La démo

La problématique - Le concept - L'architecture - La technique - La démo

La démo !

Open sourcing info

Back

Front

Docs

Docker

This presentation

Made with Slides.com