一、Eureka服務注冊與發現
(1)Eureka是什么?
Eureka是NetFlix的一個子模塊,也是核心模塊之一。Eureka是一個基於REST的服務,用於定位服務,以實現雲端中間層服務發現和故障轉移。服務注冊與發現對於微服務架構來說是非常重要的,有了服務發現與注冊,只需要使用服務的標識符,就可以訪問到服務,而不需要修改服務調用的配置文件了。功能類似於dubbo的注冊中心,比如Zookeeper
Eureka采用C-S的設計架構,Eureka Server作為服務注冊功能的服務器,它是服務注冊中心。
系統中的其他微服務,使用Eureka的客戶端連接到Eureka Server並維持心跳連接。這樣系統的維護人員就可以通過Eureka Server來監控系統中各個微服務是否正常運行。SpringCloud的一些其他模塊(比如Zuul)就可以通過Eureka Server來發現系統中的其他微服務,並執行相關的邏輯。
(2)Eureka的三大功能
①Eureka Server:提供服務注冊和發現
②Service Provider:服務提供方將自身服務注冊到Eureka,從而使服務消費方能夠找到
③Service Consumer:服務消費方從Eureka獲取注冊服務列表,從而消費服務
二、Eureka-Server構建
本工程代碼已上傳至Github:https://github.com/Simple-Coder/microservice-demo-study
使用工具:IDEA2018.2、Maven 3.6.1、JDK1.8
(1)Maven工程結構
(2)Eureka-pom文件

<dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-eureka-server</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-web</artifactId> </dependency> </dependencies>
(3)Eureka-application.yml屬性配置如下:

server:
port: 8001
spring:
application:
name: microservice-eureka
eureka:
instance:
hostname: localhost #eureka服務端實例名稱
client:
register-with-eureka: false #false表示不向注冊中心注冊自己
fetch-registry: false #false表示自己端就是注冊中心,我的職責就是維護服務實例,並不需要去檢索服務
service-url:
defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/ #設置與Eureka Server交互的地址查詢服務和注冊服務
server:
enable-self-preservation: false #禁用自我保護模式
(4)Eureka啟動類

@SpringBootApplication
@Slf4j
@EnableEurekaServer
public class Application {
public static void main(String[] args) {
try {
SpringApplication.run(ApplicationBoot.class, args);
} catch (Throwable t) {
log.error("啟動失敗", t);
throw t;
}
}
}
(5)瀏覽器訪問:localhost:8001
至此,Eureka-Server已經構建完成!
三、Eureka客戶端構建
(1)Maven工程結構
(2)miscroservice-provider-pom文件

<dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-eureka</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-actuator</artifactId> </dependency> </dependencies>
(3)micro-service-provider-application.yml文件

server:
port: 9001
spring:
application:
name: microservice-provider-test
eureka:
client:
service-url:
defaultZone: http://localhost:8001/eureka/
instance:
instance-id: microservice-provider9001 #自定義服務名稱信息
prefer-ip-address: true #訪問路徑可以顯示IP地址
info:
app.name: microservice-privder-9001
company.name: www.baidu.com
build.artifactId: $project.artifactId$
build.version: $project.version$
(4)測試Controller

@RestController
public class HelloWorldController {
@Value("${server.port}")
String port;
@RequestMapping("/hello")
public String home(String name)
{
return "hi " + name + ",i am from port:" + port;
}
}
(5)啟動類

@SpringBootApplication
@Slf4j
@EnableEurekaClient
public class Application {
public static void main(String[] args) {
try {
SpringApplication.run(ApplicationBoot.class, args);
} catch (Throwable t) {
log.error("啟動失敗", t);
throw t;
}
}
}
(6)測試:先啟動Eureka-Server,再啟動Provider,瀏覽器訪問:localhost:8001
(7)測試controller:瀏覽器訪問:localhost:9001/hello?name=zhangsan
至此,Provider已經搭建完成!
四、服務發現
(1)Maven工程結構
注入服務發現,並暴露地址訪問,如下:
(2)microservice-consumer測試
(3)瀏覽器訪問:http://localhost:7001/consumer/hello/discover
服務發現測試成功!
五、Eureka的集群模式(3個節點)
(1)Maven的工程結構
(2)application.yml文件配置(3個節點)
microservice-eureka:application.yml(端口8001)
server:
port: 8001 #服務端口號
eureka:
client:
service-url:
#相互注冊,組成一個集群,實現高可用
defaultZone: http://eureka8002:8002/eureka/,http://eureka8003:8003/eureka/
instance:
#主機名
hostname: eureka8001
spring:
application:
#服務名稱
name: eureka-availability-server
microservice-eureka8002:application.yml(端口8002)
#集群模式Eureka
server:
port: 8002 #服務端口號
eureka:
client:
service-url:
#相互注冊,組成一個集群,實現高可用
defaultZone: http://eureka8001:8001/eureka/,http://eureka8003:8003/eureka/
instance:
#主機名
hostname: eureka8002
spring:
application:
#服務名稱
name: eureka-availability-server
microservice-eureka8003:application.yml(端口8003)
server:
port: 8003 #服務端口號
eureka:
client:
service-url:
#相互注冊,組成一個集群,實現高可用
defaultZone: http://eureka8001:8001/eureka/,http://eureka8002:8002/eureka/
instance:
#主機名
hostname: eureka8003
spring:
application:
#服務名稱
name: eureka-availability-server
(3)Eureka-Client的application.yml配置
server:
port: 9001
spring:
application:
name: microservice-provider-test
eureka:
client:
service-url:
defaultZone: http://eureka8001:8001/eureka/,http://eureka8002:8002/eureka/,http://eureka8003:8003/eureka/
instance:
instance-id: microservice-provider9001 #自定義服務名稱信息
prefer-ip-address: true #訪問路徑可以顯示IP地址
info:
app.name: microservice-privder-9001
company.name: www.baidu.com
build.artifactId: $project.artifactId$
build.version: $project.version$
(4)配置本地hosts文件:C:\Windows\System32\drivers\etc
(5)測試:依次啟動eureka-server8001、eureka-server8002、eureka-server8003、provider
瀏覽器訪問:eureka8001:8001,出現以下紅框內容說明測試成功!
同樣,分別訪問eureka8002:8002、eureka8003:8003,如下圖所示,說明Eureka的高可用集群搭建完成!
至此,Eureka的高可用集群搭建完成(3個節點)搭建完成,是不是學習起來很簡單呢?代碼的世界真好玩!
六、Actuator與注冊微服務信息完善
(1)添加pom依賴

<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-actuator</artifactId> </dependency>
(2)主機名稱:服務名稱修改
eureka.instance. instance-id: emp-provide #自定義服務名稱信息
(3)訪問信息有IP信息提示
eureka.client. instance.prefer-ip-address: true #訪問路徑可以顯示IP地址
(4)微服務info內容詳細信息
修改application.yml即可,訪問瀏覽器:localhost:8001
七、Eureka的自我保護機制
默認情況下,如果EurekaServer在一定的時間內沒有接收到某個微服務實例的心跳,EurekaServer將會注銷該實例(默認90s),但是當網絡分區故障發生時,微服務與EurekaServer之間無法正常通信,以上行為可能變得非常危險了-----因為微服務本身其實是健康的,此時本不應該注銷這個微服務。Eureka通過“自我保護機制”來解決這個問題-----當EurekaServer節點在短時間內丟失過多客戶端時(可能發生網絡分區故障),那么這個節點就會進入自我保護模式。一旦進入該模式,EurekaServer就會保護服務注冊表中的信息,不再刪除服務注冊表中的信息(也就是不會注銷任何微服務)。當網絡故障恢復后,該EurekaServer節點會自動退出自我保護模式。
在自我保護模式中,Eureka Server會保護服務注冊表中的信息,不再注銷任何服務實例。當它收到的心跳數重新恢復到閾值以上時,該Eureka Server節點就會退出自我保護模式。它的設計哲學就是寧可保留錯誤的服務注冊信息,也不盲目注銷任何可能健康的服務實例。
綜上,自我保護模式是一種應對網絡異常的安全保護措施。它的架構哲學是寧可同時保留所有微服務(健康的微服務和不健康的微服務都會保留),也不盲目注銷任何可能健康的微服務實例。使用自我保護模式,可以讓Eureka集群更加的健壯和穩定。
一句話概括:某一時刻某一個微服務不可用了,eureka不會立刻清理,依舊會對該微服務的信息進行保存
在Spring Cloud中,可以使用eureka.server.enable-self-preservation = false 禁用自我保護模式
八、總結
至此,以上是關於SpringCloud的HelloWorld入門學習。期間也遇到很多問題如下
(1)如圖,出現紅色警告
解決方案:編輯Eureka Server模塊的application.yml添加如下配置:
至此,Spring Cloud入門學習之HelloWorld已經搭建完成!