spring cloud:eureka服務發現

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加快這個過程。在生產環境最好使用默認配置。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章