提问者:小点点

斯普林云库伯内特斯获得自定义Spring. servlet.context路径的网址


我们目前正在使用Spring Boot Admin来监控OpenShift集群内的微服务。
Spring Boot Admin应用程序使用spring-cloud d-starter-kubernetes依赖项从Openshift的服务发现中获取有关服务的信息。

在我们使用自定义server. servlet.context-path部署应用程序之前,一切都很好。

例如,我们的微服务有server. servlet.context-path=/字典。但是,Spring Boot Admin从OpenShift的发现中获得以下信息:

{
    "registration": {
        "name": "dictionary-service",
        "managementUrl": "http://10.130.1.169:8080/actuator",
        "healthUrl": "http://10.130.1.169:8080/actuator/health",
        "serviceUrl": "http://10.130.1.169:8080/",
        "source": "discovery",
        "metadata": {
            "app": "dictionary-service",
            ...
        }
    }
}

因此,Spring Boot Admin期望执行器在"http://10.130.1.169:8080/actuator"上工作,但实际上它在"http://10.130.1.169:8080/dictionary/actuator"上工作

我们如何自定义管理Url和健康Url,以便我们的Spring Boot Admin服务器可以使用正确的URL来监控此服务?


共3个答案

匿名用户

我也遇到了同样的问题。但是用另一个解决方案解决了:

  1. 我更改了Spring Boot Application上的管理端口
management.server.port=8090
server.port=8080

现在管理endpoint(/执行器, /actuator/health)不受server. servlet.context-path的影响。

apiVersion: apps/v1
kind: Deployment
metadata:
  name: app
spec:
  replicas: 1
  template:
    spec:
      containers:
      - name: app
        image: ${docker_image}
        ports:
        - containerPort: 8080
        - containerPort: 8090
kind: Service
apiVersion: v1
metadata:
  name: app-service
spec:
  selector:
    app: app
  ports:
  - protocol: TCP
    port: 8080
    targetPort: 8080
    name: api
  - protocol: TCP
    port: 8090
    targetPort: 8090
    name: management
spring.cloud.kubernetes.discovery.primary-port-name=management

匿名用户

好的,所以我终于解决了它。也许它会对某人有所帮助。

问题中的“注册”对象是在Spring Boot Admin本身中生成的。这是ServiceInstanceConverter接口的可靠性。默认情况下,使用DefaultServiceInstanceConverter实现(您可以在此处阅读更多信息)。

有几个元数据键可以用来修改你的管理Url和健康Url(默认情况下,分别使用“/执行器”和“/执行器/健康”)。

首先,我认为我们可以使用管理. context-path元数据键来附加我们的server.servlet.context-path,但不幸的是,您不能在元数据标签值中使用“/”字符(“字典/执行器”无效),所以在我的情况下这还不够。

相反,我们决定扩展DefaultServiceInstanceConverter并覆盖转换和getManagementPath方法:

@Component
public class OpenShiftServiceInstanceConverter extends DefaultServiceInstanceConverter {

    private static final String MANAGEMENT_CONTEXT_PATH = "/actuator";
    private static final String MANAGEMENT_PREFIX = "management.prefix";

    @Override
    public Registration convert(ServiceInstance instance) {
        return Registration.create(instance.getServiceId(), getHealthUrl(instance).toString())
                .managementUrl(getManagementUrl(instance).toString()).serviceUrl(getServiceUrl(instance).toString())
                .metadata(getMetadata(instance)).build();
    }

    @Override
    protected String getManagementPath(ServiceInstance instance) {
        String managementPath = instance.getMetadata().get(MANAGEMENT_PREFIX);
        if (!isEmpty(managementPath)) {
            return managementPath + MANAGEMENT_CONTEXT_PATH;
        }
        return MANAGEMENT_CONTEXT_PATH;
    }
}

这样,我们就可以在服务模板中包含server. servlet.context-path作为元数据管理.prefix键:

kind: Template
apiVersion: v1
metadata:
  name: dictionary-service
annotations:
  description: Template for Dictionary Service 1.0.0
labels:
  app: dictionary-service
  management.prefix: dictionary
...

现在它像魅力一样工作。

匿名用户

如果您在服务元数据中添加"Management. context-path"注释,这似乎是开箱即用的支持,例如:

apiVersion: v1
kind: Service
metadata:
  name: carts
  annotations:
    management.context-path: /carts/actuator

Spring Boot Admin DefaultServiceInstanceConverter将自动从Spring Cloud Discovery元数据中读取并查找它以设置适当的管理

附言:我没有可以测试的OpenShift集群,但它在本地使用minikube和Amazon EKS集群对我有效。