注:一些內(nèi)容是個(gè)人見解,如有不準(zhǔn)確的歡迎指正~
一,基本概念
SpringCloud定義
Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智能路由,微代理,控制總線)。分布式系統(tǒng)的協(xié)調(diào)導(dǎo)致了樣板模式, 使用Spring Cloud開發(fā)人員可以快速地支持實(shí)現(xiàn)這些模式的服務(wù)和應(yīng)用程序。他們將在任何分布式環(huán)境中運(yùn)行良好,包括開發(fā)人員自己的筆記本電腦,裸機(jī)數(shù)據(jù)中心,以及Cloud Foundry等托管平臺(tái)。
特性
Spring Cloud專注于提供良好的開箱即用經(jīng)驗(yàn)的典型用例和可擴(kuò)展性機(jī)制覆蓋。
- 分布式/版本化配置
- 服務(wù)注冊和發(fā)現(xiàn)
- 路由
- service - to - service調(diào)用
- 負(fù)載均衡
- 斷路器
- 分布式消息傳遞
Eureka的基礎(chǔ)架構(gòu)
Eureka的基礎(chǔ)架構(gòu):

服務(wù)提供

服務(wù)消費(fèi)者

二,簡單模塊(配合代碼Demo演示)
eureka server
一、服務(wù)發(fā)現(xiàn)組件我們?yōu)槭裁催x擇Eureka?
1.Eureka來自生產(chǎn)環(huán)境,這是它天生的優(yōu)勢
2.Spring Cloud對Eureka支持很好
二、Eureka簡介
Eureka是Netflix開發(fā)的服務(wù)發(fā)現(xiàn)框架,本身是一個(gè)基于REST的服務(wù),主要用于定位運(yùn)行在AS域中的中間層服務(wù),以達(dá)到負(fù)載均衡和中間層服務(wù)故障轉(zhuǎn)移的目的。
SpringCloud將它集成在其子項(xiàng)目spring-cloud-netflix中,以實(shí)現(xiàn)Spring Cloud的服務(wù)發(fā)現(xiàn)功能。
Eureka項(xiàng)目相當(dāng)活躍,代碼更新相當(dāng)頻繁,目前最新版本是1.9.*
2.0的版本也正在緊鑼密鼓的開發(fā)中,2.0將會(huì)帶來更好的擴(kuò)展性,并且使用細(xì)粒度的訂閱模型取代了基于拉取的模型。
注:(Eureka 2.0 開源工作宣告停止,繼續(xù)使用風(fēng)險(xiǎn)自負(fù)) 尷尬~
三、Eureka Server 本身也支持集群。(跨區(qū)域等)
四 、代碼實(shí)例
1.maven配置
<!-- springBoot的jar -->
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.5.4.RELEASE</version>
<relativePath/>
</parent>
<!-- eureka-server -->
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-eureka-server</artifactId>
</dependency>
</dependencies>
<dependencyManagement>
<dependencies>
<!-- springCloud的基礎(chǔ)jar -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>Dalston.SR1</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
2.啟動(dòng)方法
@EnableEurekaServer //啟動(dòng)一個(gè)服務(wù)注冊中心提供給其他應(yīng)用進(jìn)行對話
@SpringBootApplication
public class EurekaServerApplication {
public static void main(String[] args) {
SpringApplication.run(EurekaServerApplication.class, args);
}
}
3.配置參數(shù)
#服務(wù)名稱
spring.application.name=eureka-server
#端口號(hào)
server.port=1001
#設(shè)為false,關(guān)閉自我保護(hù)主要(默認(rèn)是關(guān)閉的)
eureka.server.enable-self-preservationz = true
#清理間隔(單位毫秒,默認(rèn)是60*1000)
eureka.server.eviction-interval-timer-in-ms = 60000
eureka.instance.hostname=localhost
#是否向服務(wù)注冊中心注冊自己
# (在默認(rèn)配置下,Eureka Server會(huì)將自己也作為客戶端來嘗試注冊自己,我們需要禁用它的客戶端禁用行為)
eureka.client.register-with-eureka=false
#是否檢索服務(wù)
eureka.client.fetch-registry=false
#服務(wù)注冊中心的配置內(nèi)容,指定服務(wù)注冊中心的位置 高可用的注冊(不同地域,啟動(dòng)不同的eureka池)
# eureka.client.serviceUrl.defaultZone=http://${eureka.instance.hostname}:${server.port}/eureka/
4.啟動(dòng)流程
@EnableEurekaServer包含了所有的Eureka Server啟動(dòng)配置。
但是在EnableEurekaServer的注解聲明中,沒有看到任何初始化bean定義:
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Import(EurekaServerMarkerConfiguration.class)
public @interface EnableEurekaServer {
}
@Configuration
public class EurekaServerMarkerConfiguration {
@Bean
public Marker eurekaServerMarkerBean() {
return new Marker();
}
class Marker {
}
}
但是在EurekaServerMarkerConfiguration的配置中,定義了一個(gè)空的類并進(jìn)行了實(shí)例化。按照這個(gè)類的探索,發(fā)現(xiàn)其實(shí)以上都是一個(gè)開關(guān),真正的配置都在EurekaServerAutoConfiguration中實(shí)現(xiàn)。
@Configuration
@Import(EurekaServerInitializerConfiguration.class)
@ConditionalOnBean(EurekaServerMarkerConfiguration.Marker.class)
@EnableConfigurationProperties({ EurekaDashboardProperties.class,
InstanceRegistryProperties.class })
@PropertySource("classpath:/eureka/server.properties")
public class EurekaServerAutoConfiguration extends WebMvcConfigurerAdapter {
}
@Configuration
@EnableConfigurationProperties
@ConditionalOnClass(EurekaClientConfig.class)
@Import(DiscoveryClientOptionalArgsConfiguration.class)
@ConditionalOnBean(EurekaDiscoveryClientConfiguration.Marker.class)
@ConditionalOnProperty(value = "eureka.client.enabled", matchIfMissing = true)
@AutoConfigureBefore({ NoopDiscoveryClientAutoConfiguration.class,
CommonsClientAutoConfiguration.class, ServiceRegistryAutoConfiguration.class })
@AutoConfigureAfter(name = {"org.springframework.cloud.autoconfigure.RefreshAutoConfiguration",
"org.springframework.cloud.netflix.eureka.EurekaDiscoveryClientConfiguration",
"org.springframework.cloud.client.serviceregistry.AutoServiceRegistrationAutoConfiguration"})
public class EurekaClientAutoConfiguration {
}
總結(jié)來說,過程是:配置@EnableEurekaServer-@Import-》EurekaServerMarkerConfiguration-創(chuàng)建Marker實(shí)例-》掃描到EurekaServerAutoConfiguration時(shí),@ConditionalOnBean滿足加載條件,進(jìn)行加載。
Eureka的啟動(dòng)接口為com.netflix.eureka.EurekaBootStrap。EurekaBootStrap實(shí)現(xiàn)了javax.servlet.ServletContextListener,并在contextInitialized函數(shù)中初始化Eureka的參數(shù)和服務(wù)啟動(dòng)。
/**
* Initializes Eureka, including syncing up with other Eureka peers and publishing the registry.
*
* @see
* javax.servlet.ServletContextListener#contextInitialized(javax.servlet.ServletContextEvent)
*/
@Override
public void contextInitialized(ServletContextEvent event) {
try {
initEurekaEnvironment();//配置信息
initEurekaServerContext();//服務(wù)啟動(dòng)
ServletContext sc = event.getServletContext();
sc.setAttribute(EurekaServerContext.class.getName(), serverContext);
} catch (Throwable e) {
logger.error("Cannot bootstrap eureka server :", e);
throw new RuntimeException("Cannot bootstrap eureka server :", e);
}
}
Eureka client
微服務(wù)中的每一個(gè)小的應(yīng)用(模塊);我們創(chuàng)建提供服務(wù)的客戶端,并向服務(wù)注冊中心注冊自己
首先,創(chuàng)建一個(gè)基本的Spring Boot應(yīng)用。命名為eureka-client
在pom.xml中,加入如下配置:
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-eureka</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
</dependencies>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>Dalston.SR1</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
main啟動(dòng)配置
@EnableDiscoveryClient //注解用來將當(dāng)前應(yīng)用加入到服務(wù)治理體系中。
@SpringBootApplication
public class EurekaClientApplication {
public static void main(String[] args) {
SpringApplication.run(EurekaClientApplication.class, args);
//java spi test
/*ServiceLoader<Log> serviceLoader = ServiceLoader.load(Log.class);
Iterator<Log> iterator = serviceLoader.iterator();
while (iterator.hasNext()) {
Log log = iterator.next();
log.execute("iiiiiiiiiiii");
}*/
}
}
application.properties 參數(shù)配置
spring.application.name=eureka-client
server.port=2001
#指定服務(wù)注冊中心地址,類型為 HashMap,并設(shè)置有一組默認(rèn)值,默認(rèn)的Key為 defaultZone;默認(rèn)的Value為 http://localhost:8761/eureka ,如果服務(wù)注冊中心為高可用集群時(shí),多個(gè)注冊中心地址以逗號(hào)分隔。
#如果服務(wù)注冊中心加入了安全驗(yàn)證,這里配置的地址格式為: http://<username>:<password>@localhost:8761/eureka 其中 <username> 為安全校驗(yàn)的用戶名;<password> 為該用戶的密碼
eureka.client.serviceUrl.defaultZone=http://localhost:1001/eureka/
ps:后面啟動(dòng)的服務(wù)都與這個(gè)類似,只是使用不同的功能就添加不同的pom引入
服務(wù)消費(fèi)者(基礎(chǔ))
服務(wù)之間通過接口調(diào)用獲取數(shù)據(jù)
(見代碼展示)
服務(wù)消費(fèi)者(Ribbon)
定義:
- Spring Cloud Ribbon是基于Netflix Ribbon實(shí)現(xiàn)的一套客戶端負(fù)載均衡的工具。它是一個(gè)基于HTTP和TCP的客戶端負(fù)載均衡器。它可以通過在客戶端中配置ribbonServerList來設(shè)置服務(wù)端列表去輪詢訪問以達(dá)到均衡負(fù)載的作用。
- 當(dāng)Ribbon與Eureka聯(lián)合使用時(shí),ribbonServerList會(huì)被DiscoveryEnabledNIWSServerList重寫,擴(kuò)展成從Eureka注冊中心中獲取服務(wù)實(shí)例列表。同時(shí)它也會(huì)用NIWSDiscoveryPing來取代IPing,它將職責(zé)委托給Eureka來確定服務(wù)端是否已經(jīng)啟動(dòng)。
- 而當(dāng)Ribbon與Consul聯(lián)合使用時(shí),ribbonServerList會(huì)被ConsulServerList來擴(kuò)展成從Consul獲取服務(wù)實(shí)例列表。同時(shí)由ConsulPing來作為IPing接口的實(shí)現(xiàn)。
- 我們在使用Spring Cloud Ribbon的時(shí)候,不論是與Eureka還是Consul結(jié)合,都會(huì)在引入Spring Cloud Eureka或Spring Cloud Consul依賴的時(shí)候通過自動(dòng)化配置來加載上述所說的配置內(nèi)容,所以我們可以快速在Spring Cloud中實(shí)現(xiàn)服務(wù)間調(diào)用的負(fù)載均衡。
使用的通訊協(xié)議:
通信協(xié)議是HTTP或者HTTPS
使用方式
為RestTemplate增加@LoadBalanced注解
相關(guān)實(shí)例--
Spring Cloud Feign
Feign 簡介
在Spring Cloud Netflix棧中,各個(gè)微服務(wù)都是以HTTP接口的形式暴露自身服務(wù)的,因此在調(diào)用遠(yuǎn)程服務(wù)時(shí)就必須使用HTTP客戶端。我們可以使用JDK原生的URLConnection、Apache的Http Client、Netty的異步HTTP Client, Spring的RestTemplate。但是,用起來最方便、最優(yōu)雅的還是要屬Feign了。
定義:
- Feign是一種聲明式、模板化的HTTP客戶端。在Spring Cloud中使用Feign, 我們可以做到使用HTTP請求遠(yuǎn)程服務(wù)時(shí)能與調(diào)用本地方法一樣的編碼體驗(yàn),開發(fā)者完全感知不到這是遠(yuǎn)程方法,更感知不到這是個(gè)HTTP請求。
- 它使得編寫Web服務(wù)客戶端變得更加簡單。我們只需要通過創(chuàng)建接口并用注解來配置它既可完成對Web服務(wù)接口的綁定。它具備可插拔的注解支持,包括Feign注解、JAX-RS注解。它也支持可插拔的編碼器和解碼器。
- Spring Cloud Feign還擴(kuò)展了對Spring MVC注解的支持,同時(shí)還整合了Ribbon和Eureka來提供均衡負(fù)載的HTTP客戶端實(shí)現(xiàn)
- 可以傳輸文件
比如:
/**
* @ProjectName springcloudroot
* @PackageName com.example.consumer.Controller
* @Author tanjianglong
* @CreatedTime 2017/8/22.
* @Description : eureka-consumer-feign demo
* 修改記錄:
* 1:直接調(diào)用 http
* 2:提供熔斷 降級服務(wù)
*/
@RestController
public class DcController {
@Autowired
private DcClient dcClient; //調(diào)用服務(wù)接口
@GetMapping("/consumer")
public String dc() {
return dcClient.consumer();
}
}
DcClient 代碼
@FeignClient(value = "eureka-client",fallback = DcClientImpl.class )
public interface DcClient {
@GetMapping("/dc")
public String consumer();
}
- A: @FeignClient用于通知Feign組件對該接口進(jìn)行代理(不需要編寫接口實(shí)現(xiàn)),使用者可直接通過@Autowired注入。
- B: @RequestMapping表示在調(diào)用該方法時(shí)需要向/dc發(fā)送GET請求。
開發(fā)者通過dcClient.consumer()就能完成發(fā)送HTTP請求和解碼HTTP返回結(jié)果并封裝成對象的過程。
通訊協(xié)議:
- Feign在默認(rèn)情況下使用的是JDK原生的URLConnection發(fā)送HTTP請求,沒有連接池,但是對每個(gè)地址會(huì)保持一個(gè)長連接,即利用HTTP的persistence connection 。我們可以用Apache的HTTP Client替換Feign原始的http client, 從而獲取連接池、超時(shí)時(shí)間等與性能息息相關(guān)的控制能力。Spring Cloud從Brixtion.SR5版本開始支持這種替換,首先在項(xiàng)目中聲明Apache HTTP Client和feign-httpclient依賴:
<!-- 使用Apache HttpClient替換Feign原生httpclient -->
<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpclient</artifactId>
</dependency>
<dependency>
<groupId>com.netflix.feign</groupId>
<artifactId>feign-httpclient</artifactId>
<version>${feign-httpclient}</version>
</dependency>
與dubbo的通訊協(xié)議區(qū)別-
服務(wù)容錯(cuò)保護(hù)(Hystrix服務(wù)降級 && 斷路由)
熔斷器
定義
熔斷器,容錯(cuò)管理工具,旨在通過熔斷機(jī)制控制服務(wù)和第三方庫的節(jié)點(diǎn),從而對延遲和故障提供更強(qiáng)大的容錯(cuò)能力。
熔斷器的作用就是即時(shí)發(fā)現(xiàn)運(yùn)行異常的服務(wù), 告知調(diào)用者不再調(diào)用該服務(wù)接口, 從而避免調(diào)用者服務(wù)資源消耗殆盡。 原理如官網(wǎng)插圖:

