Spring Cloud 學習筆記(二)——Netflix

4 Spring Cloud Netflix

Spring Cloud 經過自動配置和綁定到Spring環境和其餘Spring編程模型慣例,爲Spring Boot應用程序提供Netflix OSS集成。 經過幾個簡單的註釋,能夠快速啓用和配置應用程序中的常見功能模塊,並使用久經考驗的Netflix組件構建大型分佈式系統。 提供的功能模塊包括服務發現(Eureka),斷路器(Hystrix),智能路由(Zuul)和客戶端負載均衡(Ribbon)。前端

4.1 服務發現:Eureka客戶端

服務發現是microservice基礎架構的關鍵原則之一。Eureka是Netflix服務發現的一種服務和客戶端。java

4.1.1 註冊到Eureka

當一個客戶端註冊到Eureka,它提供關於本身的元數據(諸如主機和端口,健康指標URL,首頁等)Eureka經過一個服務從各個實例接收心跳信息。若是心跳接收失敗超過配置的時間,實例將會正常從註冊裏面移除。web

可使用@EnableEurekaClient@EnableDiscoveryClient註解。
配置eureka.client.serviceUrl.defaultZone=http://localhost:8761/eureka/屬性,注意修改URL地址。
確保spring.application.name有默認值。spring

@EnableEurekaClient只能用於Eureka,@EnableDiscoveryClient能用於zookeeper等其餘註冊組件。編程

@EnableEurekaClient使其成爲Eureka實例(被其餘服務發現)和客戶端(能發現其餘服務)註冊到應用裏面。可經過eureka.instance.*進行相關配置的修改。後端

4.1.2 對Eureka服務的身份驗證

若是其中一個eureka.client.serviceUrl.defaultZone的url已經把憑證嵌入到它裏面,那麼HTTP基本的身份驗證將會被自動添加到你的eureka客戶端(curl風格,如http://user:password@localhost:8761/eureka)。 對於更復雜的需求,能夠建立一個帶「@Bean」註解的「DiscoveryClientOptionalArgs」類型而且爲它注入「ClientFilter」實例。api

4.1.3 健康指標和狀態頁面

健康指標和狀態頁面分別對應一個Eureka實例的「/health」和「/info」。spring-mvc

4.1.4 註冊一個安全應用

若要用HTTPS,須要設置兩個標記,分別是EurekaInstanceConfig,即eureka.instance.[nonSecurePortEnabled,securePortEnabled]=[false,true]緩存

4.1.5 Eureka 健康檢查

默認狀況下,Eureka使用客戶端心跳來肯定一個客戶端是否活着(狀態爲「UP」)。安全

4.1.6 Eureka給客戶端和實例的元數據

有標準的元數據,如主機名、IP地址、端口號、狀態頁面和健康檢查。額外的元數據能夠被添加到實例註冊在eureka.instance.metadataMap裏面。

在 Cloudfoundry 使用 Eureka
Cloudfoundry有總的路由,全部在同個應用的實例有相同的主機名。

在AWS上使用Eureka
定製EurekaInstanceConfigBean

修改Eureka實例ID
經過eureka.instance.instanceId進行配置。

4.1.7 使用EurekaClient

使用@EnableDiscoveryClient(或@EnableEurekaClient),使它從Eureka Server發現服務實例。

注:不要在@PostConstruct方法或@Scheduled方法使用EurekaClient(或任何ApplicationContext還沒被啓動的地方)。

4.1.8 代替原生的Netflix EurekaClient

Spring Cloud已經支持Feign(一個REST客戶端構建)跟Spring RestTemplate(使用邏輯Eureka服務標識符(VIPs)代替物理的URL)。

4.1.9 爲何註冊一個服務這麼慢?

實例默認與註冊中心持續30秒的週期心跳(經過客戶的serviceUrl)。當實例、服務端和客戶端全都在它們的緩存裏面擁有相同的元數據(這可能還須要3次心跳),那麼服務對於客戶端的discovery將變爲不可用。可經過eureka.instance.leaseRenewalIntervalInSeconds這個修改配置,能夠加快這一進程的客戶端鏈接到其餘服務。


4.2 服務發現: Eureka Server

例子,添加依賴spring-cloud-starter-eureka-server

@SpringBootApplication
@EnableEurekaServer
public class Application {
    public static void main(String[] args) {
        new SpringApplicationBuilder(Application.class).web(true).run(args);
    }
}

服務端有一個帶UI的首頁,HTTP API端點在/eureka/*下提供標準的Eureka功能。

4.2.1 高可用

Eureka服務端沒有後臺存儲,可是服務實例在註冊裏面全都得發送心跳去保持註冊更新(在內存裏操做)客戶端們也有一分內存緩存着eureka的註冊信息。

4.2.2 標準模式

eureka.client.registerWithEureka=false
eureka.client.fetchRegistry=false
eureka.client.serviceUrl.defaultZone=http://${eureka.instance.hostname}:${server.port}/eureka/

4.2.3 節點感知

運行多個Eureka Servers。

Eureka甚至能夠更有彈性和可用的運行多個實例,並讓他們互相註冊。事實上,這也是默認的行爲,所以全部你須要讓它工做的,只要添加一個有效的節點serviceUrl,例如:

---
spring:
  profiles: peer1
eureka:
  instance:
    hostname: peer1
  client:
    serviceUrl:
      defaultZone: http://peer2/eureka/

---
spring:
  profiles: peer2
eureka:
  instance:
    hostname: peer2
  client:
    serviceUrl:
      defaultZone: http://peer1/eureka/

而後經過不一樣的「profile」進行運行不一樣的Eureka Server。

4.2.4 IP偏好

設置eureka.instance.preferIpAddress=true使應用註冊到eureka的是IP地址而不是主機名。


4.3 斷路器:Hystrix

Netflix建立了一個庫實現斷路器模式,名爲Hystrix。一個低水平的服務羣中一個服務掛掉會給用戶致使級聯失效的。當調用一個特定的服務達到必定閾值(在Hystrix裏默認是5秒內20個失敗),斷路器開啓而且調用沒有成功的。開發人員可以提供錯誤緣由和開啓一個斷路由回調。

例子,需添加依賴org.springframework.cloud.spring-cloud-starter-hystrix

@SpringBootApplication
@EnableCircuitBreaker
public class Application {

    public static void main(String[] args) {
        new SpringApplicationBuilder(Application.class).web(true).run(args);
    }

}

@Component
public class StoreIntegration {

    @HystrixCommand(fallbackMethod = "defaultStores")
    public Object getStores(Map<String, Object> parameters) {
        //do stuff that might fail
    }

    public Object defaultStores(Map<String, Object> parameters) {
        return /* something useful */;
    }
}

