SpringCloud簡單入門及應(yīng)用

注:一些內(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):

Eureka的基礎(chǔ)架構(gòu)

服務(wù)提供

服務(wù)提供者

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

服務(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)插圖:

image

配置使用

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ù)功能`

熔斷器

image
  • 服務(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)部處理邏輯

image
  • 構(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ǔ)教程:

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容