1.eureka服務端
服務端代碼
@SpringBootApplication
@EnableEurekaServer
public class Application {
public static void main(String[] args) {
new SpringApplicationBuilder(Application.class).web(true).run(args);
}
}
1.1高可用和域
eureka服務器沒有後端存儲,但註冊的服務實例都有發送心跳保持他們的登記日期(這可以在內存中完成),客戶也有一個內存中的緩存(所以他們不需要爲每一個服務的情況去註冊一次)。默認情況下eureka服務器也是一個eureka客戶端,還需要一個url來定位節點。
1.2單服務模式
application.yml配置如下:
server:
port: 8761
eureka:
instance:
hostname: localhost
client:
registerWithEureka: false
fetchRegistry: false
serviceUrl:
defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/
1.3對等意識
兩個對等的eureka服務配置,application.yml配置如下:
---
spring:
profiles: peer1
eureka:
instance:
hostname: peer1
client:
serviceUrl:
defaultZone: http://peer2/eureka/
---
spring:
profiles: peer2
eureka:
instance:
hostname: peer2
client:
serviceUrl:
defaultZone: http://peer1/eureka/
我們使用上面例子yaml文件的配置運行在兩個相同的服務器上,使用不同的spring profile。你可以使用這個配置在單個服務器測試對等性 。
1.4 使用IP
實例名稱顯示IP配置如下:
eureka.instance.preferIpAddress=true
2.erueka客戶端
eureka是netflix的服務發現服務器和客戶端。eureka是提供服務註冊,爲每個註冊服務提供知曉其他服務狀態的服務。
2.1 eureka客戶端代碼和配置
當一個客戶端註冊到eureka,它會提供關於它自己的端口、地址、健康監控url和home頁面等等的元數據,erueka會從每個實例接受心跳信息。如果心跳在配置的時間內失敗,實例通常會從註冊表中移除。
下面是eureka客戶端代碼:
@SpringBootApplication
@EnableEurekaClient
@RestController
public class Application {
@RequestMapping("/")
public String home() {
return "Hello world";
}
public static void main(String[] args) {
new SpringApplicationBuilder(Application.class).web(true).run(args);
}
}
在這裏使用的是@EnableEurekaClient,這個標註只能用於eureka服務,還可以使用@EnableDiscoveryClient。
此外還需要配置eureka服務器的位置,在application.yml文件配置,配置如下:
eureka:
client:
serviceUrl:
defaultZone: http://localhost:8761/eureka/
2.2 狀態頁面和健康監控
eureka實例的狀態頁面和健康監控默認爲/info和/health,這是spring boot actuator提供的默認終端點。當應用不使用默認的上下文(context path或servlet path,比如配置server.servletPath=/test),或者管理zhongduan路徑(比如配置management.contextPath=/admin)。
application.yml配置文件如下:
eureka:
instance:
statusPageUrlPath: ${management.contextPath}/info
healthCheckUrlPath: ${management.contextPath}/health
2.3eureka的元數據
可以通過eureka.instance.metadataMap修改元數據,這些元數據不會改變客戶端的行爲。
默認情況下一個eureka服務使用主機名稱註冊,那麼只能一個主機一個服務。通過eureka.instance.metadataMap.instanceId你可以修改這個實例ID。application.yml配置如下:
eureka:
instance:
metadataMap:
instanceId: ${spring.application.name}:${random.value}
使用這個配置,多個服務實例可以配置在一個主機上,random.value確保了實例ID的唯一性。當然需要實例的端口不一樣。
2.4 使用DiscoveryClient類
如果你的應用使用@EnableEurekaClient註解,那麼只能使用eureka來發現服務實例。
一個方法是使用com.netflix.discovery.DiscoveryClient
@Autowired
private DiscoveryClient discoveryClient;
public String serviceUrl() {
InstanceInfo instance = discoveryClient.getNextServerFromEureka("STORES", false);
return instance.getHomePageUrl();
}
請不要在@PostConstruct或者@Scheduled方法中使用DiscoveryClient,因爲ApplicationContext也許沒有啓動。
2.5 DiscoveryClient類的替代品
你不必使用原始Netflix DiscoveryClient,通常更方便是使用一個包裝器。spring cloud提供了Feign(一個rest客戶端構建器),spring RestTemplate使用一個eureka服務標示代替物理的URL。用一個組固定的物理服務器配置Ribbon,使用.ribbon.listOfServers配置,用逗號分隔服務器的物理地址或主機名,其中是客戶端的ID。
你也可以使用org.springframework.cloud.client.discovery.DiscoveryClient,不特定於netflix,代碼如下:
@Autowired
private DiscoveryClient discoveryClient;
public String serviceUrl() {
List<ServiceInstance> list = client.getInstances("STORES");
if (list != null && list.size() > 0 ) {
return list.get(0).getUri();
}
return null;
}
2.6註冊服務心跳
註冊服務默認心跳時間爲30秒,當一個服務器不可用,需要3個心跳才能讓服務器和客戶端的元數據相同。可以使用eureka.instance.leaseRenewalIntervalInSeconds加快這個過程。在生產環境最好使用默認配置。