SpringCloud——Eureka服務註冊和發現
阿新 • • 發佈:2019-01-27
一、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中,叢集是對等的,地位是相同的,雖不能保證一致性,但至少可以提供註冊服務。 根據不同的業務場景,各有取捨吧。