Spring Cloud是一個基于Spring Boot實(shí)現(xiàn)的云應(yīng)用開發(fā)工具,它為基于JVM的云應(yīng)用開發(fā)中涉及的配置管理、服務(wù)發(fā)現(xiàn)、斷路器、智能路由、微代理、控制總線、全局鎖、決策競選、分布式會話和集群狀態(tài)管理等操作提供了一種簡單的開發(fā)方式。
Spring Cloud包含了多個子項(xiàng)目(針對分布式系統(tǒng)中涉及的多個不同開源產(chǎn)品),比如:Spring Cloud Config、Spring Cloud Netflix、Spring Cloud CloudFoundry、Spring Cloud AWS、Spring Cloud Security、Spring Cloud Commons、Spring Cloud Zookeeper、Spring Cloud CLI等項(xiàng)目。
微服務(wù)(Microservices Architecture)是一種架構(gòu)風(fēng)格,一個大型復(fù)雜軟件應(yīng)用由一個或多個微服務(wù)組成。系統(tǒng)中的各個微服務(wù)可被獨(dú)立部署,各個微服務(wù)之間是松耦合的。每個微服務(wù)僅關(guān)注于完成一件任務(wù)并很好地完成該任務(wù)。在所有情況下,每個任務(wù)代表著一個小的業(yè)務(wù)能力。
微服務(wù)的概念源于2014年3月Martin Fowler所寫的章“Microservices”http://martinfowler.com/articles/microservices.html
微服務(wù)架構(gòu)的核心思想是,一個應(yīng)用是由多個小的、相互獨(dú)立的、微服務(wù)組成,這些服務(wù)運(yùn)行在自己的進(jìn)程中,開發(fā)和發(fā)布都沒有依賴。不同服務(wù)通過一些輕量級交互機(jī)制來通信,例如 RPC、HTTP 等,服務(wù)可獨(dú)立擴(kuò)展伸縮,每個服務(wù)定義了明確的邊界,不同的服務(wù)甚至可以采用不同的編程語言來實(shí)現(xiàn),由獨(dú)立的團(tuán)隊(duì)來維護(hù)。簡單的來說,一個系統(tǒng)的不同模塊轉(zhuǎn)變成不同的服務(wù)!而且服務(wù)可以使用不同的技術(shù)加以實(shí)現(xiàn)!
那我們在微服務(wù)中應(yīng)該怎樣設(shè)計呢。以下是微服務(wù)的設(shè)計指南:
更多關(guān)于微服務(wù)架構(gòu)內(nèi)容-請參考我的另一篇文章:《什什么是微服務(wù)架構(gòu)?》
由于Spring Cloud為服務(wù)治理做了一層抽象接口,所以在Spring Cloud應(yīng)用中可以支持多種不同的服務(wù)治理框架,比如:Netflix Eureka、Consul、Zookeeper。在Spring Cloud服務(wù)治理抽象層的作用下,我們可以無縫地切換服務(wù)治理實(shí)現(xiàn),并且不影響任何其他的服務(wù)注冊、服務(wù)發(fā)現(xiàn)、服務(wù)調(diào)用等邏輯。
Spring Cloud Eureka來實(shí)現(xiàn)服務(wù)治理。
Spring Cloud Eureka是Spring Cloud Netflix項(xiàng)目下的服務(wù)治理模塊。而Spring Cloud Netflix項(xiàng)目是Spring Cloud的子項(xiàng)目之一,主要內(nèi)容是對Netflix公司一系列開源產(chǎn)品的包裝,它為Spring Boot應(yīng)用提供了自配置的Netflix OSS整合。通過一些簡單的注解,開發(fā)者就可以快速的在應(yīng)用中配置一下常用模塊并構(gòu)建龐大的分布式系統(tǒng)。它主要提供的模塊包括:服務(wù)發(fā)現(xiàn)(Eureka),斷路器(Hystrix),智能路由(Zuul),客戶端負(fù)載均衡(Ribbon)等。
提供服務(wù)注冊和發(fā)現(xiàn)
在項(xiàng)目 spring-cloud-eureka-service
pom.xml
中引入需要的依賴內(nèi)容:
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-eureka-server</artifactId>
</dependency>
通過 @EnableEurekaServer
注解啟動一個服務(wù)注冊中心提供給其他應(yīng)用進(jìn)行對話,這個注解需要在springboot工程的啟動application類上加
package io.ymq.example.eureka.server;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer;
@SpringBootApplication
@EnableEurekaServer
public class EurekaServerApplication {
public static void main(String[] args) {
SpringApplication.run(EurekaServerApplication.class, args);
}
}
在默認(rèn)設(shè)置下,該服務(wù)注冊中心也會將自己作為客戶端來嘗試注冊它自己,所以我們需要禁用它的客戶端注冊行為,只需要在application.yml
配置文件中增加如下信息:
registerWithEureka: false
fetchRegistry: false
完整配置
server:
port: 8761
eureka:
instance:
hostname: localhost
client:
registerWithEureka: false
fetchRegistry: false
serviceUrl:
defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/
啟動工程后,訪問:http://localhost:8761/
可以看到下面的頁面,其中還沒有發(fā)現(xiàn)任何服務(wù)。
在項(xiàng)目 spring-cloud-eureka-provider
pom.xml
中引入需要的依賴內(nèi)容:
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-eureka-server</artifactId>
</dependency>
在應(yīng)用主類中通過加上 @EnableEurekaClient,但只有Eureka 可用,你也可以使用@EnableDiscoveryClient。需要配置才能找到Eureka注冊中心服務(wù)器
package io.ymq.example.eureka.provider;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@SpringBootApplication
@EnableEurekaClient
@RestController
public class EurekaProviderApplication {
@RequestMapping("/")
public String home() {
return "Hello world";
}
public static void main(String[] args) {
SpringApplication.run(EurekaProviderApplication.class, args);
}
}
需要配置才能找到Eureka服務(wù)器。例:
完整配置
eureka:
client:
serviceUrl:
defaultZone: http://localhost:8761/eureka/
spring:
application:
name: eureka-provider
server:
port: 8081
其中defaultZone
是一個魔術(shù)字符串后備值,為任何不表示首選項(xiàng)的客戶端提供服務(wù)URL(即它是有用的默認(rèn)值)。
通過spring.application.name
屬性,我們可以指定微服務(wù)的名稱后續(xù)在調(diào)用的時候只需要使用該名稱就可以進(jìn)行服務(wù)的訪問
啟動該工程后,再次訪問啟動工程后:http://localhost:8761/
可以如下圖內(nèi)容,我們定義的服務(wù)被成功注冊了。
GitHub:https://github.com/souyunku/spring-cloud-examples/tree/master/spring-cloud-eureka
碼云:https://gitee.com/souyunku/spring-cloud-examples/tree/master/spring-cloud-eureka
Wechat:關(guān)注公眾號,搜云庫技術(shù)團(tuán)隊(duì),專注于開發(fā)技術(shù)的研究與知識分享
更多建議: