Openshift Spring Cloud Kubernetes使用自定义Spring.servlet.context-path获取url

Openshift Spring Cloud Kubernetes使用自定义Spring.servlet.context-path获取url,openshift,spring-boot-admin,spring-cloud-kubernetes,Openshift,Spring Boot Admin,Spring Cloud Kubernetes,我们目前正在使用Spring Boot Admin监控OpenShift集群内的微服务。 Spring引导管理应用程序使用Spring cloud starter kubernetes依赖项从Openshift的服务发现中获取有关服务的信息 在我们使用自定义server.servlet.context-path部署应用程序之前,一切都很好 例如,我们的微服务有server.servlet.context path=/dictionary。但是,Spring Boot Admin从OpenShif

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

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

例如,我们的微服务有server.servlet.context path=/dictionary。但是,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“


我们如何自定义managementUrl和healthUrl,以便我们的Spring Boot管理服务器可以使用正确的URL来监视此服务?

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

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

有几个元数据键可用于修改managementUrl和healthUrl(默认情况下,分别使用“/actuator”和“/actuator/health”)

首先,我认为我们可以使用management.context-path元数据键来追加server.servlet.context-path,但不幸的是,您不能在元数据标签值中使用“/”字符(“dictionary/exactor”无效),所以在我的例子中这是不够的

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

@组件
公共类OpenShiftServiceInstanceConverter扩展了DefaultServiceInstanceConverter{
私有静态最终字符串管理\u上下文\u路径=“/actuator”;
私有静态最终字符串管理\u PREFIX=“MANAGEMENT.PREFIX”;
@凌驾
公共注册转换(ServiceInstance实例){
返回Registration.create(instance.getServiceId()、getHealthUrl(instance.toString())
.managementUrl(getManagementUrl(实例).toString()).serviceUrl(getServiceUrl(实例).toString())
.metadata(getMetadata(实例)).build();
}
@凌驾
受保护的字符串getManagementPath(ServiceInstance实例){
字符串managementPath=instance.getMetadata().get(管理前缀);
如果(!isEmpty(managementPath)){
返回管理路径+管理上下文路径;
}
返回管理\上下文\路径;
}
}
这样,我们就可以将server.servlet.context-path作为元数据管理.prefix键包含在服务模板中:

种类:模板
版本:v1
元数据:
名称:字典服务
注释:
描述:字典服务1.0.0的模板
标签:
应用程序:字典服务
管理前缀:字典
...

现在它就像一个魔咒一样工作。

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

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

有几个元数据键可用于修改managementUrl和healthUrl(默认情况下,分别使用“/actuator”和“/actuator/health”)

首先,我认为我们可以使用management.context-path元数据键来追加server.servlet.context-path,但不幸的是,您不能在元数据标签值中使用“/”字符(“dictionary/exactor”无效),所以在我的例子中这是不够的

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

@组件
公共类OpenShiftServiceInstanceConverter扩展了DefaultServiceInstanceConverter{
私有静态最终字符串管理\u上下文\u路径=“/actuator”;
私有静态最终字符串管理\u PREFIX=“MANAGEMENT.PREFIX”;
@凌驾
公共注册转换(ServiceInstance实例){
返回Registration.create(instance.getServiceId()、getHealthUrl(instance.toString())
.managementUrl(getManagementUrl(实例).toString()).serviceUrl(getServiceUrl(实例).toString())
.metadata(getMetadata(实例)).build();
}
@凌驾
受保护的字符串getManagementPath(ServiceInstance实例){
字符串managementPath=instance.getMetadata().get(管理前缀);
如果(!isEmpty(managementPath)){
返回管理路径+管理上下文路径;
}
返回管理\上下文\路径;
}
}
这样,我们就可以将server.servlet.context-path作为元数据管理.prefix键包含在服务模板中:

种类:模板
版本:v1
元数据:
名称:字典服务
注释:
描述:字典服务1.0.0的模板
标签:
应用程序:字典服务
管理前缀:字典
...

现在它像一个魔咒一样工作。

我也收到了同样的问题。但用另一种解决方案解决:

  • 我更改了Spring引导应用程序上的管理端口
  • 现在,管理端点(/activator,/activator/health)不受“server.servlet.context path”的影响

  • 我打开了k8s部署上的端口
  • 我在我的k8s服务上用名称声明了端口
  • 我说要用Spring Boot管理开关端口名

  • 我也有同样的问题。但用另一种解决方案解决:

  • 我更改了Spring引导应用程序上的管理端口
  • 现在,管理端点(/exactor,/exactor/health)不受“server.servlet.conte”的影响
    management.server.port=8090
    server.port=8080
    
    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