Skip to content

Commit

Permalink
Fixed service discovery bugs (#34)
Browse files Browse the repository at this point in the history
* Fixed service discovery bugs

* Reset gradle version

* Optimize code

* Optimize code

* Optimize code

* Optimize code

* Optimize code

Co-authored-by: wz <[email protected]>
Co-authored-by: Kanro <[email protected]>
  • Loading branch information
3 people authored Jun 24, 2020
1 parent 0402428 commit b9a5268
Show file tree
Hide file tree
Showing 2 changed files with 36 additions and 16 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -2,11 +2,13 @@ package com.bybutter.sisyphus.middleware.grpc.client.kubernetes

import com.bybutter.sisyphus.middleware.grpc.ClientRepository
import com.bybutter.sisyphus.protobuf.ProtoTypes
import io.kubernetes.client.openapi.ApiException
import io.kubernetes.client.openapi.apis.CoreV1Api
import io.kubernetes.client.util.Config
import java.nio.charset.Charset
import java.nio.file.Files
import java.nio.file.Paths
import org.slf4j.LoggerFactory
import org.springframework.beans.factory.config.ConfigurableListableBeanFactory
import org.springframework.beans.factory.support.AbstractBeanDefinition
import org.springframework.beans.factory.support.BeanDefinitionBuilder
Expand All @@ -17,26 +19,38 @@ class KubernetesClientRepository : ClientRepository {
override var order: Int = Int.MIN_VALUE + 2000

override fun listClientBeanDefinition(beanFactory: ConfigurableListableBeanFactory, environment: Environment): List<AbstractBeanDefinition> {
val api = try {
CoreV1Api(Config.fromCluster())
} catch (e: IllegalStateException) {
throw IllegalStateException("Get config fail: $e, maybe not in k8s.")
} catch (e: NullPointerException) {
throw e
}
val path = Paths.get(Config.SERVICEACCOUNT_ROOT, "namespace")
if (!Files.exists(path)) {
throw IllegalStateException("can not find ${path.fileName}.")
logger.warn("Skip discovering services on kubernetes cluster, kubernetes downward API file not found.")
return emptyList()
}
val namespace = String(Files.readAllBytes(path), Charset.defaultCharset())
val api = try {
CoreV1Api(Config.fromCluster())
} catch (e: Exception) {
logger.warn("Skip discovering services on kubernetes cluster, an ${e.javaClass.name}('${e.message}') occurred when creating kubernetes client.")
return emptyList()
}
logger.debug("Detect application is running in kubernetes namespace $namespace.")
val beanDefinitionList = arrayListOf<AbstractBeanDefinition>()
val registerServiceNames = ProtoTypes.getRegisteredServiceNames()
for (serviceName in registerServiceNames) {
val list = api.listNamespacedService(namespace, null, null, null, null, serviceName, null, null, null, null)
val channel = list.items[0].spec?.ports?.get(0)?.port?.let {
createGrpcChannel(serviceName, it)
} ?: continue
val service = ProtoTypes.getRegisterService(serviceName) ?: throw IllegalStateException("Grpc service not be found.")
val list = try {
api.listNamespacedService(namespace, null, null, null, null, serviceName, null, null, null, null)
} catch (e: ApiException) {
logger.error("An exception('${e.message}') occurred when listing kubernetes services in namespace '$namespace'.")
continue
}
if (list.items.isEmpty()) continue
val k8sService = list.items[0]
val labelValue = k8sService.metadata?.labels?.get(serviceName) ?: continue
val port = k8sService.spec?.ports?.first {
it.name == labelValue || it.port.toString() == labelValue
}?.port ?: continue
val host = k8sService.metadata?.name ?: continue
logger.info("GRPC service '$serviceName' discovered in kubernetes service '$host:$port'.")
val channel = createGrpcChannel(host, port)
val service = ProtoTypes.getRegisterService(serviceName) ?: continue
val client = getClientFromService(service)
val stub = getStubFromService(service)
val clientBeanDefinition = BeanDefinitionBuilder.genericBeanDefinition(client as Class<Any>) {
Expand All @@ -46,4 +60,8 @@ class KubernetesClientRepository : ClientRepository {
}
return beanDefinitionList
}

companion object {
private val logger = LoggerFactory.getLogger(this.javaClass)
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -11,9 +11,6 @@ import org.springframework.stereotype.Component

@Component
class ClientRegistrar : BeanDefinitionRegistryPostProcessor, EnvironmentAware {
companion object {
private val logger = LoggerFactory.getLogger(ClientRegistrar::class.java)
}

private lateinit var environment: Environment

Expand All @@ -33,11 +30,16 @@ class ClientRegistrar : BeanDefinitionRegistryPostProcessor, EnvironmentAware {
val beanName = clientBean.beanClass.name
if (!registry.containsBeanDefinition(beanName)) {
registry.registerBeanDefinition(beanName, clientBean)
logger.info("Register '$beanName Client' via '${clientRepository.javaClass.simpleName}'.")
}
}
}
}

override fun postProcessBeanDefinitionRegistry(registry: BeanDefinitionRegistry) {
}

companion object {
private val logger = LoggerFactory.getLogger(ClientRegistrar::class.java)
}
}

0 comments on commit b9a5268

Please sign in to comment.