All Downloads are FREE. Search and download functionalities are using the official Maven repository.

pl.allegro.tech.servicemesh.envoycontrol.infrastructure.SynchronizationConfig.kt Maven / Gradle / Ivy

package pl.allegro.tech.servicemesh.envoycontrol.infrastructure

import com.ecwid.consul.v1.ConsulClient
import io.micrometer.core.instrument.MeterRegistry
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty
import org.springframework.context.annotation.Bean
import org.springframework.context.annotation.Configuration
import org.springframework.http.client.SimpleClientHttpRequestFactory
import org.springframework.web.client.RestTemplate
import pl.allegro.tech.discovery.consul.recipes.datacenter.ConsulDatacenterReader
import pl.allegro.tech.servicemesh.envoycontrol.EnvoyControlProperties
import pl.allegro.tech.servicemesh.envoycontrol.consul.ConsulProperties
import pl.allegro.tech.servicemesh.envoycontrol.consul.synchronization.SimpleConsulInstanceFetcher
import pl.allegro.tech.servicemesh.envoycontrol.synchronization.ControlPlaneClient
import pl.allegro.tech.servicemesh.envoycontrol.synchronization.ControlPlaneInstanceFetcher
import pl.allegro.tech.servicemesh.envoycontrol.synchronization.RemoteClusterStateChanges
import pl.allegro.tech.servicemesh.envoycontrol.synchronization.RemoteServices
import pl.allegro.tech.servicemesh.envoycontrol.synchronization.RestTemplateControlPlaneClient
import java.lang.Integer.max
import java.util.concurrent.Executors

@Configuration
@ConditionalOnProperty(name = ["envoy-control.sync.enabled"], havingValue = "true", matchIfMissing = false)
class SynchronizationConfig {

    @Bean
    fun restTemplate(
        envoyControlProperties: EnvoyControlProperties
    ): RestTemplate {
        val requestFactory = SimpleClientHttpRequestFactory()
        requestFactory.setConnectTimeout(envoyControlProperties.sync.connectionTimeout.toMillis().toInt())
        requestFactory.setReadTimeout(envoyControlProperties.sync.readTimeout.toMillis().toInt())

        return RestTemplate(requestFactory)
    }

    @Bean
    fun controlPlaneClient(restTemplate: RestTemplate, meterRegistry: MeterRegistry, remoteClusters: RemoteClusters) =
        RestTemplateControlPlaneClient(
            restTemplate = restTemplate,
            meterRegistry = meterRegistry,
            executors = Executors.newFixedThreadPool(max(remoteClusters.clusters.size, 1))
        )

    @Bean
    fun remoteClusterStateChanges(
        controlPlaneClient: ControlPlaneClient,
        meterRegistry: MeterRegistry,
        controlPlaneInstanceFetcher: ControlPlaneInstanceFetcher,
        properties: EnvoyControlProperties,
        remoteClusters: RemoteClusters
    ): RemoteClusterStateChanges {
        val service = RemoteServices(
            controlPlaneClient = controlPlaneClient,
            meterRegistry = meterRegistry,
            controlPlaneInstanceFetcher = controlPlaneInstanceFetcher,
            remoteClusters = remoteClusters.clusters
        )
        return RemoteClusterStateChanges(properties, service)
    }

    @Bean
    fun remoteClusters(
        consulDatacenterReader: ConsulDatacenterReader, properties: EnvoyControlProperties
    ): RemoteClusters = RemoteClusters(
        consulDatacenterReader.knownDatacenters() -
            consulDatacenterReader.localDatacenter() -
            properties.sync.blackListedRemoteClusters
    )

    @Bean
    fun instanceFetcher(
        consulProperties: ConsulProperties, envoyControlProperties: EnvoyControlProperties
    ) = SimpleConsulInstanceFetcher(
        ConsulClient(consulProperties.host, consulProperties.port), envoyControlProperties.sync.envoyControlAppName
    )
}

data class RemoteClusters(val clusters: List)




© 2015 - 2025 Weber Informatics LLC | Privacy Policy