什么是Eureka?
??Eureka是一個服務(wù)發(fā)現(xiàn)組件。所謂的服務(wù)發(fā)現(xiàn)就是將服務(wù)的調(diào)用者和被調(diào)用者者,都注冊到一個第三方應(yīng)用上。調(diào)用者在調(diào)用服務(wù)時可以清楚的知道被調(diào)用服務(wù)的狀態(tài)。如果大家用過ZooKeeper就能很好的理解服務(wù)發(fā)現(xiàn)的原理。Eureka也如ZooKepper一般由service和client兩部分組成。
Eureka-Clients
添加依賴
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.5.13.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>1.8</java.version>
<spring-cloud.version>Edgware.SR3</spring-cloud.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-eureka</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>${spring-cloud.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
Client端代碼
@RestController //Spring-Boot
@EnableEurekaClient //EurekaClient
@SpringBootApplication
public class EurekaClientApplication {
@RequestMapping("/")
public String home() {
return "Hello world";
}
public static void main(String[] args) {
SpringApplication.run(EurekaClientApplication.class, args);
}
}
????我們在上述代碼上用了@EnableEurekaClient這個注解,在Spring-Cloud除了這個注解還可以用@EnableDiscoveryClient。那么這兩個注解有啥區(qū)別呢?@EnableEurekaClient表明這個是EurekaClient,@EnableDiscoveryClient則是標(biāo)記一個服務(wù)發(fā)現(xiàn)客戶端。這個可戶端可以是ZK-Client,也可以EurekaClient
。
application配置
server:
</br>
??port: 8080
</br>
spring:
</br>
??application:
</br>
????name: eureka-client-one #建議小寫,eureka默認(rèn)注冊節(jié)點是會將應(yīng)用名稱大寫。
</br>
eureka:
</br>
??client:
</br>
????serviceUrl:
</br>
??????defaultZone: http://localhost:8761/eureka
啟動效果

Eureka-Service
添加依賴
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.5.13.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>1.8</java.version>
<spring-cloud.version>Dalston.SR5</spring-cloud.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-eureka-server</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>${spring-cloud.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
服務(wù)端代碼
@EnableEurekaServer //EurekaServer
@SpringBootApplication
public class EurekaServiceApplication {
public static void main(String[] args) {
SpringApplication.run(EurekaServiceApplication.class, args);
}
}
配置文件
server:
??port: 8761
eureka:
??instance:
??#實例主機名#
????hostname: localhost
??client:
????#是否需要多機拷貝#
????register-with-eureka: false
????fetch-registry: false
????#本機服務(wù)地址#
????service-url:
??????defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/
啟動后效果

重要參數(shù)解釋

修改Instance-ID
????我們在看上面實例狀態(tài)時,狀態(tài)欄給出的默認(rèn)Instance-ID信息不是特別直觀,我們有什么方式可以改呢?
eureka:
</br>??instance:
</br>????#開啟地址顯示
</br>????prefer-ip-address: true
</br>????instanceId:${spring.application.name}:${vcap.application.instance_id:${spring.application.instance_id:${random.value}}}
#此修改要在Eureka-Client上修改
</br>
????默認(rèn)定義:

</br>
????修改后效果:

Eureka開啟安全驗證和健康檢查
安全驗證
添加依賴
<!--添加在Eureka-Server-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>
????注意!如果不添加依賴直接進(jìn)行配置項目啟動時不報錯的。
配置文件
security:
</br>??#開啟eureka權(quán)限控制
</br>??basic:
</br>????enabled: true
</br>??#設(shè)定訪問用戶和密碼
</br>??user:
</br>????name: user
</br>????password: Pass123456
</br>#在Eureka-Server配置
注意!改完上述配置后Server和Client的下述配置都需要修改:
eureka:
</br>??client:
</br>????service-url:
</br>??????#此種風(fēng)格是CURL的配置模式
</br>??????defaultZone: http://user:Pass123456@localhost:8761/eureka
配置效果

健康檢查配置
添加依賴
<!--添加在Eureka-Client-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
添加配置
eureka:
</br>??client:
</br>????healthcheck:
</br>??????enabled: true
注意事項
????老版本的Spring-Cloud配置完以上的就可以,訪問一些healthcheck的接口了。如果你訪問/env等路路徑出現(xiàn):

需要做以下配置:
management:
</br>??security:
</br>????enabled: false
配置效果

其他相關(guān)配置
剔除過期等不健康實例(生產(chǎn)環(huán)境不建議使用)
</br>服務(wù)端:
??#關(guān)閉注冊中心自我保護(hù)機制
</br>??eureka:
</br>????server:
</br>??????enable-self-preservation:false
</br>??#注冊中心清理間隔(單位毫秒,默認(rèn)60*1000)
</br>??eureka:
</br>????server:
</br>??????eviction-interval-timer-in-ms:10000
</br>客戶端:
??#租期更新時間間隔(默認(rèn)30秒)
</br>??eureka:
</br>????instance:
</br>??????lease-renewal-interval-in-seconds=10
</br>??#租期到期時間(默認(rèn)90秒)
</br>??eureka:
</br>????instance:
</br>??????lease-expiration-duration-in-seconds=15
Eureka的自我保護(hù)模式
????如果在Eureka Server的首頁看到以下這段提示,則說明Eureka已經(jīng)進(jìn)入了保護(hù)模式:
EMERGENCY! EUREKA MAY BE INCORRECTLY CLAIMING INSTANCES ARE UP WHEN THEY'RE NOT. RENEWALS ARE LESSER THAN THRESHOLD AND HENCE THE INSTANCES ARE NOT BEING EXPIRED JUST TO BE SAFE.
????一般出現(xiàn)此模式時,服務(wù)返回錯誤。即如果真實的服務(wù)已經(jīng)Down掉,但在注冊中心界面服務(wù)卻一直存在,且顯示為UP狀態(tài)。
產(chǎn)生原因
Eureka Server在運行期間,會統(tǒng)計心跳失敗的比例在15分鐘之內(nèi)是否低于85%,如果出現(xiàn)低于的情況(在單機調(diào)試的時候很容易滿足,實際在生產(chǎn)環(huán)境上通常是由于網(wǎng)絡(luò)不穩(wěn)定導(dǎo)致),Eureka Server會將當(dāng)前的實例注冊信息保護(hù)起來,同時提示這個警告。保護(hù)模式主要用于一組客戶端和Eureka Server之間存在網(wǎng)絡(luò)分區(qū)場景下的保護(hù)。一旦進(jìn)入保護(hù)模式,Eureka Server將會嘗試保護(hù)其服務(wù)注冊表中的信息,不再刪除服務(wù)注冊表中的數(shù)據(jù)(也就是不會注銷任何微服務(wù))。
EurekaClient端代碼獲取實例信息
@Autowired
private EurekaClient discoveryClient;
public String serviceUrl() {
InstanceInfo instance = discoveryClient.getNextServerFromEureka("STORES", false);
return instance.getHomePageUrl();
}
Netflix-EurekaClient端代碼獲取實例信息
@Autowired
private EurekaClient discoveryClient;
public String serviceUrl() {
InstanceInfo instance = discoveryClient.getNextServerFromEureka("STORES", false);
return instance.getHomePageUrl();
}
不要在@PostConstruct方法或@Scheduled方法中(或ApplicationContext可能尚未啟動的任何地方)使用EurekaClient。
客戶端常用配置,均以eureka.client為前綴####
<table>
<thead>
<tr>
<th>參數(shù)名</th>
<th>說明</th>
<th>默認(rèn)值</th>
</tr>
</thead>
<tbody><tr>
<td>enabled</td>
<td>啟用Eureka客戶端</td>
<td>true</td>
</tr>
<tr>
<td>registryFetchIntervalSeconds</td>
<td>從Eureka服務(wù)端獲取注冊信息的間隔時間,單位為秒</td>
<td>30</td>
</tr>
<tr>
<td>instanceInfoReplicationIntervalSeconds</td>
<td>更新實例信息的變化到Eureka服務(wù)端的間隔時間,單位為秒</td>
<td>30</td>
</tr>
<tr>
<td>initialInstanceInfoReplicationIntervalSeconds</td>
<td>初始化實例信息到Eureka服務(wù)端的間隔時間,單位為秒</td>
<td>40</td>
</tr>
<tr>
<td>eurekaServiceUrlPollIntervalSeconds</td>
<td>輪詢Eureka服務(wù)端地址更改的間隔時間,單位為秒。當(dāng)我們與Spring CLoud Config整合,動態(tài)刷新Eureka的serviceURL地址時需要關(guān)注該參數(shù)</td>
<td>300</td>
</tr>
<tr>
<td>eurekaServerReadTimeoutSeconds</td>
<td>讀取Eureka Server信息的超時時間,單位為秒</td>
<td>8</td>
</tr>
<tr>
<td>eurekaServerConnectTimeoutSeconds</td>
<td>鏈接Eureka Server的超時時間,單位為秒</td>
<td>5</td>
</tr>
<tr>
<td>eurekaServerTotalConnections</td>
<td>從Eureka客戶端到所有Eureka服務(wù)端的連接總數(shù)</td>
<td>200</td>
</tr>
<tr>
<td>eurekaServerTotalConnectionsPerHost</td>
<td>從Eureka客戶端到每個Eureka服務(wù)端主機的連接總數(shù)</td>
<td>50</td>
</tr>
<tr>
<td>eurekaConnectionIdleTimeoutSeconds</td>
<td>Eureka服務(wù)端連接的空閑關(guān)閉時間,單位為秒</td>
<td>30</td>
</tr>
<tr>
<td>heartbeatExecutorThreadPoolSize</td>
<td>心跳連接池的初始化線程數(shù)</td>
<td>2</td>
</tr>
<tr>
<td>heartbeatExecutorExponentialBackOffBound</td>
<td>心跳超時重試延遲時間的最大乘數(shù)值</td>
<td>10</td>
</tr>
<tr>
<td>cacheRefreshExecutorThreadPoolSize</td>
<td>緩存刷新線程池的初始化線程數(shù)</td>
<td>2</td>
</tr>
<tr>
<td>cacheRefreshExecutorExponentialBackOffBound</td>
<td>緩存刷新重試延遲時間的最大乘數(shù)值</td>
<td>10</td>
</tr>
<tr>
<td>useDnsForFetchingServiceUrls</td>
<td>使用DNS來獲取Eureka服務(wù)端的serviceUrl</td>
<td>false</td>
</tr>
<tr>
<td>registerWithEureka</td>
<td>是否要將自身的實例信息注冊到Eureka服務(wù)端 true</td>
<td></td>
</tr>
<tr>
<td>preferSameZoneEureka</td>
<td>是否偏好使用處于相同Zone的Eureka服務(wù)端 true</td>
<td></td>
</tr>
<tr>
<td>filterOnlyUpInstances</td>
<td>獲取實例時是否過濾,僅保留UP狀態(tài)的實例</td>
<td>true</td>
</tr>
<tr>
<td>fetchRegistry</td>
<td>是否從Eureka服務(wù)端獲取注冊信息</td>
<td>true</td>
</tr>
<tr>
<td>serviceUrl</td>
<td>指定注冊中心</td>
<td>http://:@localhost:1111/eureka</td>
</tr>
</tbody></table>
????本文參考:Spring-Cloud-Eureka-DOC
,springboot-actuator監(jiān)控的401,Eureka客戶端服務(wù)端配置