由浅入深分布式(5)dubbo提供者用内网地址注册provider以及 spring boot admin client用主机名注册spring boot admin server

之前遇到过dubbo提供者用内网地址注册provider的问题 当时改了host文件成功了 但是没有想为什么会有这个问题

现在使用spring boot admin 来监控spring boot项目出现了如下问题, 如果是client和server端 分离,而且不在一台机器上,client会将主机名作为地址注册导致注册失败

要注意服务器之间是可以根据各自的主机名来访问的哦,如果不能访问也应该可以在hosts里设置。。

但是现在遇到了windows下spring boot admin的client注册到linux的server 失败的问题

下面的图显式的是linux的client的注册,道理一样。


直接查spring boot admin clientd 的源代码

/**
 * Scheduler that checks the registration of the application at the spring-boot-admin.
 */
public class SpringBootAdminRegistratorTask implements Runnable {

	private static final Logger LOGGER = LoggerFactory.getLogger(SpringBootAdminRegistratorTask.class);

	@Autowired
	private Environment env;

	@PostConstruct
	public void check() {
		Assert.notNull(env.getProperty("spring.boot.admin.url"),
				"The URL of the spring-boot-admin application is mandatory");
		Assert.notNull(env.getProperty("server.port"), "The server port of the application is mandatory");
		Assert.notNull(env.getProperty("info.id"), "The id of the application is mandatory");
	}

	/**
	 * @see java.lang.Runnable#run()
	 */
	@Override
	public void run() {
		try {
			String id = env.getProperty("info.id");
			int port = env.getProperty("server.port", Integer.class);
			String adminUrl = env.getProperty("spring.boot.admin.url");
			RestTemplate template = new RestTemplate();
			template.getMessageConverters().add(new MappingJackson2HttpMessageConverter());
			ApplicationList list = template.getForObject(adminUrl + "/api/applications", ApplicationList.class);
			for (Application app : list) {
				if (id.equals(app.getId())) {
					// the application is already registered at the admin tool
					LOGGER.debug("Application already registered with ID '{}'", id);
					return;
				}
			}
			// register the application with the used URL and port
			String url = new URL("http", InetAddress.getLocalHost().getCanonicalHostName(), port, "").toString();
			Application app = new Application();
			app.setId(id);
			app.setUrl(url);
			template.postForObject(adminUrl + "/api/applications", app, String.class);
			LOGGER.info("Application registered itself at the admin application with ID '{}' and URL '{}'", id, url);
		} catch (Exception e) {
			LOGGER.warn("Failed to register application at spring-boot-admin, message={}", e.getMessage());
		}
	}

	private static class ApplicationList extends ArrayList<Application> {
		private static final long serialVersionUID = 1L;
	}

}

InetAddress.getLocalHost().getCanonicalHostName() 这行代码有问题,获得的是主机名或者内网ip

修改hosts文件没有用


最后修改注册表

PS C:\Users\BAO> hostname
210.82.98.38

OK

阅读更多
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/kkgbn/article/details/56671442
文章标签: 分布式 监控
上一篇Spring boot(14) 监控spring boot的运行spring boot actuator和spring boot admin
下一篇Spring boot(15) spring boot admin server作为普通工程的时候,无法访问static文件夹下的静态资源
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

关闭
关闭