1、Spring Cloud 簡介java
Spring Cloud 是一個基於Spring Boot 實現的微服務架構開發工具。是一個涉及到服務治理、分佈式配置管理、負載均衡、服務容錯、API網關、消息總線、服務跟蹤等等爲一體的微服務架構體系。咱們經常據說的Spring Cloud全家桶,就是這個意思,他是一個總體的解決方案,最主要的是,用起特別簡單。它主要包含以下組件:nginx
Spring Cloud Netfilx: 核心組件,對多個Netflix OSS 開源組件進行整合git
| - Eureka:服務治理,包含服務註冊中心、服務註冊於服務發現web
|- Hystrix: 容錯管理redis
|- Ribbon: 負載均衡spring
|- Feign : 聲明式服務調用組件apache
|- Zuul: 微服務網關restful
Spring Cloud Bus: 消息總線,用於傳播集羣中的狀態變化或者事件架構
Spring Cloud Consul: 服務發現與配置管理工具app
Spring Cluod Zookeeper: 基於Zookeeper的服務發現與配置管理組件
Spring Cloud Stream : 經過redis、kafka實現的消費服務,能夠經過簡單的聲明式模型來發送和接收消息
。。。。。。
不少不少,這裏就不一一介紹了。
要特別注意:Spring Cloud 並非微服務,而是Spring 幫咱們封裝的微服務總體解決方案,就像之前的Spring,SpringBoot同樣,只是工具。還有別的辦法能夠實現微服務。只不過SpringCloud給咱們提供的這個方案簡單、好用。
2、 一切從服務的治理提及
咱們前面的文章已經說了,所謂的微服務,就是把傳統單體應用架構以及簡單的集羣根據實際業務改成一個一個完整的小服務,以便於獨立開發、獨立維護、獨立部署、獨立擴展,各個服務之間經過RestFul請求相互調用!
咱們的服務剛開始的時候,有可能不會不少,咱們能夠經過一些靜態配置來完成服務的調用,好比配置反向代理,負載均衡。可是,隨着業務發展,系統功能愈來愈複雜,相應的微服務也在不斷的增長,咱們的配置文件會變得愈來愈難以維護,並且,隨着業務的增加,咱們的集羣規模、服務的位置、服務的命名都有可能發生變化。若是仍是經過手工來配置,極容易出錯,搞很差上西線一個新功能,一不當心,在nginx中多寫了空格,多加了個子目,nginx掛了,完了,全部服務都掉不通了...諸如此類。(爲了避免出問題,我每次更改的時候作了備份,檢查了又檢查,不勝其煩)
由於這個緣由,產生了一些服務治理的框架,好比阿里系的Dubbo,噹噹網的DubboX,還有咱們今天要講的Eureka等等。
1> Eureka 跑起來
在簡單的介紹了spring-cloud 以及 咱們須要服務治理以後,咱們先把Eureka跑起來,而後,咱們再說服務治理我們治理了些啥。
第一步:起一個Eureka服務端(服務註冊中心)
做用: 既然是服務治理,我得有個治理中心,這個就是Eureka服務端
起一個Java的Maven工程,引入依賴:
<properties> <!--配置默認編碼爲UTF-8--> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <!--定義java版本--> <java.version>1.8</java.version> <!--集中定義依賴版本--> <spring-cloud-version>Dalston.SR5</spring-cloud-version> </properties> <dependencies> <!--引入eureka-server依賴--> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-eureka-server</artifactId> </dependency> </dependencies> <dependencyManagement> <dependencies> <dependency> <groupId>io.spring.platform</groupId> <artifactId>platform-bom</artifactId> <version>Brussels-SR6</version> <type>pom</type> <scope>import</scope> </dependency> <!--Spring-Cloud組件--> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-dependencies</artifactId> <version>${spring-cloud-version}</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement> <!--統一構建文件--> <build> <finalName>joy-framework</finalName> <plugins> <!-- Compile Plugin --> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <version>3.5</version> <configuration> <source>${java.version}</source> <target>${java.version}</target> <encoding>${project.build.sourceEncoding}</encoding> </configuration> </plugin> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-surefire-plugin</artifactId> <version>2.9</version> <configuration> <skip>true</skip> </configuration> </plugin> </plugins> </build>
起一個SpringBoot主類,在其上加上@EnableEurekaServer註解,標識爲一個服務註冊中心以提供給其餘應用進行對話。
/** * 服務註冊中心 */ @EnableEurekaServer @SpringBootApplication public class EurekaServerApplication { public static void main(String[] args) { SpringApplication.run(EurekaServerApplication.class, args); } }
在默認設置下,該服務註冊中心也會將本身做爲客戶端來嘗試註冊它本身,因此咱們須要禁用它的客戶端註冊行爲,只須要在application.properties
配置文件中增長以下信息:
# 設置服務名 spring.application.name=demo-eureka-server #設置服務端口 server.port=9001 # eureka配置 eureka.instance.hostname=localhost #設置不該許將本身註冊爲eureka客戶端 eureka.client.register-with-eureka=false eureka.client.fetch-registry=false
PS: 這裏,特別講一下
eureka.client.register-with-eureka=false ---- 這一項是設置該服務是否想註冊中心註冊本身,設置爲false表示不註冊本身!
eureka.client.register-with-eureka=false ---- 因爲註冊中心的職責就是維護服務實例,它並不須要去檢索服務(讓別人主動註冊過來就行了),因此,也設置爲false.
這兩個配置。
這個時候,咱們啓動工程,而後訪問http://localhost:9001/就能夠看到下面的頁面:
至此,咱們的服務註冊中心已經跑起來了,是否是很簡單!!!這個時候,控制面板中instances currently registered(目前已註冊實例)列表爲空,表示沒有任何實例。
既然有了服務註冊中心,那麼,咱們得有服務給他管理。接下來,咱們就來建立一個服務:demo-eureka-first-client.
首先,仍是起一個SpringBoot 工程,在pom.xml中加入以下信息:
<dependencies> <!--客戶端,固然要引入eureka依賴--> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-eureka</artifactId> </dependency> <!--!咱們用SpringMvc的restful對外提供服務,因此要引入相關依賴--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> </dependencies> <!--!省略版本和buil相關內容-->
而後,咱們寫一個web接口/hello,用來模擬提供服務:
/** * 驗證web服務 */ @RestController public class HelloController { @Autowired private DiscoveryClient discoveryClient; @GetMapping("/hello") public @ResponseBody String hello() { System.out.println("調用hello" + discoveryClient.getServices()); return "Hello ,First Eureka Client"; } }
而後,在應用主類上加上@EnableDiscoveryClient註解,讓其可以被當作eureka-client被註冊中心發現。
@EnableDiscoveryClient //註解啓動一個服務註冊中心提供給其餘應用進行對話 @SpringBootApplication public class EurekaClientFirstApplication { public static void main(String[] args) { SpringApplication.run(EurekaClientFirstApplication.class, args); } }
固然,僅僅可以被發現是遠遠不夠的,接下來,咱們還須要再配置文件中配置一下相關信息(主要是告訴應用,我是誰,我在哪裏,我要去哪裏註冊):
#經過spring.application.name屬性,咱們能夠指定微服務的名稱後續在調用的時候只須要使用該名稱就能夠進行服務的訪問 spring.application.name=demo-eureka-client-first #爲了在本機上測試區分服務提供方和服務註冊中心,使用server.port屬性設置不一樣的端口。 server.port=9011 #關鍵:定義eureka-server的地址 eureka.client.service-url.defaultZone=http://localhost:9001/eureka/
最後,咱們啓動SpringBoot應用。
咱們會在控制檯看到以下打印信息:
這個就表示已經發現了本身,表示註冊成功.
而此時,你再看註冊中心的控制檯,能夠發現以下信息:
咱們再回到控制檯頁面上去,再註冊列表中會看到以下內容:
你點擊進去,就會默認調用/info接口,這個時候你就會獲得以下信息:
能夠看到,咱們其實已經進入到了9011這個端口上的服務了,只是默認掉的info接口,這個接口咱們沒有提供,因此9011上的這個服務報錯了。當咱們改成hello的時候,就會出現以下信息:
ok,至此,咱們一個服務註冊中心和一個服務已經開發完成。固然,咱們也能夠仿照第一個服務,再起一個demo-eureka-client-second服務。筆者在這裏就不贅述了,都同樣,改個名和端口而已。若是你啓動這個服務,那麼,就能夠在註冊中心看到以下內容:
看到了吧,第二個服務也註冊進來了。
這樣,咱們就完成了一個簡單的服務治理了。是否是很簡單,就是引入依賴,加上註解而已。咱們知道,SpringBoot讓開發變得簡單,而SpringCloud那就是讓咱們開發微服務變得簡單!
這裏,咱們只起了一個很簡單得註冊中心和兩個簡單得不能再簡單的服務。
固然,SpringCloud的內容遠不止這些,這只是個開始,從這裏,我們就一塊兒開啓咱們的Spring-Cloud 微服務全家桶的學習之旅吧。
PS: 附上該Demo的git源碼:https://gitee.com/top-djlee/demo-spring-cloud.git