springcloud-config 客户端启用服务发现client的情况下使用metadata中的username和password

发布于:2024-07-01 ⋅ 阅读:(11) ⋅ 点赞:(0)

为了让spring admin 能正确获取到 spring config的actuator的信息,在eureka的metadata中添加了metadata.user.user metadata.user.password

eureka.instance.metadata-map.user.name=${spring.security.user.name}
eureka.instance.metadata-map.user.password=${spring.security.user.password}

但是其他config client 访问config service的时候依然需要显著的写明 账号,密码。这就不合理,遂断点查看源码,发现确实有相应的机制来提供 替换逻辑,具体代码如下org.springframework.cloud.config.client.DiscoveryClientConfigServiceBootstrapConfiguration.HeartbeatListener#refresh

private void refresh() {
			try {
				String serviceId = this.config.getDiscovery().getServiceId();
				List<String> listOfUrls = new ArrayList<>();
				List<ServiceInstance> serviceInstances = this.instanceProvider
						.getConfigServerInstances(serviceId);

				for (int i = 0; i < serviceInstances.size(); i++) {

					ServiceInstance server = serviceInstances.get(i);
					String url = getHomePage(server);

					if (server.getMetadata().containsKey("password")) {
						String user = server.getMetadata().get("user");
						user = user == null ? "user" : user;
						this.config.setUsername(user);
						String password = server.getMetadata().get("password");
						this.config.setPassword(password);
					}

					if (server.getMetadata().containsKey("configPath")) {
						String path = server.getMetadata().get("configPath");
						if (url.endsWith("/") && path.startsWith("/")) {
							url = url.substring(0, url.length() - 1);
						}
						url = url + path;
					}

					listOfUrls.add(url);
				}

				String[] uri = new String[listOfUrls.size()];
				uri = listOfUrls.toArray(uri);
				this.config.setUri(uri);

			}
			catch (Exception ex) {
				if (this.config.isFailFast()) {
					throw ex;
				}
				else {
					logger.warn("Could not locate configserver via discovery", ex);
				}
			}
		}

可以看到只要metadata中包含password就会启动对应的replace逻辑,但是我配置的metadata中的key值为 user.name user.password 晕死。难道要重复配置两次?按照对应的关键字 metadata 查询官方文档描述如下 discovery-first-bootstrap
在这里插入图片描述
不确定高版本的config client 是否处理过这个问题,不过目前最坏的情况也就是在config server配置中新增两个metadata的属性,回过头再验证下spring admin server是否支持这种识别方式
在这里插入图片描述
果然不行,先配置两种metadata先,后面有空再看看spring admin server是否提供配置指定metadata中使用的字段