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