The idea is to reach out and collect actuator management endpoints from all instances of a particular microservice (or probably instances of ALL services).
provided you are using spring boot and having the spring-boot-starter-rsocket and spring-boot-starter-actuator dependencies included,
add the actuator-proxy-client-spring-boot-starter dependency:
<dependency>
    <groupId>io.agilehandy</groupId>
    <artifactId>actuator-proxy-client-spring-boot-starter</artifactId>
    <version>{version}</version>
</dependency>Set also the following properties in your application.yaml or application.properties file to connect to the proxy,
to specify a service name, and to expose proxied endpoints. You can define the exposed list of proxied endpoints to be
the same as the ones that are included via the service's configured actuator.
management:
  rsocket:
    client:
      service-name: ${spring.application.name}
      client-id: 1
      endpoints:
        exposure:
          include: ${management.endpoints.web.exposure.include}
      proxy:
        host: localhost
        port: 7002Another client with a typical setup (with different client-id if has same service-name)
can obtain a collection of the health from all connected clients or from those of a specific
service. To do that you can inject and use the ActuatorProxyClient bean as follows:
@Component
class MyClass {
    private final ActuatorProxyClient proxyClient;
    public MyClass(ActuatorProxyClient proxyClient) {
        this.proxyClient = proxyClient;
    }
    public void readHealth() {
    // create a read operation request object
    ActuatorReadRequest readRequest = new ActuatorReadRequest.Builder()
        .withRoute("actuator.health.read")  // route formed from: baseRoot.endpointId.operation (where baseRoot has a value of actuator)
        .build();
    // use the proxy client to read connected actuator health
    proxyClient.read(readRequest)
        .doOnNext(System.out::println)
        .subscribe(); 
    }
   
}Beside the reading request domain object ActuatorReadRequest, there are also ActuatorWriteRequest and ActuatorDeleteRequest domain objects
by which you can perform proxied write and delete operations respectively on connected clients. All these request domain objects
can include operation parameters as needed.
The output result from each obtained proxied actuator endpoint includes the ID of each client. For example, the output of the snippet above (with breviy) would look like:
[
   {
      "clientName":"sample-proxy-client",
      "clientId":1,
      "actuator":{
         "status":"UP"
      }
   },
   {
      "clientName":"sample-proxy-client",
      "clientId":2,
      "actuator":{
         "status":"UP"
      }
   }
]The client would automatically map routes to exposed actuator endpoints. You can log out and view all mapped routes to actuator
endpoints by setting logging.level.io.agilehandy.actuator.rsocket.client=DEBUG in your properties file.
An endpoint route takes a form of: baseRoot.endpointId.operation.[parameter-name *]
where the baseRoot defaults to actuator value.
For example:
- to read a client health the route would look like 
actuator.health.read - to read a client health by a parameter path 
name, the route would look like:actuator.health.read.name. The parameter name and value would be passed via a request object. 
A sub-module sample sample-proxy-client is provided to see a client in action.
Use the published docker image haybu/spring-actuator-rsocket-proxy:v0  to run the RSocket Actuator Proxy.
A shell script ./scripts/spring-actuator-rsocket-proxy.sh is provided to run the proxy.
The proxy would run on port 7002.
- Write and delete operations.
 - Parameterized operations.
 
