1. 程式人生 > >Spring Cloud(一):使用Eureka進行服務註冊與發現

Spring Cloud(一):使用Eureka進行服務註冊與發現

作為分散式架構開發的一種選擇,Spring Cloud利用Spring Boot的開發便利性巧妙地簡化了分散式系統基礎設施的開發,如服務發現註冊、配置中心、訊息匯流排、負載均衡、斷路器、資料監控等,都可以用Spring Boot的開發風格做到一鍵啟動和部署。Spring Cloud是各類框架的集合,這一點和Spring Boot是一樣的,因為Spring Cloud就是基於Spring Boot搭建的,Spring Boot可以單獨構建專案,而Spring Boot卻不能脫離Spring Boot。

Spring Cloud和Dubbo比起來,可以類比為Spring Security和Shiro,一個是各個方面都很到位,包含多種服務整合,另一個則是單點突出。目前市面上,微服務的框架很多,Spring Cloud適合中小型網際網路公司,因為大公司有自己的微服務治理方案,小公司和傳統企業則不需要Spring Cloud來進行服務治理,因為學習成本高、架構用不上,更適合用Dubbo、Kubernetes這些框架。因為近幾年微服務架構和Docker容器概念火熱,所以我覺得學習Spring Cloud長遠上看可能會更有發展前景。

Eureka則是Spring Cloud Netflix專案下的服務治理模組。而Spring Cloud Netflix專案是Spring Cloud的子專案之一,主要內容是對Netflix公司一系列開源產品的包裝,它為Spring Boot應用提供了自配置的Netflix OSS整合。通過一些簡單的註解,開發者就可以快速的在應用中配置一下常用模組並構建龐大的分散式系統。它主要提供的模組包括:服務發現(Eureka),斷路器(Hystrix),智慧路由(Zuul),客戶端負載均衡(Ribbon)等。

SpringCloud系列作為我個人的學習記錄,難免有錯誤和遺漏,歡迎指出ヾ(๑╹◡╹)ノ"

  • 建立服務中心

和建立普通的SpringBoot專案一樣,不過在引入模組的時候注意新增SpringCloud所需要的模組

勾選後生成的專案依賴包含

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>
  • 添加註解和配置

在啟動類上新增@EnableEurekaServer註解,表示這是Eureka的服務端

@SpringBootApplication
@EnableEurekaServer
public class EurekaServerApplication {

    public static void main(String[] args) {
        SpringApplication.run(EurekaServerApplication.class, args);
    }
}

然後是配置yml檔案

spring:
  application:
    name: eureka-server
server:
  port: 8761
eureka:
  client:
    register-with-eureka: false
    fetch-registry: false
    service-url:
      defaultZone:
        http://localhost:${server.port}/eureka
eureka.client.register-with-eureka :表示是否將自己註冊到Eureka Server,預設為true
eureka.client.fetch-registry :表示是否從Eureka Server獲取註冊資訊,預設為true
eureka.client。service-url.defaultZone : 表示服務例項地址,預設http://localhost:8761/eureka

這裡有個大坑,就是default Zone這個屬性提示不出來,我一度以為是jar包導錯了還是語法寫的有問題,甚至以為SpringBoot2.0後的版本和1.0的版本配置有差別,最後查了資料發現,發現是Eureka不認識這個屬性。。。其他的屬性是提前做了處理,按照駝峰或橫線來識別。service-url的屬性是Map,只要按照k-v格式配置就行,如果直接忽略defaultZone這個前置,就會報Failed to bind properties under 'eureka.client.service-url' to java.util.Map這個錯誤。

  • 啟動服務

執行啟動檔案,訪問http://localhost:8761/可以看到如下介面,No instances available表示沒有服務

  • 建立客戶端並註冊服務

同樣建立一個SpringBoot專案,勾選的是Eureka Discovery模組,生成後依賴如下

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

在啟動檔案上新增@EnableEurekaClient註解

@SpringBootApplication
@EnableEurekaClient
public class EurekaClientApplication {

    public static void main(String[] args) {
        SpringApplication.run(EurekaClientApplication.class, args);
    }
}

然後是配置檔案

spring:
  application:
    name: eureka-client
server:
  port: 8762
eureka:
  client:
    service-url:
      defaultZone: http://localhost:8761/eureka

defaultZone指向server端的地址

啟動服務可以看見服務成功註冊了