經測試,失敗就直接調用defaultStores()方法了。

4.3.1 傳播安全上下文或使用 Spring Scopes

若是你想一些線程的本地的上下文傳播到一個@HystrixCommand,默認聲明將不會工做,由於他在線程池裏執行命令。(在超時的狀況下)。你能夠切換Hystrix去使用同個線程讓調用者使用一些配置,或直接在註解中,讓它去使用不一樣的「隔離策略」。舉例:

@HystrixCommand(fallbackMethod = "stubMyService",
    commandProperties = {
      @HystrixProperty(name="execution.isolation.strategy", value="SEMAPHORE")
    }
)
...

若是你使用@SessionScope@RequestScope一樣適用。你會知道你要這麼作,由於一個runtime異常說他不能找到做用域上下文。

4.3.2 健康指標

鏈接的斷路器的狀態也暴露在應用程序的/health端點中。

4.3.3 Hystrix 指標流

添加依賴org.springframework.boot.spring-boot-starter-actuator,使/hystrix.stream流做爲一個管理端點。

4.4 斷路器: Hystrix儀表盤

Hystrix的主要做用是會採集每個HystrixCommand的信息指標,把每個斷路器的信息指標顯示的Hystrix儀表盤上。
Hystrix儀表盤

環境須要

  • 添加依賴org.springframework.cloud.spring-cloud-starter-hystrix-dashboard
  • 主類上註解@EnableHystrixDashboard
  • 訪問/hystrix
  • 填寫連接http://host:port/hystrix.stream

4.4.1 Turbine

4.4.2 Turbine Stream


4.5 客戶端負載均衡器:Ribbon

Ribbon是一個客戶端負載均衡器,有不少控制HTTP和TCP客戶端的行爲,可以使用@FeignClient註解。

4.5.1 自定義Ribbon客戶端

4.5.2 在Eureka中使用Ribbon

4.5.3 示例: 沒有Eureka時如何使用Ribbon

4.5.4 示例:禁用Eureka使用Ribbon

4.5.5 直接使用Ribbon的API

public class MyClass {
    @Autowired
    private LoadBalancerClient loadBalancer;

    public void doStuff() {
        ServiceInstance instance = loadBalancer.choose("stores");
        URI storesUri = URI.create(String.format("http://%s:%s", instance.getHost(), instance.getPort()));
        // ... do something with the URI
    }
}

4.6 聲明REST客戶端:Feign


4.7 外部配置:Archaius


4.8 路由和過濾器:Zuul

Zuul是Netflix出品的一個基於JVM路由和服務端的負載均衡器。

  • 認證
  • Insights
  • 壓力測試
  • 金絲雀測試(Canary Testing)
  • 動態路由
  • 服務遷移
  • 負載削減
  • 安全
  • 靜態響應處理
  • 主動/主動交換管理

4.8.1 嵌入Zuul反向代理

Spring Cloud建立了一個嵌入式Zuul代理來緩和急需一個UI應用程序來代理調用一個或多個後端服務的通用需求,這個功能對於代理前端須要訪問的後端服務很是有用,避免了全部後端服務須要關心管理CORS和認證的問題。

在Spring Boot主函數上經過註解@EnableZuulProxy來開啓。

4.8.2 Cookies和敏感HTTP頭

4.8.3 路由Endpoint

使用@EnableZuulProxy同時引入了Spring Boot Actuator,默認將增長一個endpoint,提供http服務的/routes

4.8.4 窒息模式和本地跳轉

逐步替代舊的接口是一種通用的遷移現有應用程序或者API的方式,使用不一樣的具體實現逐步替換它們。Zuul代理是一種頗有用的工具,由於你可使用這種方式處理全部客戶端到舊接口的請求。只是重定向了一些請求到新的接口。

4.8.5 經過Zuul上傳文件

4.8.6 簡單的嵌入Zuul

4.8.7 關閉Zuul過濾器

4.8.8 經過Sidecar進行多語言支持


4.9 RxJava with Spring MVC

Spring Cloud Netflix 包含 RxJava。

Spring Cloud Netflix提供並支持從Spring MVC Controllers返回rx.Single對象,還支持使用rx.Observable對象。


4.10 指標:Spectator, Servo, and Atlas

相關文章
相關標籤/搜索