(一)基於Spring Cloud Eureka服務註冊於發現,以及部分淺析

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這個類出發

相關文章
相關標籤/搜索