Spring Cloud源碼學習:服務治理

1、構建服務註冊中心

服務治理:

服務治理能夠說是微服務架構中最爲核心和基礎的模塊,主要用來實現各個微服務實例的自動化註冊與發現。 使用服務治理的緣由:在服務引用並不算多的時候,能夠經過靜態配置來完成服務的調用,但隨着業務的發展,系統功能愈來愈複雜,相應的微服務也不斷增長,此時靜態配置會變得愈來愈難以維護。而且面對不斷髮展的業務,集羣規模,服務的位置、服務的命名等都有可能發生變化,若是仍是經過手工維護的方式,極易發生錯誤或是命名衝突等問題。同時,也將消耗大量的人力來維護靜態配置的內容。爲了解決微服務架構中的服務實例維護問題,就產生了大量的服務治理框架和產品。這些框架和產品的實現都圍繞着服務註冊與服務發現機制來完成對微服務應用實例的自動化管理。緩存

2、服務註冊與發現

1.服務提供者怎麼註冊到服務中心的

註冊到服務中心的主要都有哪些信息: ip、port(端口)、instance_id(實例id)、name(服務名)等。 當eureka客戶端啓動的時候,EurekaClientConfiguration讀書客戶端配置信息,建立一個InstanceInfo實例,而後交給ApplicationInfoManager管理,下面看段代碼:bash

@Configuration
    @ConditionalOnMissingRefreshScope
    protected static class EurekaClientConfiguration {

        @Autowired
        private ApplicationContext context;

        @Autowired(required = false)
        private DiscoveryClientOptionalArgs optionalArgs;

        @Bean(destroyMethod = "shutdown")
        @ConditionalOnMissingBean(value = EurekaClient.class, search = SearchStrategy.CURRENT)
        public EurekaClient eurekaClient(ApplicationInfoManager manager,
                EurekaClientConfig config) {
            return new CloudEurekaClient(manager, config, this.optionalArgs,
                    this.context);
        }

        @Bean
        @ConditionalOnMissingBean(value = ApplicationInfoManager.class, search = SearchStrategy.CURRENT)
        public ApplicationInfoManager eurekaApplicationInfoManager(
                EurekaInstanceConfig config) {
                //獲取配置 建立實例 
            InstanceInfo instanceInfo = new InstanceInfoFactory().create(config);
            return new ApplicationInfoManager(config, instanceInfo);
        }
    }
複製代碼

在實例化過程當中,DiscoveryClient的HeartbeatThread定時任務會不斷掃描,找到未註冊的實例,並註冊到服務中心,下面DiscoveryClient類的某段代碼:restful

/**
 * The heartbeat task that renews the lease in the given intervals.
 * 心跳,註冊定時任務
 */
    private class HeartbeatThread implements Runnable {

        public void run() {
            if (renew()) {
                lastSuccessfulHeartbeatTimestamp = System.currentTimeMillis();
            }
        }
    }

     /**
     * Renew with the eureka service by making the appropriate REST call
     */
    boolean renew() {
        EurekaHttpResponse<InstanceInfo> httpResponse;
        try {
            //向註冊中心發送一個註冊請求
            httpResponse = eurekaTransport.registrationClient.sendHeartBeat(instanceInfo.getAppName(), instanceInfo.getId(), instanceInfo, null);
            logger.debug("{} - Heartbeat status: {}", PREFIX + appPathIdentifier, httpResponse.getStatusCode());
            //當註冊中心返回404,證實這個實例沒註冊,則進行註冊,不然返回註冊成功
            if (httpResponse.getStatusCode() == 404) {
                REREGISTER_COUNTER.increment();
                logger.info("{} - Re-registering apps/{}", PREFIX + appPathIdentifier, instanceInfo.getAppName());
                return register();
            }
            return httpResponse.getStatusCode() == 200;
        } catch (Throwable e) {
            logger.error("{} - was unable to send heartbeat!", PREFIX + appPathIdentifier, e);
            return false;
        }
    }

       /**
     * Register with the eureka service by making the appropriate REST call.
     * 向服務端註冊方法
     */
    boolean register() throws Throwable {
        logger.info(PREFIX + appPathIdentifier + ": registering service...");
        EurekaHttpResponse<Void> httpResponse;
        try {
            httpResponse = eurekaTransport.registrationClient.register(instanceInfo);
        } catch (Exception e) {
            logger.warn("{} - registration failed {}", PREFIX + appPathIdentifier, e.getMessage(), e);
            throw e;
        }
        if (logger.isInfoEnabled()) {
            logger.info("{} - registration status: {}", PREFIX + appPathIdentifier, httpResponse.getStatusCode());
        }
        return httpResponse.getStatusCode() == 204;
    }
複製代碼

2.服務是如何消費的

在微服務架構中,業務都會被拆分紅一個獨立的服務,服務與服務的通信是基於http restful的。Spring cloud有兩種服務調用方式,一種是ribbon+restTemplate,另外一種是feign。架構

①RestTemplate和Ribbon相結合

Ribbon是Netflix公司開源的一個負載均衡的項目,是一個客戶端負載均衡器,運行在客戶端上。它是一個通過了雲端測試的IPC庫,能夠很好地控制HTTP和TCP客戶端的一些行爲。 Feign已經默認使用了Ribbon。app

  • 負載均衡
  • 容錯
  • 多協議(HTTP,TCP,UDP)支持異步和反應模型
  • 緩存和批處理

深刻理解及源碼:blog.csdn.net/forezp/arti…負載均衡

②Feign

Feign是一個聲明式的僞Http客戶端,它使得寫Http客戶端變得更簡單。使用Feign,只須要建立一個接口並註解。它具備可插拔的註解特性,可以使用Feign 註解和JAX-RS註解。Feign支持可插拔的編碼器和解碼器。Feign默認集成了Ribbon,並和Eureka結合,默認實現了負載均衡的效果。框架

簡而言之:異步

  • Feign 採用的是基於接口的註解
  • Feign 整合了ribbon,具備負載均衡的能力
  • 整合了Hystrix,具備熔斷的能力

深刻理解及源碼: blog.csdn.net/forezp/arti…微服務

使用Ribbon+RestTemplate時,利用RestTemplate對http請求的封裝處理,造成了一套模板化的調用方式。但實際開發中,因爲對服務的依賴調用可能不止一處,每每一個接口會被多出調用,因此一般會針對每一個微服務自行封裝一些客戶端類來包裝這些依賴服務的調用。因此Fegin字此基礎上作了進一步封裝,由它來幫助咱們定義和實現依賴服務接口的定義。在Feign的實現下,咱們只須要建立一個接口並使用註解的方式來配置它(之前是Dao接口上面添加Mapper註解,如今是一個微服務接口上面標註一個Feign註解),便可完成服務提供方的接口綁定,簡化使用Spring Cloud Ribbon時,自動封裝服務調用客戶的開發量。測試

3、Eureka的基礎架構

服務註冊中心

  • 失效剔除
  • 自我保護

服務提供者

  • 服務註冊
  • 服務同步
  • 服務續約

服務消費者

  • 獲取服務
  • 服務調用
  • 服務下線

4、Eureka的服務治理機制

5、Eureka的配置

  • 服務註冊相關的配置信息,包括服務註冊中心的地址、服務獲取的間隔時間、可用區域等;
  • 服務實例相關的配置信息,包括服務實例的名稱、IP地址、端口號、健康檢查路徑等。
相關文章
相關標籤/搜索