1. 程式人生 > >SpringCloud——Eureka服務註冊和發現

SpringCloud——Eureka服務註冊和發現

一、SpringCloud和Dubbo

SpringCloud整合了一套較為完整的微服務解決方案框架,而Dubbo只是解決了微服務的幾個方面的問題。

content Dubbo SpringCloud
服務註冊中心 zookeeper Spring Cloud Netflix Eureka
服務呼叫方式 RPC REST API
服務閘道器 Spring Cloud Netflix Zuul
斷路器 不完善 Spring Cloud Netflix Hystrix
分散式配置 Spring Cloud Config
服務跟蹤 Spring Cloud Sleuth
訊息匯流排 Spring Cloud Bus
資料流 Spring Cloud Stream
批量任務 Spring Cloud Task

當然,雖然dubbo沒有提供很多解決方案,但他也可以整合第三方的專案來實現。

二、Demo

今天介紹的服務發現是在SpringCloud的子專案Netflix中,除此之外,他還提供了熔斷器、負載均衡、智慧路由等,之後會介紹到。

和往常一樣,我們先來實現這個例項,然後再分析。這裡,我們需要一個服務註冊中心(即下面例子中的eureka-server)和一個服務的提供方(eureka-provider)。

1、服務註冊中心

1)、引入pom檔案

<!--基於Springboot-->
      <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>1.4.0.RELEASE</version> 
        <relativePath/>
    </parent
>
<properties> <!--設定字元編碼及java版本--> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <java.version>1.8</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的依賴,其中Camden.SR3是版本號--> <dependencyManagement> <dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-dependencies</artifactId> <version>Camden.SR3</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement>

2)、配置

新建application.properties,注意名稱只能是這個,不然不會被識別。

server.port=8761
#註冊中心預設埠就是8761,也可通過下面的方式定義其他埠
#eureka.client.serviceUrl.defaultZone=http://localhost:${server.port}/eureka/
eureka.client.registerWithEureka=false
eureka.client.fetchRegistry=false

3)、啟動類

@EnableEurekaServer  //啟動一個服務註冊中心提供給其他應用進行對話
@SpringBootApplication
public class ServerApplication {
public static void main(String[] args) {
//下面兩行程式碼都可以用來啟動
 SpringApplication.run(ServerApplication.class, args);
//new SpringApplicationBuilder(Application.class).web(true).run(args);
}
}

4)、測試

2、服務提供者

1)、pom檔案跟註冊中心類似,只有eureka有區別:

     <dependency>
        <groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-eureka</artifactId>
    </dependency>

2)、配置檔案

#應用(服務)名稱
spring.application.name=compute-service  
server.port=8762
#註冊中心地址
eureka.client.serviceUrl.defaultZone=http://localhost:8761/eureka/

3)、Java Code

Controller中,通過DiscoveryClient發現服務。
啟動類

@EnableDiscoveryClient  //啟用eureka中的DiscoveryClient實現
@SpringBootApplication
public class ComputeServiceApplication {
    public static void main(String[] args) {
    new SpringApplicationBuilder(ComputeServiceApplication.class).web(true).run(args);
    }
}

4)、測試

這裡寫圖片描述

這裡寫圖片描述 ##

三、FAQ

1、Eureka的高可用方案 上面的例子中,Eureka只有一個8761的註冊中心,那麼如何避免單點問題呢?

我們可以採用叢集的方式來解決。 比如現在有三臺機器:Server1、Server2和Server3.在高可用方案中,三臺機器要兩兩註冊。比如S1要向S2、S3分別進行註冊,目前他無法實現註冊的傳遞性。 這樣一來,如果Server1宕機,我們還可以繼續從Server2和3中獲取服務。

2、為什麼不用zookeeper做註冊中心 在使用dubbo時,一般都結合zk(作為註冊中心)來使用。那為什麼SpringCloud中使用Eureka,而不是zk呢?

我們來比較一下,在CAP理論中,zk更看重C和P,即一致性和分割槽容錯性。但Eureka更在意的是A和P,A為高可用。zk中有master和follower區別,當進入選舉模式時,就無法正常對外提供服務。但Eureka中,叢集是對等的,地位是相同的,雖不能保證一致性,但至少可以提供註冊服務。 根據不同的業務場景,各有取捨吧。