Openshift Spring Cloud Kubernetes使用自定义Spring.servlet.context-path获取url
我们目前正在使用Spring Boot Admin监控OpenShift集群内的微服务。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引导管理应用程序使用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的模板
标签:
应用程序:字典服务
管理前缀:字典
...
现在它像一个魔咒一样工作。我也收到了同样的问题。但用另一种解决方案解决:
我也有同样的问题。但用另一种解决方案解决:
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