聲明:入門級(jí)文檔,更多內(nèi)容會(huì)持續(xù)更新,不足之處,望不吝指點(diǎn)
一、服務(wù)(注冊(cè))中心
- 依賴
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>
- 啟用當(dāng)前應(yīng)用為Eureka服務(wù)中心
@EnableEurekaServer
@EnableEurekaServer
@SpringBootApplication
public class ServiceRegistryAndDiscoverServerEndApplication {
public static void main(String[] args) {
SpringApplication.run(ServiceRegistryAndDiscoverServerEndApplication.class, args);
}
}
- 配置
#不向注冊(cè)中心注冊(cè)自己
eureka.client.register-with-eureka=false
#注冊(cè)中心本身不需要拉去服務(wù)列表
eureka.client.fetch-registry=false
- 額外-心跳機(jī)制與保護(hù)模式
Eureka通過設(shè)置心跳機(jī)制來判斷注冊(cè)的服務(wù)是否還存在,Renews threshold值表示一分鐘應(yīng)當(dāng)收到的心跳數(shù),Renews (last min)表示上一分鐘實(shí)際收到的心跳數(shù),如果實(shí)際收到的心跳數(shù)小于閾值,則Eureka認(rèn)為是網(wǎng)絡(luò)出現(xiàn)了波動(dòng),此時(shí)Eureka將會(huì)開啟保護(hù)模式,保護(hù)模式期間所有的服務(wù)信息將不會(huì)被刪除,不論該服務(wù)是否真的不可用了。如果實(shí)際心跳數(shù)高于閾值,但某個(gè)服務(wù)在一定時(shí)間內(nèi)還是沒有發(fā)來心跳數(shù)據(jù),則Eureka將該服務(wù)注銷。這一塊涉及的配置有
#是否開啟保護(hù)模式
eureka.server.enableSelfPreservation = true
#設(shè)置應(yīng)收心跳數(shù)與實(shí)際心跳數(shù)的比值,其實(shí)就是根據(jù)理論實(shí)際心跳數(shù)來設(shè)置閾值
eureka.server.renewal-percent-threshold=0.85
#設(shè)置Eureka清理無效服務(wù)的間隔
eureka.server.eviction-interval-timer-in-ms=60000
- 額外-敏感界面加密
默認(rèn)情況下,Eureka的服務(wù)中心是可以直接在瀏覽器上訪問的,為了將該界面加密,可以引入spring security為其加密,具體步驟如下:- 依賴
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-security</artifactId> </dependency>- 配置
spring.security.user.name=username spring.security.user.password=password- 開啟
WebSecurity
@SpringBootApplication @EnableEurekaServer @EnableWebSecurity public class ServiceRegistryAndDiscoverServerEndApplication { public static void main(String[] args) { SpringApplication.run(ServiceRegistryAndDiscoverServerEndApplication.class, args); } @Bean public WebSecurityConfigurerAdapter webSecurityConfiguration(){ return new WebSecurityConfigurerAdapter() { @Override public void configure(HttpSecurity http) throws Exception { //關(guān)閉csrf防護(hù),避免其他服務(wù)無法訪問服務(wù)中心 http.csrf().disable(); http.authorizeRequests().anyRequest().authenticated().and().formLogin().and().httpBasic(); } }; } }-
實(shí)際效果
spring-security-login.PNG
- 額外-Eureka狀態(tài)監(jiān)聽器
Eureka提供了一些列事件來滿足對(duì)特定事件監(jiān)聽的需求,比如注冊(cè)中心的啟動(dòng),服務(wù)的上線與下線等等。- EurekaInstanceCanceledEvent --- 服務(wù)下線事件
- EurekaInstanceRegisteredEvent --- 服務(wù)注冊(cè)事件
- EurekaInstanceRenewedEvent --- 服務(wù)續(xù)約事件
- EurekaRegistryAvailableEvent Eureka --- 注冊(cè)中心啟動(dòng)事件
- EurekaServerStartedEvent ---
Eureka Server啟動(dòng)事件
@EventListener
public void listen(EurekaRegistryAvailableEvent event){
System.out.println("注冊(cè)中心啟動(dòng)");
}
二、客戶端(服務(wù))
- 依賴
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
- 啟動(dòng)當(dāng)前應(yīng)用為Eureka客戶端(服務(wù))
@SpringBootApplication
@EnableEurekaClient
public class ServiceRegistryAndDiscoverApplication {
public static void main(String[] args) {
SpringApplication.run(ServiceRegistryAndDiscoverApplication.class, args);
}
}
- 配置
# 應(yīng)用(服務(wù))的名字
spring.application.name=server-client-1
#Eureka 注冊(cè)中心的地址
eureka.client.service-url.defaultZone=http://username:password@localhost:8761/eureka/
實(shí)際上注冊(cè)中心的配置是
eureka.client.service-url,defaultZone不過是個(gè)鍵名罷了
- 額外-使用ip地址進(jìn)行服務(wù)的注冊(cè)
開啟該配置后Eureka將會(huì)使用ip地址來注冊(cè)該服務(wù),而不是使用主機(jī)名來注冊(cè)
eureka.instance.prefer-ip-address=true
- 額外-設(shè)置服務(wù)的實(shí)例id顯示格式
eureka.instance.instance-id=${spring.application.name}:${spring.cloud.client.ip-address}:${server.port}
- 額外-心跳相關(guān)設(shè)置
#每隔多少秒發(fā)送一次心跳信息
eureka.instance.lease-renewal-interval-in-seconds=30
#自上次發(fā)送心跳數(shù)據(jù)后,多少秒后未接到該服務(wù)的心跳數(shù)據(jù),可以認(rèn)為該服務(wù)下線并可以進(jìn)行刪除
eureka.instance.lease-expiration-duration-in-seconds=90
#是否啟用/actuator/health來進(jìn)行服務(wù)的健康檢查而不是使用心跳數(shù)據(jù)
eureka.client.healthcheck.enabled=false
- 額外-使用安全的https協(xié)議來進(jìn)行與Eureka之間的交互
eureka.instance.non-secure-port-enabled=false
eureka.instance.secure-port-enabled=true
- 額外-使用
RestTemplate而不是Jersey來進(jìn)行Rest服務(wù)的訪問
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
<exclusions>
<exclusion>
<groupId>com.sun.jersey</groupId>
<artifactId>jersey-client</artifactId>
</exclusion>
<exclusion>
<groupId>com.sun.jersey</groupId>
<artifactId>jersey-core</artifactId>
</exclusion>
<exclusion>
<groupId>com.sun.jersey.contribs</groupId>
<artifactId>jersey-apache-client4</artifactId>
</exclusion>
</exclusions>
</dependency>
- 額外-客戶端配置刷新機(jī)制
Eureka Client會(huì)定時(shí)進(jìn)行配置的檢查并刷新,當(dāng)刷新行為發(fā)生時(shí),將會(huì)導(dǎo)致服務(wù)暫時(shí)的不可用??梢酝ㄟ^下列配置來關(guān)閉該功能
eureka.client.refresh.enable=false
- 額外-配置服務(wù)的狀態(tài)和健康信息頁面(如果你沒有使用
actuator的話)
#配置服務(wù)的狀態(tài)信息頁面,第一個(gè)是絕對(duì)路徑,第二個(gè)是相對(duì)路徑
#eureka.instance.status-page-url
eureka.instance.status-page-url-path=${server.servletPath}/info
#配置服務(wù)的健康信息頁面,第一個(gè)是絕對(duì)路徑,第二個(gè)是相對(duì)路徑
#eureka.instance.health-check-url
eureka.instance.health-check-url-path=${server.servletPath}/health
- 額外-使用
DiscoveryClient(org.springframework.cloud.client.discovery.DiscoveryClient)類來手動(dòng)拉去服務(wù)中心的服務(wù)信息-
DiscoveryClient#getServices拉去服務(wù)中心的服務(wù)名列表 -
DiscoveryClient#getInstances獲取指定服務(wù)的服務(wù)實(shí)例對(duì)象
List<ServiceInstance> list = discoveryClient.getInstances(instanceId); -
參考文檔:
[1] Spring Cloud Netflix