servicecomb-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Willem Jiang <willem.ji...@gmail.com>
Subject Re: Spring boot version compatibility issue when using actuator in Alpha
Date Fri, 01 Feb 2019 06:04:48 GMT
It sounds good to me, please go ahead.
As the start, stop the alpha server is quit important in the
production environment,  we need to make sure the restful management
API is protected in the production model.

Willem Jiang

Twitter: willemjiang
Weibo: 姜宁willem

On Thu, Jan 31, 2019 at 9:43 PM zhang_lei@boco.com.cn
<zhang_lei@boco.com.cn> wrote:
>
> I need to stop the Master node during the acceptance test of the Alpha cluster mode,
It test the slave node can automatically switch to the master status. So I need to know Alpha
state is Master or Slave, I want to use the custom actuator endpoint to implement the Alpha
state query interface.
>
> > My question is how can you tell Alpha which kind of Actuator(Spring
> > Boot 1.x or Spring Boot 2.x) you want to use.
>
> Configured by profile (e.g -Pspring-boot-1 or -Pspring-boot-2 ) when building Alpha Server
>
> 张 磊
> ------------------------------------------------
> 部门: 亿阳信通IT运维支撑产品线
> 地址: 北京市海淀区杏石口路99号西山赢府商务中心2410
> 邮编: 100093
> 手机: 18610099300
> 移邮:zhang_lei@boco.com.cn
>
> > 在 2019年1月31日,下午9:03,Willem Jiang <willem.jiang@gmail.com>
写道:
> >
> > Hi,
> >
> > You don't need to pass all the code here.  You can show your proposal
> > by telling us what you want to do with Actuator.
> > My question is how can you tell Alpha which kind of Actuator(Spring
> > Boot 1.x or Spring Boot 2.x) you want to use.
> >
> > Willem Jiang
> >
> > Twitter: willemjiang
> > Weibo: 姜宁willem
> >
> > On Thu, Jan 31, 2019 at 1:40 PM <zhang_lei@boco.com.cn> wrote:
> >>
> >> 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
> >> 移邮:zhang_lei@boco.com.cn <mailto:zhang_lei@boco.com.cn>
> >>
>

Mime
View raw message