为了让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中使用的字段