最近在复习spring boot的玩意儿,然后集成eureka高可用的时候遇到点问题,在此记录一下。
最开始spring boot版本从1.4.5.RELEASE到1.5.9然后到最终2.0.3.RELEASE版本,中间各种版本不一致,版本大概对应关系见下面截图。
最开始,eureka准备了3个工程,分别作为eureka的3个节点,但是后来想到spring boot 启动的时候可用指定properties文件,然后就只剩下一个工程了。idea启动配置见下面截图
项目目录结构
pom配置:
org.springframework.boot
spring-boot-starter-parent
2.0.3.RELEASE
4.0.0
org.huangyee
spring-boot-eureka-server
1.0.0-SNAPSHOT
jar
spring-boot-eureka-server
http://www.example.com
UTF-8
1.8
1.8
Finchley.RELEASE
org.springframework.boot
spring-boot-starter-web
org.springframework.boot
spring-boot-starter
org.springframework.cloud
spring-cloud-starter-netflix-eureka-server
junit
junit
4.11
test
org.springframework.cloud
spring-cloud-dependencies
${spring.cloud.version}
pom
import
org.springframework.boot
spring-boot-maven-plugin
properties配置:
spring.application.name=eureka-server
server.port=8002
eureka.instance.hostname=server1
eureka.client.service-url.defaultZone=http://server2:8003/eureka/
#实例注册到服务中心显示ip
eureka.instance.prefer-ip-address=false
##元数据
eureka.instance.metadata-map.instanceId=${spring.application.name}:${spring.cloud.client.ip-address}:${server.port}
#是否作为eureka客户端注册
eureka.client.register-with-eureka=true
#是否检索服务
eureka.client.fetch-registry=true
#客户端缓存更新时间
eureka.client.registry-fetch-interval-seconds=5
这个是server1的配置,server2基本一样,只是server.port跟defaultZone小改一下。
启动类配置:
package org.huangyee;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer;
/**
* Hello world!
*/
@SpringBootApplication
@EnableEurekaServer
public class App {
public static void main(String[] args) {
SpringApplication.run(App.class, args);
}
}
启动之后,访问localhost:8002,显示服务是注册上去了,但是都不可用,见截图
百度找了很多eureka高可用的文章,以及unavailable的博客,都没有解决问题。最后找到一个简书上的文章,解决问题。
链接:https://www.jianshu.com/p/59c54ccc6ba6
我的处理方案是:
eureka.instance.prefer-ip-address=false
简书中提到的是:
解决问题
其他的一些小问题也记录一下:
1
com.sun.jersey.api.client.ClientHandlerException: java.net.UnknownHostException: server1
服务注册的时候是根据域名:端口来注册的,所以这个需要修改hosts文件,
windows的hosts文件在“c:\windows\system32\drivers\etc”中。
Linux更改hosts的操作如下:vim /etc/hosts
mac更改:sudo vim /private/etc/hosts
2 获取客户端ip地址,老版本spring cloud 注解为
spring.cloud.client.ipAddress
新版本已经修改为
spring.cloud.client.ip-address
如果不修改,直接启动的话,会提示 properties文件解析错误,找不到${spring.cloud.client.ipAddress}或者${spring.cloud.client.ip-address},对应修改就行。
3 版本不一致。spring boot跟spring cloud版本对应不上
java.lang.NoSuchMethodError: org.springframework.boot.builder.SpringApplicationBuilder.([Ljava/lang/Object;)V
4 多个注册中心如果依次启动,会出现下面错误,直接略过就好。这是由于需要注册的eureka server还没有启动导致,启动了就好了
[com.netflix.discovery.DiscoveryClient] method:fetchRegistry line:951 - DiscoveryClient_EUREKA-SERVER2/192.168.199.155:eureka-server2:8003 - was unable to refresh its cache! status = Cannot execute request on any known server
com.netflix.discovery.shared.transport.TransportException: Cannot execute request on any known server