參考博客:https://www.cnblogs.com/ityouknow/p/6854805.htmlhtml
Eureka是Netflix開源的一款提供服務註冊和發現的產品,它提供了完整的Service Registry和Service Discovery實現。也是springcloud體系中最重要最核心的組件之一。java
RPC遠程調用框架的核心設計思想:在於註冊中心,由於註冊中心是管理每一個服務與服務之間的一種依賴關係(服務治理的概念)。spring
什麼是服務治理?apache
服務中心:後端
服務中心又稱註冊中心,管理各類服務功能包括服務的註冊、發現、熔斷、負載、降級等,好比dubbo admin後臺的各類功能。有了服務中心調用關係會有什麼變化,畫幾個簡圖來幫忙理解:瀏覽器
一、項目A調用項目B緩存
正常調用項目A請求項目B:springboot
有了服務中心以後,任何一個服務都不能直接去掉用,都須要經過服務中心來調用:服務器
二、項目A調用項目B,項目B在調用項目C架構
這時候調用的步驟就會爲兩步:第一步,項目A首先從服務中心請求項目B服務器,而後項目B在從服務中心請求項目C服務。
上面的項目只是兩三個相互之間的簡單調用,可是若是項目超過20個30個呢,在15年末的時候我司分佈式的項目就達到了二十幾個,畫一張圖來描述幾十個項目之間的相互調用關係全是線條,任何其中的一個項目改動,就會牽連好幾個項目跟着重啓,巨麻煩並且容易出錯。經過服務中心來獲取服務你不須要關注你調用的項目IP地址,由幾臺服務器組成,每次直接去服務中心獲取可使用的服務去調用既可。
因爲各類服務都註冊到了服務中心,就有了去作不少高級功能條件。好比幾臺服務提供相同服務來作均衡負載;監控服務器調用成功率來作熔斷,移除服務列表中的故障點;監控服務調用時間來對不一樣的服務器設置不一樣的權重等等。
Spring Cloud 封裝了 Netflix 公司開發的 Eureka 模塊來實現服務註冊和發現。Eureka 採用了 C-S 的設計架構。Eureka Server 做爲服務註冊功能的服務器,它是服務註冊中心。而系統中的其餘微服務,使用 Eureka 的客戶端鏈接到 Eureka Server,並維持心跳鏈接。這樣系統的維護人員就能夠經過 Eureka Server 來監控系統中各個微服務是否正常運行。Spring Cloud 的一些其餘模塊(好比Zuul)就能夠經過 Eureka Server 來發現系統中的其餘微服務,並執行相關的邏輯。
Eureka由兩個組件組成:Eureka服務器和Eureka客戶端。Eureka服務器用做服務註冊服務器。Eureka客戶端是一個java客戶端,用來簡化與服務器的交互、做爲輪詢負載均衡器,並提供服務的故障切換支持。Netflix在其生產環境中使用的是另外的客戶端,它提供基於流量、資源利用率以及出錯狀態的加權負載均衡。
上圖簡要描述了Eureka的基本架構,由3個角色組成:
一、Eureka Server
二、Service Provider
三、Service Consumer
Spring Cloud官網的定義比較抽象,咱們能夠從簡單的東西開始。Spring Cloud是基於Spring Boot的, 最適合用於管理Spring Boot建立的各個微服務應用。要管理分佈式環境下的各個Spring Boot微服務,必然存在服務的註冊問題。因此咱們先從服務的註冊談起。既然是註冊,必然有個管理註冊中心的服務器,各個在Spring Cloud管理下的Spring Boot應用就是須要註冊的client。
Spring Cloud使用erureka server, 而後全部須要訪問配置文件的應用都做爲一個erureka client註冊上去。eureka是一個高可用的組件,它沒有後端緩存,每個實例註冊以後須要向註冊中心發送心跳,在默認狀況下erureka server也是一個eureka client ,必需要指定一個 server。
項目架構:
一、 建立Eureka Server
(1)、工程的maven依賴(建立工程時候選中Eureka後,自動關聯)
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.1.2.RELEASE</version> <relativePath/> <!-- lookup parent from repository --> </parent> <groupId>com.dyh</groupId> <artifactId>springcloud_eurekaclient</artifactId> <version>0.0.1-SNAPSHOT</version> <name>springcloud_eurekaclient</name> <description>Demo project for Spring Boot</description> <properties> <java.version>1.8</java.version> <spring-cloud.version>Greenwich.RELEASE</spring-cloud.version> </properties> <dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-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> <repositories> <repository> <id>spring-milestones</id> <name>Spring Milestones</name> <url>https://repo.spring.io/milestone</url> </repository> </repositories> </project>
(2)、啓動一個服務註冊中心,只須要一個註解@EnableEurekaServer,這個註解須要在springboot工程的啓動application類上加:
@EnableEurekaServer @SpringBootApplication public class SpringcloudOneApplication { public static void main(String[] args) { SpringApplication.run(SpringcloudOneApplication.class, args); } }
(3)、eureka是一個高可用的組件,它沒有後端緩存,每個實例註冊以後須要向註冊中心發送心跳(所以能夠在內存中完成),在默認狀況下erureka server也是一個eureka client ,必需要指定一個 server。eureka server的配置文件application.yml
server: port: 8761 eureka: instance: hostname: localhost client: registerWithEureka: false fetchRegistry: false serviceUrl: defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/
配置文件簡介:
register-with-eureka
:表示是否將本身註冊到Eureka Server,默認爲true。fetch-registry
:表示是否從Eureka Server獲取註冊信息,默認爲true。注意:只有上面兩個屬性都設置爲false,才能是Eureka service。
serviceUrl.defaultZone
:設置與Eureka Server交互的地址,查詢服務和註冊服務都須要依賴這個地址。默認是http://localhost:8761/eureka ;多個地址可以使用 , 分隔。 (4)、eureka server 是有界面的,啓動工程,打開瀏覽器訪問:http://localhost:8761,界面以下:因爲尚未註冊服務,因此沒有發現服務。
二、建立Eureka Client(當client向server註冊時,它會提供一些元數據,例如主機和端口,URL,主頁等。Eureka server 從每一個client實例接收心跳消息。 若是心跳超時,則一般將該實例從註冊server中刪除。)
(1)、工程的maven依賴(建立工程後自動生成)
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.1.2.RELEASE</version> <relativePath/> <!-- lookup parent from repository --> </parent> <groupId>com.dyh</groupId> <artifactId>springcloud_eurekaclient</artifactId> <version>0.0.1-SNAPSHOT</version> <name>springcloud_eurekaclient</name> <description>Demo project for Spring Boot</description> <properties> <java.version>1.8</java.version> <spring-cloud.version>Greenwich.RELEASE</spring-cloud.version> </properties> <dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-client</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> <repositories> <repository> <id>spring-milestones</id> <name>Spring Milestones</name> <url>https://repo.spring.io/milestone</url> </repository> </repositories> </project>
(2)、經過註解@EnableEurekaClient 代表本身是一個eurekaclient。
@EnableEurekaClient @SpringBootApplication @RestController public class SpringcloudEurekaclientApplication { public static void main(String[] args) { SpringApplication.run(SpringcloudEurekaclientApplication.class, args); } @Value("${server.port}") String port; @RequestMapping("/hi") public String home(@RequestParam String name) { return "hi "+name+",i am from port:" +port; } }
(3)、僅僅@EnableEurekaClient是不夠的,還須要在配置文件中註明本身的服務註冊中心的地址,application.yml配置文件以下:
注意:須要指明spring.application.name,這個很重要,這在之後的服務與服務之間相互調用通常都是根據這個name 。
eureka: client: serviceUrl: defaultZone: http://localhost:8761/eureka/ server: port: 8762 spring: application: name: service-hi
啓動工程,打開http://localhost:8761 ,即eureka server 的網址:
能夠看到,發現了一個服務註冊到了服務上了(首先這個服務必須是運行的)。
這時打開 http://localhost:8762/hi?name=forezp ,你會在瀏覽器上看到 :
註冊中心這麼關鍵的服務,若是是單點話,遇到故障就是毀滅性的。在一個分佈式系統中,服務註冊中心是最重要的基礎部分,理應隨時處於能夠提供服務的狀態。爲了維持其可用性,使用集羣是很好的解決方案。Eureka經過互相註冊的方式來實現高可用的部署,因此咱們只須要將Eureke Server配置其餘可用的serviceUrl就能實現高可用部署。
一、高可用配置是「你中有我,我中有你」,最重要是配置時候名字必須相同。
二、集羣配置
在註冊過程當中,保證只有一臺註冊中心服務,有對應服務信息數據,當高可用的服務掛掉,對應的服務信息數據,會轉移同步到另外高可用的服務器上。
參考博客:https://www.jianshu.com/p/ee4785a212f6
一下是Server與Client端的配置(關閉自我保護機制,默認是開啓的)