上一章已經建好了Eureka Server
這是還沒有應用來註冊這時我們新建一個服務提供者 cloud-hello
新建過程不再重複,和創建eureka server的過程一樣。
在啓動類上加@EnableEurekaClient 註解。服務即會想註冊中心註冊。
@EnableEurekaClient
@SpringBootApplication
public class CloudHelloApplication {
public static void main(String[] args) {
SpringApplication.run(CloudHelloApplication.class, args);
}
}
添加一個restfull接口類
@RestController
public class HelloController {
@GetMapping("/hello")
public String helloCloud(){
return "hello cloud";
}
}
添加配置文件 application.yml
server:
port: 8889
spring:
application:
name: hello-service
eureka:
client:
healthcheck:
enabled: true
service-url:
defaultZone: http://localhost:8888/eureka/
instance:
prefer-ip-address: true
instance-id: ${spring.application.name}:${spring.cloud.client.ip-address}:${spring.application.instance_id:${server.port}}
metadata-map:
zone: ABC # eureka可以理解的元數據
lilizhou: BBC # 不會影響客戶端行爲
lease-renewal-interval-in-seconds: 5
eureka.client.healthcheck.enabled = true 開啓Eureka客戶端的健康檢查
eureka.client.service-url.defaultZone 指定客戶端對應的註冊中心服務器的地址
eureka.instance.prefer-ip-address = true 表示註冊到註冊中心的是IP
eureka.instance.instance-id 表示註冊到註冊中心實例的ID規則
eureka.instance.lease-renewal-interval-in-seconds 表示續約更新時間間隔,也就是客戶端健康檢查的心跳時間間隔。
注意 ${spring.cloud.client.ip-address} 需添加
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-commons</artifactId>
</dependency>
可以放到父項目
遇到的坑及解決:服務並沒有像註冊中心註冊
去官網看資料 https://spring.io/projects/spring-cloud-netflix#overview
客戶端只說了使用註解,並沒講用什麼依賴,查的別人的博客都是spring-cloud-starter-netflix-eureka-client
然後服務端是用 @EnableEurekaServer 和依賴 spring-cloud-starter-netflix-eureka-server
最後實驗發現客戶端並不需要 spring-cloud-starter-netflix-eureka-client 依賴,
同樣使用spring-cloud-starter-netflix-eureka-server 依賴配合 @EnableEurekaClient註解即可實現客戶端。
改好依賴後重啓cloud-hello,服務已在註冊中心註冊了。
這樣看來spring-cloud-starter-netflix-eureka-server 這個依賴是所有服務都需要的,可以抽到父項目中。
本地開發小技巧:由於eureka自我保護機制的工作機制是如果在15分鐘內超過85%的客戶端節點都沒有正常的心跳,那麼Eureka就認爲客戶端與註冊中心出現了網絡故障,Eureka Server自動進入自我保護機制。但是由於在本地開發很容易15分鐘內超過85%的客戶端節點心跳正常,如果還保活會造成服務已經關閉了,結果註冊中心狀態還是可用的假象。
這是需要在服務端關閉保活
服務端
eureka:
server:
# 測試時關閉自我保護機制,保證不可用服務及時踢出
enable-self-preservation: false
客戶端:
# 心跳檢測檢測與續約時間
# 測試時將值設置設置小些,保證服務關閉後註冊中心能及時踢出服務
eureka:
instance:
lease-renewal-interval-in-seconds: 1
lease-expiration-duration-in-seconds: 2
#lease-renewal-interval-in-seconds 每間隔1s,向服務端發送一次心跳,證明自己依然”存活“
#lease-expiration-duration-in-seconds 告訴服務端,如果我2s之內沒有給你發心跳,就代表我“死”了,將我踢出掉。
這樣的或服務註冊中心的服務就是實時得了。