spring cloud kubernetes踩坑:Null key for a Map not allowed in JSON

news/2024/7/9 3:57:20

这里是weihubeats,觉得文章不错可以关注公众号小奏技术,文章首发。拒绝营销号,拒绝标题党

背景

最近在做spring cloud kubernetes改造调研,然后在获取服务元数据的时候遇到了这个错误
Null key for a Map not allowed in JSON

项目搭建还原

项目依赖版本

  • spring cloud: 2021.0.4
  • spring cloud kubernetes:spring-cloud-starter-kubernetes-client: 2.1.4

由上面spring cloud 版本管理统一管理,都是最新版本

代码

  1. 先在Application 添加注解@EnableDiscoveryClient开启分布式客户端
@SpringBootApplication
@EnableDiscoveryClient
public class Application {

    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }
}
  1. 编写代码获取服务相关元数据信息
@RestController
@RequestMapping("/service/v1")
@RequiredArgsConstructor
public class ServiceController {

	private final DiscoveryClient discoveryClient;

	@GetMapping("/service")
	public List<String> getServiceList(){
		return discoveryClient.getServices();
	}

	@GetMapping("/instance")
	public Object getInstance(String name){
		List<ServiceInstance> instances = discoveryClient.getInstances(name);
		return instances;
	}
	
}

测试

然后将项目部署到k8s集群中,调用上面的接口

1. 获取服务

调用接口

http://k8s/service/v1/service

这里天自己的k8s域名

然后回发现可以正常返回服务列表

2. 获取服务元数据

我们在调通接口获取服务元数据的时候就出现了上面的报错

http://k8s/service/v1/instance?name=test-service

Null key for a Map not allowed in JSON

问题定位

然后在spring-cloud-kubernetes 中找到了类似的问题

issues链接: https://github.com/spring-cloud/spring-cloud-kubernetes/issues/938

大致的意思是我们在service.yaml中没有定义port的名字导致报错了。
比如原先service.yaml的是

apiVersion: v1
kind: Service
metadata:
  name: my-service
spec:
  selector:
    app.kubernetes.io/name: MyApp
  ports:
    - protocol: TCP
      port: 80
      targetPort: 9376

可以看到我们没有定义port的名字所以我们可能需要加一下port的名字

apiVersion: v1
kind: Service
metadata:
  name: my-service
spec:
  selector:
    app.kubernetes.io/name: MyApp
  ports:
    - protocol: TCP
      port: 80
      name: default-http
      targetPort: 9376

name: default-http

这样就解决了这个bug,那么我其他所有没有定义port name的项目呢,不是都会报错?
所以这里其实是一个bug

源码分析

可以看到这里在获取port name的时候没有默认值处理,所以spring cloud kubernetes 官方维护人员也说这是一个bug,并修复了他

代码是修复了,遗憾的好像还没有发版,中央仓库最新版本还是有这个bug

本地自我修复

比较好的解决方式就是在本地建立一个同包同类名的类,然后自己去修改源码


http://lihuaxi.xjx100.cn/news/117750.html

相关文章

宠物赛道意外火了,行业龙头们相继奔赴IPO

如今&#xff0c;吸猫撸狗、携宠社交正逐渐成为当代年轻人新的生活方式&#xff0c;而能为宠物提供食品、用品、医疗、美容、训练、殡葬、交易等全产业链服务的宠物公司的出现&#xff0c;则大大降低了“铲屎官”养宠物的门槛。于是&#xff0c;随着年轻人喂养宠物逐渐趋于精细…

彻底理解Java并发:volatile关键字

本篇内容包括&#xff1a;volatile 关键字简介、volatile 保证可见性&#xff08;包括&#xff1a;关乎不可见性问题描述、JMM内存模型和不可见性的解决方案&#xff09;以及 volatile 其他特性&#xff08;包括&#xff1a;volatile 不保证原子性、volatile 原子性的保证操作、…

二十一、SpringBoot + Jwt + Vue 权限管理系统 (2)

&#x1f33b;&#x1f33b; 目录一、后台管理界面开发1.1 引入Element-ui布局1.2 修改页面样式1.3 左侧导航菜单填充1.4 拆分抽取Vue组件1.5 编写导航栏的路由二、 用户登录信息展示2.1 用户信息展示2.2 个人中心展示2.3 前端用户退出操作一、后台管理界面开发 1.1 引入Eleme…

ADRC/Matlab一步步实现跟踪微分器TD(附完整PLC测试代码链接)

TD微分器的主要作用:就是安排过渡过程,产生跟踪信号和微分信号,滤除噪声。 关于Adrc的理论分析不是本篇博客的重点,主要也是能力所限,相关理论大家可以看韩京清教授的论文,专栏有简单的学习笔记,感兴趣的同学可以看看,链接如下: ADRC自抗扰的基本框架学习笔记_RXXW_…

deepstream中Gst-nvmsgconv和Gst-nvmsgbroker两个插件的作用和关系

deepstream中Gst-nvmsgconv和Gst-nvmsgbroker两个插件的作用和关系 整体理解:细节讲解: nvmsgconv插件细节讲解:nvmsgbroker插件整体理解: **Gst-nvmsgconv:**是用来将元数据转换为schema ,其中包括两种schema,一种是数据比较全的schema数据,一种是简化的数据。最后转换…

【Spark NLP】第 7 章:分类和回归

&#x1f50e;大家好&#xff0c;我是Sonhhxg_柒&#xff0c;希望你看完之后&#xff0c;能对你有所帮助&#xff0c;不足请指正&#xff01;共同学习交流&#x1f50e; &#x1f4dd;个人主页&#xff0d;Sonhhxg_柒的博客_CSDN博客 &#x1f4c3; &#x1f381;欢迎各位→点赞…

安卓终端神器Termux (后面还有Termux常用的快捷键,妥妥干货分享,记得点赞收藏哦!)

最近在网上找到一款安卓平台的linux终端模拟器&#xff0c;使用pkg(apt)进行软件包管理&#xff0c;最终要的是&#xff0c;他无需root权限&#xff0c;因此市面上大部分安卓平台手机都可以运行。也就是说以后小编不但可以坐着敲代码&#xff0c;还可以敲着代码入睡啦&#xff…

【目标检测】R-CNN论文流程整理

一、引言 两阶段目标检测的开山奠基之作&#xff1b;第一阶段&#xff1a;使用选择性搜索算法&#xff08;Selective Search&#xff09;提取2K的候选框。第二阶段&#xff1a;将候选框缩放到227x227大小&#xff0c;送入CNN提取一个4096维度的特征向量&#xff0c;使用SVM对这…