配置使用
SpringCloud框架內(nèi)微服務(wù)間交互使用Rest或Feign:
maven依賴
<!-- 服務(wù)降級,斷路由相關(guān) -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-hystrix</artifactId>
</dependency>
restTemplate 中使用方式
/**
* @author 0217319
* @version V1.0
* @Description: 調(diào)用接口類
* @date 2018.8.22
*/
@Service
public class ConsumerService {
@Autowired
RestTemplate restTemplate;
@HystrixCommand(fallbackMethod = "fallback")//服務(wù)異常后執(zhí)行的方法
public String consumer() {
return restTemplate.getForObject("http://eureka-client/dc", String.class);
}
public String fallback() {
return "fallback is execute";
}
}
Feign + Hystrix 使用方式:
OpenFeign是自帶斷路器的, 不用在pom.xml和入口類添加新增引用, 但hytrix默認(rèn)是關(guān)閉的, 需要在配置文件中加入這個(gè)即可
feign.hystrix.enabled=true。
代碼使用(首先會(huì)調(diào)用 eureka-client 服務(wù)的 /DC接口 如果發(fā)生短融 ,則會(huì)調(diào)用 DcClientImpl 類的consumer方法)
@FeignClient(value = "eureka-client",fallback = DcClientImpl.class )
public interface DcClient {
@GetMapping("/dc")
String consumer();
}
public class DcClientImpl implements DcClient {
@Override
public String consumer() {
return "error -----";
}
}
依賴隔離
定義
Hystrix則使用該模式實(shí)現(xiàn)線程池的隔離,它會(huì)為每一個(gè)Hystrix命令創(chuàng)建一個(gè)獨(dú)立的線程池,這樣就算某個(gè)在Hystrix命令包裝下的依賴服務(wù)出現(xiàn)延遲過高的情況,也只是對該依賴服務(wù)的調(diào)用產(chǎn)生影響,而不會(huì)拖慢其他的服務(wù)。
- 通過對依賴服務(wù)的線程池隔離實(shí)現(xiàn),可以帶來如下優(yōu)勢:
- 應(yīng)用自身得到完全的保護(hù),不會(huì)受不可控的依賴服務(wù)影響。即便給依賴服務(wù)分配的線程池被填滿,也不會(huì)影響應(yīng)用自身的額其余部分。
- 可以有效的降低接入新服務(wù)的風(fēng)險(xiǎn)。如果新服務(wù)接入后運(yùn)行不穩(wěn)定或存在問題,完全不會(huì)影響到應(yīng)用其他的請求。
- 當(dāng)依賴的服務(wù)從失效恢復(fù)正常后,它的線程池會(huì)被清理并且能夠馬上恢復(fù)健康的服務(wù),相比之下容器級別的清理恢復(fù)速度要慢得多。
- 當(dāng)依賴的服務(wù)出現(xiàn)配置錯(cuò)誤的時(shí)候,線程池會(huì)快速的反應(yīng)出此問題(通過失敗次數(shù)、延遲、超時(shí)、拒絕等指標(biāo)的增加情況)。同時(shí),我們可以在不影響應(yīng)用功能的情況下通過實(shí)時(shí)的動(dòng)態(tài)屬性刷新(后續(xù)會(huì)通過Spring Cloud Config與Spring Cloud Bus的聯(lián)合使用來介紹)來處理它。
- 當(dāng)依賴的服務(wù)因?qū)崿F(xiàn)機(jī)制調(diào)整等原因造成其性能出現(xiàn)很大變化的時(shí)候,此時(shí)線程池的監(jiān)控指標(biāo)信息會(huì)反映出這樣的變化。同時(shí),我們也可以通過實(shí)時(shí)動(dòng)態(tài)刷新自身應(yīng)用對依賴服務(wù)的閾值進(jìn)行調(diào)整以適應(yīng)依賴方的改變。
- 除了上面通過線程池隔離服務(wù)發(fā)揮的優(yōu)點(diǎn)之外,每個(gè)專有線程池都提供了內(nèi)置的并發(fā)實(shí)現(xiàn),可以利用它為同步的依賴服務(wù)構(gòu)建異步的訪問。
斷路由
定義
“斷路器”本身是一種開關(guān)裝置,用于在電路上保護(hù)線路過載,當(dāng)線路中有電器發(fā)生短路時(shí),“斷路器”能夠及時(shí)的切斷故障電路,防止發(fā)生過載、發(fā)熱、甚至起火等嚴(yán)重后果。
在分布式架構(gòu)中,斷路器模式的作用也是類似的,當(dāng)某個(gè)服務(wù)單元發(fā)生故障(類似用電器發(fā)生短路)之后,通過斷路器的故障監(jiān)控(類似熔斷保險(xiǎn)絲),直接切斷原來的主邏輯調(diào)用。但是,在Hystrix中的斷路器除了切斷主邏輯的功能之外,還有更復(fù)雜的邏輯。還有自我修復(fù)功能`
熔斷器

- 服務(wù)的健康狀況 = 請求失敗數(shù) / 請求總數(shù). 熔斷器開關(guān)由關(guān)閉到打開的狀態(tài)轉(zhuǎn)換是通過當(dāng)前服務(wù)健康狀況和設(shè)定閾值比較決定的.
- 當(dāng)熔斷器開關(guān)關(guān)閉時(shí), 請求被允許通過熔斷器. 如果當(dāng)前健康狀況高于設(shè)定閾值, 開關(guān)繼續(xù)保持關(guān)閉. 如果當(dāng)前健康狀況低于設(shè)定閾值, 開關(guān)則切換為打開狀態(tài).
- 當(dāng)熔斷器開關(guān)打開時(shí), 請求被禁止通過.
- 當(dāng)熔斷器開關(guān)處于打開狀態(tài), 經(jīng)過一段時(shí)間后, 熔斷器會(huì)自動(dòng)進(jìn)入半開狀態(tài), 這時(shí)熔斷器只允許一個(gè)請求通過. 當(dāng)該請求調(diào)用成功時(shí), 熔斷器恢復(fù)到關(guān)閉狀態(tài). 若該請求失敗, 熔斷器繼續(xù)保持打開狀態(tài), 接下來的請求被禁止通過.
- 熔斷器的開關(guān)能保證服務(wù)調(diào)用者在調(diào)用異常服務(wù)時(shí), 快速返回結(jié)果, 避免大量的同步等待. 并且熔斷器能在一段時(shí)間后繼續(xù)偵測請求執(zhí)行結(jié)果, 提供恢復(fù)服務(wù)調(diào)用的可能.
Hystrix的內(nèi)部處理邏輯

- 構(gòu)建Hystrix的Command對象, 調(diào)用執(zhí)行方法.
- Hystrix檢查當(dāng)前服務(wù)的熔斷器開關(guān)是否開啟, 若開啟, 則執(zhí)行降級服務(wù)getFallback方法.
- 若熔斷器開關(guān)關(guān)閉, 則Hystrix檢查當(dāng)前服務(wù)的線程池是否能接收新的請求, 若超過線程池已滿, 則執(zhí)行降級服務(wù)getFallback方法.
- 若線程池接受請求, 則Hystrix開始執(zhí)行服務(wù)調(diào)用具體邏輯run方法.
- 若服務(wù)執(zhí)行失敗, 則執(zhí)行降級服務(wù)getFallback方法, 并將執(zhí)行結(jié)果上報(bào)Metrics更新服務(wù)健康狀況.
熔斷器DEMO-代碼
Hystrix監(jiān)控面板
定義
斷路器是根據(jù)一段時(shí)間窗內(nèi)的請求情況來判斷并操作斷路器的打開和關(guān)閉狀態(tài)的。而這些請求情況的指標(biāo)信息都是HystrixCommand和HystrixObservableCommand實(shí)例在執(zhí)行過程中記錄的重要度量信息,它們除了Hystrix斷路器實(shí)現(xiàn)中使用之外,對于系統(tǒng)運(yùn)維也有非常大的幫助。這些指標(biāo)信息會(huì)以“滾動(dòng)時(shí)間窗”與“桶”結(jié)合的方式進(jìn)行匯總,并在內(nèi)存中駐留一段時(shí)間,以供內(nèi)部或外部進(jìn)行查詢使用,Hystrix Dashboard就是這些指標(biāo)內(nèi)容的消費(fèi)者之一。
使用
maven依賴
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-hystrix</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-hystrix-dashboard</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
代碼啟動(dòng)
為應(yīng)用主類加上@EnableHystrixDashboard,啟用Hystrix Dashboard功能。
效果--啟動(dòng)查看
http://localhost:3100/hystrix.stream
三,SpringCloud 和 Dubbo 對比
通訊協(xié)議
- Dubbo支持dubbo、rmi、hessian、http、webservice、thrift、redis等多種協(xié)議,但是Dubbo官網(wǎng)是推薦我們使用Dubbo協(xié)議的。
缺省協(xié)議,使用基于mina1.1.7+hessian3.2.1的tbremoting交互。
連接個(gè)數(shù):單連接
連接方式:長連接
傳輸協(xié)議:TCP
傳輸方式:NIO異步傳輸
序列化:Hessian二進(jìn)制序列化
適用范圍:傳入傳出參數(shù)數(shù)據(jù)包較?。ńㄗh小于100K),消費(fèi)者比提供者個(gè)數(shù)多,單一消費(fèi)者無法壓滿提供者,盡量不要用dubbo協(xié)議傳輸大文件或超大字符串。
適用場景:常規(guī)遠(yuǎn)程服務(wù)方法調(diào)用
其他鏈接(http,webservice,rmi協(xié)議,hessian協(xié)議)
連接個(gè)數(shù):多連接
連接方式:短連接
傳輸協(xié)議:TCP || HTTP
傳輸方式:同步傳輸
序列化:***
不支持文件傳輸
- SpringCloud 默認(rèn) 使用http json傳輸
Spring Cloud也并不是和http+JSON強(qiáng)制綁定的,如有必要Thrift、protobuf等高效的RPC、序列化協(xié)議同樣可以作為替代方案
差異:
dubbo由于是二進(jìn)制的傳輸,占用帶寬會(huì)更少
springCloud是http協(xié)議傳輸,帶寬會(huì)比較多,同時(shí)使用http協(xié)議一般會(huì)使用JSON報(bào)文,消耗會(huì)更大
dubbo大多數(shù)情況下都是使用長連接小數(shù)據(jù)量的模式提供服務(wù)使用的。所以,對于類似于電商等同步調(diào)用場景多并且能支撐搭建Dubbo 這套比較復(fù)雜環(huán)境的成本的產(chǎn)品而言,Dubbo 確實(shí)是一個(gè)可以考慮的選擇。但如果產(chǎn)品業(yè)務(wù)中由于后臺(tái)業(yè)務(wù)邏輯復(fù)雜、時(shí)間長而導(dǎo)致異步邏輯比較多的話,可能Dubbo 并不合適。
平臺(tái)架構(gòu)
- dubbo框架只是專注于服務(wù)之間的治理,如果我們需要使用配置中心、分布式跟蹤這些內(nèi)容都需要自己去集成,這樣無形中使用dubbo的難度就會(huì)增加。
- Spring Cloud幾乎考慮了服務(wù)治理的方方面面,更有Spring Boot這個(gè)大將的支持,開發(fā)起來非常的便利和簡單。
社區(qū)維護(hù)性:
- Dubbo,是阿里巴巴服務(wù)化治理的核心框架,并被廣泛應(yīng)用于中國各互聯(lián)網(wǎng)公司.但是沒有專門的團(tuán)隊(duì)在維護(hù)更新了,需要使用者自己就必須要組建一個(gè)維護(hù)團(tuán)隊(duì),先不論你要準(zhǔn)備要集成多少功能做多少改造。包括自己想集成的東西,和現(xiàn)有版本的坑~
- Spring Cloud是大名鼎鼎的Spring家族的產(chǎn)品。Spring專注于企業(yè)級開源框架的研發(fā),不論是在中國還是在世界上使用都非常廣泛.自從發(fā)展到現(xiàn)在,仍然在不斷的高速發(fā)展,版本和功能將會(huì)更加完善,我們可以重持續(xù)升級的版本中獲益~
四,總結(jié)
尋址服務(wù)
前端使用服務(wù)名而非ip地址調(diào)用接口
SpringCloud 帶來的不便和方便
開發(fā)成本,業(yè)務(wù)劃分,
監(jiān)控服務(wù)
SQL慢查詢,節(jié)點(diǎn)機(jī)內(nèi)存,Cpu使用情況,線程數(shù),接口響應(yīng)時(shí)間統(tǒng)計(jì)
QBS
部分接口做單位時(shí)間內(nèi)最大訪問數(shù)限制
五,參考資料
個(gè)人覺得比較好的基礎(chǔ)教程: