Spring Cloud是一個基於Spring Boot實現的雲應用開發工具,它爲基於JVM的雲應用開發中涉及的配置管理、服務發現、斷路器、智能路由、微代理、控制總線、全局鎖、決策競選、分佈式會話和集羣狀態管理等操作提供了一種簡單的開發方式。
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等項目。
微服務架構
微服務(Microservices Architecture)是一種架構風格,一個大型複雜軟件應用由一個或多個微服務組成。系統中的各個微服務可被獨立部署,各個微服務之間是鬆耦合的。每個微服務僅關注於完成一件任務並很好地完成該任務。在所有情況下,每個任務代表着一個小的業務能力。
微服務的概念源於2014年3月Martin Fowler所寫的章“Microservices”http://martinfowler.com/artic...
微服務架構(Microservices Architecture)
微服務架構的核心思想是,一個應用是由多個小的、相互獨立的、微服務組成,這些服務運行在自己的進程中,開發和發佈都沒有依賴。不同服務通過一些輕量級交互機制來通信,例如 RPC、HTTP 等,服務可獨立擴展伸縮,每個服務定義了明確的邊界,不同的服務甚至可以採用不同的編程語言來實現,由獨立的團隊來維護。簡單的來說,一個系統的不同模塊轉變成不同的服務!而且服務可以使用不同的技術加以實現!
微服務設計
那我們在微服務中應該怎樣設計呢。以下是微服務的設計指南:
- 職責單一原則(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)等。
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
可以如下圖內容,我們定義的服務被成功註冊了。