Spring Cloud(一) 服務的註冊與發現(Eureka)

Spring Cloud是一個基於Spring Boot實現的雲應用開發工具,它爲基於JVM的雲應用開發中涉及的配置管理、服務發現、斷路器、智能路由、微代理、控制總線、全局鎖、決策競選、分佈式會話和集羣狀態管理等操做提供了一種簡單的開發方式。html

Spring Cloud簡介

Spring Cloud包含了多個子項目(針對分佈式系統中涉及的多個不一樣開源產品),好比:Spring Cloud Config、Spring Cloud Netflix、Spring Cloud0 CloudFoundry、Spring Cloud AWS、Spring Cloud Security、Spring Cloud Commons、Spring Cloud Zookeeper、Spring Cloud CLI等項目。mysql

微服務架構

微服務(Microservices Architecture)是一種架構風格,一個大型複雜軟件應用由一個或多個微服務組成。系統中的各個微服務可被獨立部署,各個微服務之間是鬆耦合的。每一個微服務僅關注於完成一件任務並很好地完成該任務。在全部狀況下,每一個任務表明着一個小的業務能力。git

微服務的概念源於2014年3月Martin Fowler所寫的章「Microservices」http://martinfowler.com/artic...github

微服務架構(Microservices Architecture)

微服務架構的核心思想是,一個應用是由多個小的、相互獨立的、微服務組成,這些服務運行在本身的進程中,開發和發佈都沒有依賴。不一樣服務經過一些輕量級交互機制來通訊,例如 RPC、HTTP 等,服務可獨立擴展伸縮,每一個服務定義了明確的邊界,不一樣的服務甚至能夠採用不一樣的編程語言來實現,由獨立的團隊來維護。簡單的來講,一個系統的不一樣模塊轉變成不一樣的服務!並且服務能夠使用不一樣的技術加以實現!spring

微服務設計

那咱們在微服務中應該怎樣設計呢。如下是微服務的設計指南:sql

  • 職責單一原則(Single Responsibility Principle):把某一個微服務的功能聚焦在特定業務或者有限的範圍內會有助於敏捷開發和服務的發佈。
  • 設計階段就須要把業務範圍進行界定。
  • 須要關心微服務的業務範圍,而不是服務的數量和規模儘可能小。數量和規模須要依照業務功能而定。
  • 於SOA不一樣,某個微服務的功能、操做和消息協議儘可能簡單。
  • 項目初期把服務的範圍制定相對寬泛,隨着深刻,進一步重構服務,細分微服務是個很好的作法。

關於微服務架構的取捨

  • 在合適的項目,合適的團隊,採用微服務架構收益會大於成本。
  • 微服務架構有不少吸引人的地方,但在擁抱微服務以前,也須要認清它所帶來的挑戰。
  • 須要避免爲了「微服務」而「微服務」。
  • 微服務架構引入策略 – 對傳統企業而言,開始時能夠考慮引入部分合適的微服務架構原則對已有系統進行改造或新建微服務應用,逐步探索及積累微服務架構經驗,而非全盤實施微服務架構。

服務治理

因爲Spring Cloud爲服務治理作了一層抽象接口,因此在Spring Cloud應用中能夠支持多種不一樣的服務治理框架,好比:Netflix Eureka、Consul、Zookeeper。在Spring Cloud服務治理抽象層的做用下,咱們能夠無縫地切換服務治理實現,而且不影響任何其餘的服務註冊、服務發現、服務調用等邏輯。數據庫

Spring Cloud Eureka

Spring Cloud Eureka來實現服務治理。編程

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

Eureka Server

提供服務註冊和發現服務器

添加依賴

在項目 lemon-eureka中引入須要的依賴內容:

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

開啓服務註冊

經過 @EnableEurekaServer 註解啓動一個服務註冊中心提供給其餘應用進行對話,這個註解須要在springboot工程的啓動application類上加@EnableEurekaServer

@SpringBootApplication
@EnableEurekaServer
public class LemonEurekaApplication {

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

添加配置

在默認設置下,該服務註冊中心也會將本身做爲客戶端來嘗試註冊它本身,因此咱們須要禁用它的客戶端註冊行爲,只須要在application.yml配置文件中增長以下信息:

registerWithEureka: false
fetch-registry: false

完整配置

server:
  port: 7001

spring:
  application:
    name: lemon-eureka

eureka:
  instance:
    hostname: eureka7001.com
  client:
    registerWithEureka: false
    fetch-registry: false
    service-url:
      defaultZone: http://eureka7001.com:7001/eureka/

訪問服務

啓動工程後,訪問:http://eureka7001.com:7001

能夠看到下面的頁面,其中尚未發現任何服務。

Service Provider

  • 服務提供方
  • 將自身服務註冊到 Eureka 註冊中心,從而使服務消費方可以找到

添加依賴

在項目 lemon-dept中引入須要的依賴內容:

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

開啓服務註冊

在應用主類中經過加上 @EnableEurekaClient,但只有Eureka 可用,你也能夠使用@EnableDiscoveryClient。須要配置才能找到Eureka註冊中心服務器

@SpringBootApplication
@EnableDiscoveryClient
public class LemonDeptApplication {

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

添加配置

須要配置才能找到Eureka服務器。例:

完整配置

server:
  port: 8001

mybatis:
  config-location: classpath:mybatis/mybatis.cfg.xml        # mybatis配置文件所在路徑
  type-aliases-package: com.github.lemon.entities    # 全部Entity別名類所在包
  mapper-locations:
  - classpath:mybatis/mapper/**/*.xml                       # mapper映射文件

spring:
   application:
    name: lemon-dept
   datasource:
    type: com.alibaba.druid.pool.DruidDataSource            # 當前數據源操做類型
    driver-class-name: com.mysql.jdbc.Driver              # mysql驅動包
    url: jdbc:mysql://localhost:3306/cloudDB01              # 數據庫名稱
    username: root
    password: 123456
    dbcp2:
      min-idle: 5                                           # 數據庫鏈接池的最小維持鏈接數
      initial-size: 5                                       # 初始化鏈接數
      max-total: 5                                          # 最大鏈接數
      max-wait-millis: 200                                  # 等待鏈接獲取的最大超時時間

eureka:
  client: #客戶端註冊進eureka服務列表內
    service-url:
      #defaultZone: http://eureka7001.com:7001/eureka
      defaultZone: http://eureka7001.com:7001/eureka/
  instance:
    instance-id: lemon-dept
    prefer-ip-address: true     #訪問路徑能夠顯示IP地址

其中defaultZone是一個魔術字符串後備值,爲任何不表示首選項的客戶端提供服務URL(即它是有用的默認值)。
經過spring.application.name屬性,咱們能夠指定微服務的名稱後續在調用的時候只須要使用該名稱就能夠進行服務的訪問

訪問服務

啓動該工程後,再次訪問啓動工程後:http://eureka7001.com:7001

能夠以下圖內容,咱們定義的服務被成功註冊了。

源碼下載

碼雲:https://gitee.com/lemonLove/lemon-cloud

相關文章
相關標籤/搜索