You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@servicecomb.apache.org by zh...@boco.com.cn on 2019/01/31 05:40:12 UTC

Spring boot version compatibility issue when using actuator in Alpha

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 <ma...@boco.com.cn>


Re: Spring boot version compatibility issue when using actuator in Alpha

Posted by Willem Jiang <wi...@gmail.com>.
It sounds good to me. Please create a JIRA trace this issue.
Looking forward your PR :)

Willem Jiang

Twitter: willemjiang
Weibo: 姜宁willem

On Fri, Feb 1, 2019 at 10:47 PM zhang_lei@boco.com.cn
<zh...@boco.com.cn> wrote:
>
> Do not worry that the shutdown interface can be enabled by the startup parameter only when the acceptance test
>
> 张 磊
> ------------------------------------------------
> 部门: 亿阳信通IT运维支撑产品线
> 地址: 北京市海淀区杏石口路99号西山赢府商务中心2410
> 邮编: 100093
> 手机: 18610099300
> 移邮:zhang_lei@boco.com.cn
>
> > 在 2019年2月1日,下午2:04,Willem Jiang <wi...@gmail.com> 写道:
> >
> > 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.
>

Re: Spring boot version compatibility issue when using actuator in Alpha

Posted by "zhang_lei@boco.com.cn" <zh...@boco.com.cn>.
Do not worry that the shutdown interface can be enabled by the startup parameter only when the acceptance test

张 磊
------------------------------------------------
部门: 亿阳信通IT运维支撑产品线
地址: 北京市海淀区杏石口路99号西山赢府商务中心2410 
邮编: 100093
手机: 18610099300
移邮:zhang_lei@boco.com.cn

> 在 2019年2月1日,下午2:04,Willem Jiang <wi...@gmail.com> 写道:
> 
> 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.


Re: Spring boot version compatibility issue when using actuator in Alpha

Posted by Willem Jiang <wi...@gmail.com>.
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
<zh...@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 <wi...@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 <zh...@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 <ma...@boco.com.cn>
> >>
>

Re: Spring boot version compatibility issue when using actuator in Alpha

Posted by "zhang_lei@boco.com.cn" <zh...@boco.com.cn>.
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 <wi...@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 <zh...@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 <ma...@boco.com.cn>
>> 


Re: Spring boot version compatibility issue when using actuator in Alpha

Posted by Willem Jiang <wi...@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 <zh...@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 <ma...@boco.com.cn>
>