Spring Cloud 是一套分佈式體系,提供比較靈活的配置與使用。功能十分豐富。java
Eureka Server會提供服務註冊服務,各個服務節點啓動後,會在Eureka Server中進行註冊,這樣Eureka Server中就有了全部服務節點的信息,而且Eureka有監控頁面,能夠在頁面中直觀的看到全部註冊的服務的狀況。同時Eureka有心跳機制,當某個節點服務在規定時間內沒有發送心跳信號時,Eureka會從服務註冊表中把這個服務節點移除。Eureka還提供了客戶端緩存的機制,即便全部的Eureka Server都掛掉,客戶端仍能夠利用緩存中的信息調用服務節點的服務。Eureka通常配合Ribbon進行使用,Ribbon提供了客戶端負載均衡的功能,Ribbon利用從Eureka中讀取到的服務信息,在調用服務節點提供的服務時,會合理的進行負載。( Ribbon會在下一篇文章講解)
Eureka經過心跳檢測、健康檢查、客戶端緩存等機制,保證了系統具備高可用和靈活性。spring
本篇文章,就Spring Cloud Eureka的服務註冊,與服務管理作一個淺析,以及搭建的介紹apache
如圖所示,咱們有一個Eureka Server服務,咱們的每一個應用服務都部署在Client上,咱們部署以後,經過Eureka將自身註冊到Service上,這樣之後應用的負載均衡以及獲取配置,均可以經過Service獲取和被調度。json
Spring Service的Pom.xml緩存
<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/maven-v4_0_0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.zx</groupId> <artifactId>SpringCloudOne</artifactId> <version>0.0.1-SNAPSHOT</version> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>1.3.5.RELEASE</version> <!--配合spring cloud版本--> <relativePath/> <!-- lookup parent from repository --> </parent> <properties> <!--設置字符編碼及java版本--> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <java.version>1.7</java.version> </properties> <dependencies> <!--增長eureka-server的依賴--> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-eureka-server</artifactId> </dependency> <!--用於測試的,本例可省略--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> </dependencies> <!--依賴管理,用於管理spring-cloud的依賴--> <dependencyManagement> <dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-parent</artifactId> <version>Brixton.SR3</version> <!--官網爲Angel.SR4版本,可是我使用的時候老是報錯--> <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> </project>
而後再建立入口class (a[pplication.class)服務器
@EnableEurekaServer//啓動Eureka服務 @SpringBootApplication public class ApplicationServer implements EmbeddedServletContainerCustomizer { public static void main(String[] args) { //經過註解加載Bean SpringApplication.run(ApplicationServer.class, args); // 從Spring配置文件加載Bean // SpringApplication.run("classpath:applicationContext.xml", args); // SpringApplication app=new SpringApplication(Application.class); // app.run(args); } public void customize(ConfigurableEmbeddedServletContainer container) { // TODO Auto-generated method stub container.setPort(8761); } }
添加application.yml 或者使用properties文件也行。不強制app
注意,Eureka配置文件離得server-port應該和你的服務所在端口保持一致,官方建議使用8761負載均衡
server: port: 8761 #指定服務端口 eureka: client: registerWithEureka: false #是否將eureka自身做爲應用註冊到eureka註冊中心 fetchRegistry: false #爲true時,能夠啓動,但報異常:Cannot execute request on any known server
以後能夠啓動服務。訪問localhost:8761,就能看到Eureka默認首頁maven
客戶端配置:分佈式
pom文件以下:
<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/maven-v4_0_0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.zx</groupId> <artifactId>SpringCloudClient</artifactId> <version>0.0.1-SNAPSHOT</version> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>1.3.5.RELEASE</version> <relativePath/> </parent> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <java.version>1.7</java.version> </properties> <dependencyManagement> <dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-parent</artifactId> <version>Brixton.SR3</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement> <dependencies> <!--此處是差別所在--> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-eureka</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> <!-- 客戶端負載均衡jar包 --> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-ribbon</artifactId> </dependency> <!-- 跨服務請求 包 --> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-feign</artifactId> </dependency> <!-- <dependency>--> <!-- <groupId>org.apache.httpcomponents</groupId>--> <!-- <artifactId>httpclient</artifactId>--> <!-- </dependency>--> <!-- <dependency>--> <!-- <groupId>com.netflix.feign</groupId>--> <!-- <artifactId>feign-httpclient</artifactId>--> <!-- <version>${feign-httpclient}</version>--> <!-- </dependency>--> </dependencies> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build> </project>
而後建立入口類:
@EnableDiscoveryClient //容許服務被發現 @SpringBootApplication @EnableFeignClients //容許服務之間的調用(後面會說) public class ApplicationClientOne { //public class Application implements EmbeddedServletContainerCustomizer { public static void main(String[] args) { //經過註解加載Bean SpringApplication.run(ApplicationClientOne.class, args); // 從Spring配置文件加載Bean // SpringApplication.run("classpath:applicationContext.xml", args); // SpringApplication app=new SpringApplication(Application.class); // app.run(args); } // public void customize(ConfigurableEmbeddedServletContainer container) { // // TODO Auto-generated method stub // container.setPort(9000); // } } @RestController class ServiceInstanceRestController { @Autowired private DiscoveryClient discoveryClient; @RequestMapping("/service-instances/{applicationName}") public List<ServiceInstance> serviceInstancesByApplicationName(@PathVariable String applicationName) { return this.discoveryClient.getInstances(applicationName); } }
這個類下面我定義了一個 方法serviceInstancesByApplicationName 這個方法經過應用的名稱,獲取相關信息。
返回參數以下:
[{"metadata":{},"uri":"http://PMOMIS-PC.dayang.com:8080","secure":false,"serviceId":"ONE-CLOUD-CLIENT","instanceInfo":{"instanceId":"PMOMIS-PC.dayang.com:One-cloud-client:8080","app":"ONE-CLOUD-CLIENT","appGroupName":null,"ipAddr":"192.168.6.23","sid":"na","homePageUrl":"http://PMOMIS-PC.dayang.com:8080/","statusPageUrl":"http://PMOMIS-PC.dayang.com:8080/info","healthCheckUrl":"http://PMOMIS-PC.dayang.com:8080/health","secureHealthCheckUrl":null,"vipAddress":"One-cloud-client","secureVipAddress":"One-cloud-client","countryId":1,"dataCenterInfo":{"@class":"com.netflix.appinfo.InstanceInfo$DefaultDataCenterInfo","name":"MyOwn"},"hostName":"PMOMIS-PC.dayang.com","status":"UP","leaseInfo":{"renewalIntervalInSecs":30,"durationInSecs":90,"registrationTimestamp":1491381396464,"lastRenewalTimestamp":1491381396464,"evictionTimestamp":0,"serviceUpTimestamp":1491381395840},"isCoordinatingDiscoveryServer":false,"metadata":{},"lastUpdatedTimestamp":1491381396464,"lastDirtyTimestamp":1491381395750,"actionType":"ADDED","asgName":null,"overriddenStatus":"UNKNOWN"},"host":"PMOMIS-PC.dayang.com","port":8080}]
這個方法咱們在後面應用調另外一個應用服務的時候 將會用到。
添加配置文件application.yml
server: port: 8080 spring: application: name: One-cloud-client #爲你的應用起個名字,該名字將註冊到eureka註冊中心 eureka: client: serviceUrl: defaultZone: http://localhost:8761/eureka/ #eureka服務地址,同一臺機器能夠忽略
啓動服務以後,這個應用就會根據配置文件裏的Eureka服務器地址去註冊本身。
一樣 咱們會在Eureka首頁裏發現出現這麼一個application
這樣整個服務的註冊和發現就完成了。
注意點:
1:當一個客戶端註冊到eureka,它會提供關於它本身的端口、地址、健康監控url和home頁面等等的元數據,erueka會從每一個實例接受心跳信息。若是心跳在配置的時間內失敗,實例一般會從註冊表中移除。
2:註冊服務默認心跳時間爲30秒,當一個服務器不可用,須要3個心跳才能讓服務器和客戶端的元數據相同。可使用eureka.instance.leaseRenewalIntervalInSeconds加快這個過程。在生產環境最好使用默認配置。不過這個配置不建議改,Eureka會經過這個參數去判斷服務是否大面積宕機而採起相關措施(此處我還沒實現,有待討論)
相關資料文章及出處:
http://blog.csdn.net/zhuchuangang/article/details/51202307
http://blog.csdn.net/lc0817/article/details/54375802
代碼解析能夠參考這篇文章:http://blog.csdn.net/neosmith/article/details/53131023
或者能夠根據日誌去看
咱們能夠從EurekaServerBootstrap這個類出發