Spring Cloud Eureka是Spring Cloud Netflix微服務中的一部分,它基於NetFlix Sureka作了二次封裝,主要負責完成微服務架構中的服務治理功能。java
服務治理是微服務架構中最爲核心和基礎的模塊。它主要用來實現各個微服務實例的自動化註冊與發現。web
爲了解決微服務架構中的服務實例維護問題,產生了大量的服務治理框架和產品,這下框架和產品的實現都圍繞着服務註冊與服務發現機制來完成對微服務應用實例的自動化管理。spring
在服務治理框架中,一般都會構建一個註冊中心,每一個服務單元向註冊中心登記本身提供的服務,將主機與端口號、版本號、通訊協議等一些附加信息告知註冊中心,註冊中心按服務名分類組織服務清單。好比,咱們有兩個提供服務A的進程分別用於192.168.0.100:8080和192.168.1.101:8080位置上,另外還有三個提供服務B的進程分別運行於192.168.0.100:9090、192.168.0.101:9090、192.168.0.102:9090位置上,當這些線程均啓動、並向註冊中心註冊本身的服務以後,註冊中會就會維護類型以下非服務清單。另外,服務註冊中心還須要以心跳的方式去監測清單中的服務是否可用,若不可用須要從服務清單中剔除,達到排除故障服務的效果。apache
因爲在服務治理框架下運做,服務間的調用再也不須要經過指定具體的實例地址來實現,而是經過向服務名發起請求調用實現,因此,服務調用方在調用服務提供方的時候,並不知道具體的服務實例位置。所以,調用方須要向服務註冊中心諮詢服務,並獲取全部服務的實例清單,以實現對具體服務實例的訪問。好比:現有服務C但願調用服務A,服務C就須要向註冊中心發起諮詢服務請求,服務註冊中心就會將服務A的位置清單返回給服務C,如按上例服務A的狀況。服務C便得到了服務A的兩個可用位置192.168.0.100:8080和192.168.1.101:8080。當服務C要發起調用的時候便從該清單中以某種輪詢策略取出一個位置來進行服務調用,這就是後續咱們將要介紹的負載均衡,windows
Spring Cloud Eureka,使用Netflix Eureka來實現服務註冊與發現,它既包含 服務端組件,也包含了客戶端組件,而且服務端與客戶端組件均採用java編寫,因此Eureka主要使用於經過java實現的分佈式系統,或是與JVM兼容語言構建的系統,可是因爲Eureka服務端的服務治理機制提供了完備的RESTful API,因此它也支持非java語言構建的微服務應用歸入Eureka的服務治理體系中來,只是在使用其餘語言平臺的時候須要租戶來實現Eureka的客戶端程序。緩存
Eureka服務端,咱們也稱爲服務註冊中心,它通其餘服務註冊中心同樣,支持高可用配置。它依託於強一致性提供良好的服務實例可用性,能夠應對多種不一樣的故障場景。若是Eureka以集羣模式部署,當集羣中有分片出現故障時,那麼Eureka就轉入自我保護模式,它容許在分片故障期間繼續提供服務的發行和註冊,當故障分片回覆運行時,集羣中的其餘分片會把他們的狀態再次同步回來。以在AWS上的實踐爲例,Netflix推薦每一個可用的區域運營一個Eureka服務端,經過它來造成集羣。不一樣可用區域的服務註冊中心經過異步模式互相複製格子的狀態,這意味着在任何給定的時間點每一個實例關於全部服務的狀態是有細微差異的。架構
Eureka客戶端。主要處理服務的註冊與發現。客戶端服務經過註冊和參數配置的方式,嵌入在客戶端應用程序的代碼中,在應用程序運行時,Eureka客戶端向註冊中心註冊自身提供的服務並週期性的發生心跳來更新它的服務租約。同時,它也能從服務端查詢當前註冊的服務消息並把他們緩存到本地並週期性的刷新服務狀態。app
1 <?xml version="1.0" encoding="UTF-8"?> 2 <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 3 xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 4 <modelVersion>4.0.0</modelVersion> 5 6 <groupId>com.slp</groupId> 7 <artifactId>eureka-server</artifactId> 8 <version>0.0.1-SNAPSHOT</version> 9 <packaging>jar</packaging> 10 11 <name>eureka-server</name> 12 <description>Demo project for Spring Boot</description> 13 14 <parent> 15 <groupId>org.springframework.boot</groupId> 16 <artifactId>spring-boot-starter-parent</artifactId> 17 <version>1.3.7.RELEASE</version> 18 <relativePath/> <!-- lookup parent from repository --> 19 </parent> 20 21 <properties> 22 <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> 23 <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding> 24 <java.version>1.8</java.version> 25 </properties> 26 27 <dependencies> 28 <dependency> 29 <groupId>org.springframework.boot</groupId> 30 <artifactId>spring-boot-starter</artifactId> 31 </dependency> 32 <dependency> 33 <groupId>org.springframework.boot</groupId> 34 <artifactId>spring-boot-starter-web</artifactId> 35 </dependency> 36 <dependency> 37 <groupId>org.springframework.boot</groupId> 38 <artifactId>spring-boot-starter-test</artifactId> 39 <scope>test</scope> 40 </dependency> 41 <!--添加服務註冊依賴--> 42 <dependency> 43 <groupId>org.springframework.cloud</groupId> 44 <artifactId>spring-cloud-starter-eureka-server</artifactId> 45 </dependency> 46 47 </dependencies> 48 49 <build> 50 <plugins> 51 <plugin> 52 <groupId>org.springframework.boot</groupId> 53 <artifactId>spring-boot-maven-plugin</artifactId> 54 </plugin> 55 </plugins> 56 </build> 57 58 <repositories> 59 <repository> 60 <id>spring-snapshots</id> 61 <name>Spring Snapshots</name> 62 <url>https://repo.spring.io/snapshot</url> 63 <snapshots> 64 <enabled>true</enabled> 65 </snapshots> 66 </repository> 67 <repository> 68 <id>spring-milestones</id> 69 <name>Spring Milestones</name> 70 <url>https://repo.spring.io/milestone</url> 71 <snapshots> 72 <enabled>false</enabled> 73 </snapshots> 74 </repository> 75 </repositories> 76 77 <pluginRepositories> 78 <pluginRepository> 79 <id>spring-snapshots</id> 80 <name>Spring Snapshots</name> 81 <url>https://repo.spring.io/snapshot</url> 82 <snapshots> 83 <enabled>true</enabled> 84 </snapshots> 85 </pluginRepository> 86 <pluginRepository> 87 <id>spring-milestones</id> 88 <name>Spring Milestones</name> 89 <url>https://repo.spring.io/milestone</url> 90 <snapshots> 91 <enabled>false</enabled> 92 </snapshots> 93 </pluginRepository> 94 </pluginRepositories> 95 96 <dependencyManagement> 97 98 <dependencies> 99 100 <dependency> 101 <groupId>org.springframework.cloud</groupId> 102 <artifactId>spring-cloud-dependencies</artifactId> 103 <version>Brixton.SR5</version> 104 <type>pom</type> 105 <scope>import</scope> 106 </dependency> 107 </dependencies> 108 </dependencyManagement> 109 </project>
1 package com.slp.eurekaserver; 2 3 import org.springframework.boot.SpringApplication; 4 import org.springframework.boot.autoconfigure.SpringBootApplication; 5 import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer; 6 7 /** 8 * 經過@EnableEurekaServer註解啓動一個服務註冊中心提供給其餘應用進行註冊 9 */ 10 @EnableEurekaServer 11 @SpringBootApplication 12 public class EurekaServerApplication { 13 14 public static void main(String[] args) { 15 SpringApplication.run(EurekaServerApplication.class, args); 16 } 17 }
application.properties負載均衡
server.port=1111 eureka.instance.hostname=localhost eureka.client.register-with-eureka=false eureka.client.fetch-registry=false eureka.client.serviceUrl.defaultZone=http://${eureka.instance.hostname}:${server.port}/eureka/
eureka.client.register-with-eureka:設置爲false表示不向註冊中心註冊本身
eureka.client.fetch-registry:註冊中的職責是維護服務實例,它不須要去檢索服務,因此設置爲false
如今Instance currently registed with Eureka仍是空的,說明目前該註冊中心尚未註冊任何服務。框架
在完成上述的服務中心註冊以後,咱們嘗試加入以前的項目到服務治理體系中去。
1 <?xml version="1.0" encoding="UTF-8"?> 2 <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 3 xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 4 <modelVersion>4.0.0</modelVersion> 5 6 <groupId>com.slp</groupId> 7 <artifactId>springBoot</artifactId> 8 <version>0.0.1-SNAPSHOT</version> 9 <packaging>jar</packaging><!--SpringBoot默認將Web應用打包爲jar的形式,而非war的形式,由於默認的Web模塊會依賴抱哈嵌入式的Tomcat,這樣使得咱們的jar自身具有提供web服務的能力。--> 10 11 <name>springBoot</name> 12 <description>Demo project for Spring Boot</description> 13 14 <parent> 15 <!--父項中定義了SpringBoot的版本的基礎依賴以及一些默認配置信息,好比配置文件application.properties的位置等--> 16 <groupId>org.springframework.boot</groupId> 17 <artifactId>spring-boot-starter-parent</artifactId> 18 <version>1.3.7.RELEASE</version> 19 <relativePath/> <!-- lookup parent from repository --> 20 </parent> 21 22 <properties> 23 <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> 24 <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding> 25 <java.version>1.8</java.version> 26 </properties> 27 28 <dependencies> 29 <dependency> 30 <!--全棧Web開發模塊,包含嵌入式Tomcat SpringMVC--> 31 <groupId>org.springframework.boot</groupId> 32 <artifactId>spring-boot-starter-web</artifactId> 33 </dependency> 34 35 <dependency> 36 <!--通用測試模塊,包含JUnit Hamcrest Mockito--> 37 <groupId>org.springframework.boot</groupId> 38 <artifactId>spring-boot-starter-test</artifactId> 39 <scope>test</scope> 40 </dependency> 41 <dependency> 42 <!--監控模塊--> 43 <groupId>org.springframework.boot</groupId> 44 <artifactId>spring-boot-starter-actuator</artifactId> 45 </dependency> 46 <!--服務註冊中心提供者--> 47 <dependency> 48 <groupId>org.springframework.cloud</groupId> 49 <artifactId>spring-cloud-starter-eureka</artifactId> 50 </dependency> 51 </dependencies> 52 53 <dependencyManagement> 54 55 <dependencies> 56 57 <dependency> 58 <groupId>org.springframework.cloud</groupId> 59 <artifactId>spring-cloud-dependencies</artifactId> 60 <version>Brixton.SR5</version> 61 <type>pom</type> 62 <scope>import</scope> 63 </dependency> 64 </dependencies> 65 </dependencyManagement> 66 <build> 67 <plugins> 68 <plugin> 69 <groupId>org.springframework.boot</groupId> 70 <artifactId>spring-boot-maven-plugin</artifactId> 71 </plugin> 72 </plugins> 73 </build> 74 75 76 </project>
package com.slp.web; import com.slp.service.UserService; import org.apache.log4j.Logger; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.cloud.client.ServiceInstance; import org.springframework.cloud.client.discovery.DiscoveryClient; import org.springframework.stereotype.Controller; import org.springframework.ui.ModelMap; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; /** * @author sanglp * @create 2018-06-28 8:39 * @desc 第一個 controller **/ @Controller public class HelloController { private final Logger logger = Logger.getLogger(getClass()); @Autowired private DiscoveryClient client; @RequestMapping(value = "helloindex",method = RequestMethod.GET) public String helloindex(ModelMap map){ ServiceInstance instance = client.getLocalServiceInstance(); logger.info("/hello ,host:"+instance.getHost()+", service_id:"+instance.getServiceId()); return "helloindex"; } }
package com.slp; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cloud.client.discovery.EnableDiscoveryClient; /** * 在主類中經過加上@EnableDiscoveryClient註解,激活Eureka中的DiscoveryClient實現(自動化配置,建立DiscoveryClient接口針對Eureka客戶端的EurekaDiscoveryClient實例) */ @EnableDiscoveryClient @SpringBootApplication public class Application { public static void main(String[] args) { //jar包包含Tomcat SpringApplication.run(Application.class, args); } }
1 spring.application.name=hello-service 2 eureka.client.serviceUrl.defaultZone=http://localhost:1111/eureka/
註冊提供者控制檯:
1 2018-07-10 09:11:29.163 INFO 17484 --- [nfoReplicator-0] com.netflix.discovery.DiscoveryClient : DiscoveryClient_HELLO-SERVICE/windows10.microdone.cn:hello-service - registration status: 204
註冊中心控制檯:
1 2018-07-10 09:11:29.154 INFO 18928 --- [io-1111-exec-10] c.n.e.registry.AbstractInstanceRegistry : Registered instance HELLO-SERVICE/windows10.microdone.cn:hello-service with status UP (replication=false)