1. I want to extend management based on Actuator in Alpha,But the custom  of 
Actuator is not compatible in spring boot 1.x and spring boot 2.x
I think it can be solved by adding  alpha-spring-boot-compatibility module, 
alpha-spring-boot-compatibility contains alpha-spring-boot-1-starter and 
alpha-spring-boot-2-starter. 


Customize Alpha Endpoint in spring boot 1.x
package org.apache.servicecomb.pack.alpha.server.actuate.endpoint;

import org.apache.servicecomb.pack.alpha.core.NodeStatus;
import org.apache.servicecomb.pack.alpha.core.actuate.endpoint.AlphaStatus;
import org.springframework.boot.actuate.endpoint.Endpoint;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;

@ConfigurationProperties(prefix = "endpoints.alpha")
@Component
public class AlphaEndpoint implements Endpoint {

  public static final String END_POINT_ID = "alpha";

  private AlphaStatus alphaStatus = new AlphaStatus();

  @Override
  public String getId() {
    return END_POINT_ID;
  }

  @Override
  public boolean isEnabled() {
    return true;
  }

  @Override
  public boolean isSensitive() {
    return false;
  }

  @Override
  public AlphaStatus invoke() {
    alphaStatus.setNodeType(NodeStatus.TypeEnum.MASTER);
    return alphaStatus;
  }

}


Customize Alpha Endpoint in spring boot 2.x
package org.apache.servicecomb.pack.alpha.server.actuate.endpoint;

import org.apache.servicecomb.pack.alpha.core.NodeStatus;
import org.apache.servicecomb.pack.alpha.core.actuate.endpoint.AlphaStatus;
import org.springframework.boot.actuate.endpoint.annotation.Endpoint;
import org.springframework.boot.actuate.endpoint.annotation.ReadOperation;
import org.springframework.context.annotation.Configuration;


@Configuration
@Endpoint(id = "alpha")
public class AlphaEndPoint {

  private AlphaStatus alphaStatus = new AlphaStatus();

  @ReadOperation
  public AlphaStatus endpoint() {
    alphaStatus.setNodeType(NodeStatus.TypeEnum.MASTER);
    return alphaStatus;
  }
}


Add dependencies in Alpha server,it version same ${spring.boot.version}
<dependency>
  <groupId>org.apache.servicecomb.pack</groupId>
  <artifactId>alpha-spring-boot-starter</artifactId>
  <version>${spring.boot.version}</version>
</dependency>

2. Additional features
Same Actuator Endpoint access path with spring boot 1.x and spring boot 2.x
Customized ActuatorEndpoint compatible spring boot 2.x actuator in spring boot 
1.x, You can access it via http://127.0.0 <http://127.0.0/>.1/actuator/xxx when 
using spring boot 1.x

Define ActuatorEndpoint class
package org.apache.servicecomb.pack.alpha.server.actuate.endpoint;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.actuate.endpoint.Endpoint;
import org.springframework.stereotype.Component;

import java.util.List;

@Component
public class ActuatorEndpoint implements Endpoint<List<Endpoint>> {

  @Autowired
  private List<Endpoint> endpoints;

  @Override
  public String getId() {
    return "actuator";
  }

  @Override
  public boolean isEnabled() {
    return true;
  }

  @Override
  public boolean isSensitive() {
    return false;
  }

  @Override
  public List<Endpoint> invoke() {
    return endpoints;
  }
}
Define ActuatorMvcEndpoint class
package org.apache.servicecomb.pack.alpha.server.actuate.endpoint.mvc;

import 
org.apache.servicecomb.pack.alpha.server.actuate.endpoint.ActuatorEndpoint;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.actuate.endpoint.Endpoint;
import org.springframework.boot.actuate.endpoint.mvc.EndpointMvcAdapter;
import org.springframework.stereotype.Component;
import org.springframework.web.bind.annotation.*;

import java.util.Optional;
import java.util.function.Predicate;
import java.util.function.Supplier;

import static java.util.Optional.ofNullable;

@Component
public class ActuatorMvcEndpoint extends EndpointMvcAdapter {

  private final ActuatorEndpoint delegate;

  @Autowired
  public ActuatorMvcEndpoint(ActuatorEndpoint delegate) {
    super(delegate);
    this.delegate = delegate;
  }

  @RequestMapping(value = "/{endpoint}", method = RequestMethod.GET)
  @ResponseBody
  public Object endpoint(@PathVariable("endpoint") String id, 
@RequestParam(required = false) Boolean enabled,
                         @RequestParam(required = false) Boolean sensitive) {
    Predicate<Endpoint> isEnabled =
            endpoint -> matches(endpoint::isEnabled, ofNullable(enabled));

    Predicate<Endpoint> isSensitive =
            endpoint -> matches(endpoint::isSensitive, ofNullable(sensitive));

    Predicate<Endpoint> matchEndPoint =
            endpoint -> matches(endpoint::getId, ofNullable(id));

    return this.delegate.invoke().stream()
            .filter(matchEndPoint.and(isEnabled.and(isSensitive)))
            .findAny().get().invoke();
  }

  private <T> boolean matches(Supplier<T> supplier, Optional<T> value) {
    return !value.isPresent() || supplier.get().equals(value.get());
  }
}


张 磊
------------------------------------------------
部门: 亿阳信通IT运维支撑产品线
地址: 北京市海淀区杏石口路99号西山赢府商务中心2410 
邮编: 100093
手机: 18610099300
移邮:[email protected] <mailto:[email protected]>

Reply via email to