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

org.lognet.springboot.grpc.autoconfigure.consul.ServiceRegistrationMode Maven / Gradle / Ivy

The newest version!
package org.lognet.springboot.grpc.autoconfigure.consul;

import com.ecwid.consul.v1.agent.model.NewService;
import io.grpc.Server;
import io.grpc.ServerServiceDefinition;
import io.grpc.health.v1.HealthGrpc;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import java.util.Objects;
import java.util.Optional;
import java.util.stream.Collectors;
import org.lognet.springboot.grpc.autoconfigure.GRpcServerProperties;
import org.springframework.cloud.consul.discovery.ConsulDiscoveryProperties;
import org.springframework.cloud.consul.serviceregistry.ConsulAutoRegistration;
import org.springframework.context.ApplicationContext;
import org.springframework.util.CollectionUtils;
import org.springframework.util.StringUtils;

public enum ServiceRegistrationMode implements ServiceRegistrationStrategy {
  NOOP {
    @Override
    public Collection createServices(
        Server grpcServer, ApplicationContext applicationContext) {
      return Collections.emptyList();
    }
  },
  SINGLE_SERVER_WITH_GLOBAL_CHECK {
    @Override
    public Collection createServices(
        Server grpcServer, ApplicationContext applicationContext) {
      GRpcServerProperties gRpcServerProperties =
          applicationContext.getBean(GRpcServerProperties.class);
      ConsulDiscoveryProperties consulProperties =
          applicationContext.getBean(GrpcConsulProperties.class).getDiscovery();

      NewService grpcService = new NewService();
      grpcService.setPort(grpcServer.getPort());
      if (!consulProperties.isPreferAgentAddress()) {
        grpcService.setAddress(consulProperties.getHostname());
      }
      String appName =
          "grpc-"
              + ConsulAutoRegistration.getAppName(
                  consulProperties, applicationContext.getEnvironment());
      grpcService.setName(ConsulAutoRegistration.normalizeForDns(appName));
      grpcService.setId(
          "grpc-" + ConsulAutoRegistration.getInstanceId(consulProperties, applicationContext));
      grpcService.setTags(consulProperties.getTags());
      grpcService.setMeta(getMetadata(consulProperties, gRpcServerProperties));
      grpcService.setEnableTagOverride(consulProperties.getEnableTagOverride());
      if (consulProperties.isRegisterHealthCheck()) {

        final NewService.Check healthCheck = new NewService.Check();
        healthCheck.setGrpc(consulProperties.getHostname() + ":" + grpcServer.getPort());
        healthCheck.setGrpcUseTLS(Objects.nonNull(gRpcServerProperties.getSecurity()));
        healthCheck.setInterval(consulProperties.getHealthCheckInterval());
        healthCheck.setTimeout(consulProperties.getHealthCheckTimeout());
        healthCheck.setDeregisterCriticalServiceAfter(
            consulProperties.getHealthCheckCriticalTimeout());

        grpcService.setCheck(healthCheck);
      }

      return Collections.singleton(grpcService);
    }

    private Map getMetadata(
        ConsulDiscoveryProperties properties, GRpcServerProperties gRpcServerProperties) {
      LinkedHashMap metadata = new LinkedHashMap<>();
      if (!CollectionUtils.isEmpty(properties.getMetadata())) {
        metadata.putAll(properties.getMetadata());
      }

      if (StringUtils.hasText(properties.getInstanceZone())) {
        metadata.put(properties.getDefaultZoneMetadataName(), properties.getInstanceZone());
      }
      if (StringUtils.hasText(properties.getInstanceGroup())) {
        metadata.put("group", properties.getInstanceGroup());
      }

      metadata.put("secure", Boolean.toString(null != gRpcServerProperties.getSecurity()));

      return metadata;
    }
  },
  SINGLE_SERVER_WITH_CHECK_PER_SERVICE {
    @Override
    public Collection createServices(
        Server grpcServer, ApplicationContext applicationContext) {
      final NewService grpcService =
          SINGLE_SERVER_WITH_GLOBAL_CHECK
              .createServices(grpcServer, applicationContext)
              .iterator()
              .next();
      final NewService.Check prototypeCheck = grpcService.getCheck();

      if (null != prototypeCheck) {
        grpcService.setCheck(null);
        grpcService.setChecks(
            grpcServer.getServices().stream()
                .filter(d -> !d.getServiceDescriptor().equals(HealthGrpc.getServiceDescriptor()))
                .map(
                    d -> {
                      final NewService.Check check = clone(prototypeCheck, NewService.Check.class);
                      // append "/serviceName" to grpc address
                      check.setGrpc(
                          String.format(
                              "%s/%s", check.getGrpc(), d.getServiceDescriptor().getName()));
                      return check;
                    })
                .collect(Collectors.toList()));
      }

      return Collections.singleton(grpcService);
    }
  },
  STANDALONE_SERVICES {
    @Override
    public Collection createServices(
        Server grpcServer, ApplicationContext applicationContext) {
      final NewService grpcServicePrototype =
          SINGLE_SERVER_WITH_GLOBAL_CHECK
              .createServices(grpcServer, applicationContext)
              .iterator()
              .next();

      List newServices = new ArrayList<>();
      final List services = grpcServer.getServices();
      for (int i = 0; i < services.size(); ++i) {
        final ServerServiceDefinition d = services.get(i);
        if (d.getServiceDescriptor().equals(HealthGrpc.getServiceDescriptor())) {
          continue;
        }
        final NewService service = clone(grpcServicePrototype, NewService.class);
        service.setId(String.format("%s-%d", service.getId(), i));
        service.getTags().add(d.getServiceDescriptor().getName());
        Optional.ofNullable(service.getCheck())
            .ifPresent(
                check ->
                    check.setGrpc(
                        String.format(
                            "%s/%s", check.getGrpc(), d.getServiceDescriptor().getName())));

        newServices.add(service);
      }
      return newServices;
    }
  }
}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy