1. 程式人生 > 其它 >Spring cloud入門

Spring cloud入門

1. 概念

Spring Cloud是一系列框架的有序集合。它利用Spring Boot的開發便利性巧妙地簡化了分散式系統基礎設施的開發,如服務發現註冊、配置中心、訊息匯流排、負載均衡、斷路器、資料監控等,都可以用Spring Boot的開發風格做到一鍵啟動和部署。Spring Cloud並沒有重複製造輪子,它只是將各家公司開發的比較成熟、經得起實際考驗的服務框架組合起來,通過Spring Boot風格進行再封裝遮蔽掉了複雜的配置和實現原理,最終給開發者留出了一套簡單易懂、易部署和易維護的分散式系統開發工具包。

  • Spring Cloud Netflix  是對Netflix開發的一套分散式服務框架的封裝,包括服務的發現和註冊,負載均衡、斷路器、REST客戶端、請求路由等。
  • Spring Cloud Config  將配置資訊中央化儲存, 配置Spring Cloud Bus可以實現動態修改配置檔案
  • Spring Cloud Bus  分散式訊息佇列,是對Kafka, MQ的封裝
  • Spring Cloud Security  對Spring Security的封裝,並能配合Netflix使用
  • Spring Cloud Zookeeper  對Zookeeper的封裝,使之能配置其它Spring Cloud的子專案使用
  • Spring Cloud Eureka 是 Spring Cloud Netflix 微服務套件中的一部分,它基於Netflix Eureka 做了二次封裝,主要負責完成微服務架構中的服務治理功能。

1.1微服務架構的優勢

使用微服務架構能夠為我們帶來如下好處:
1)服務的獨立部署
每個服務都是一個獨立的專案,可以獨立部署,不依賴於其他服務,耦合性低。
2)服務的快速啟動
拆分之後服務啟動的速度必然要比拆分之前快很多,因為依賴的庫少了,程式碼量也少了。
3)更加適合敏捷開發
敏捷開發以使用者的需求進化為核心,採用迭代、循序漸進的方法進行。服務拆分可以快速釋出新版本,修改哪個服務只需要釋出對應的服務即可,不用整體重新發布。
4)職責專一,由專門的團隊負責專門的服務
業務發展迅速時,研發人員也會越來越多,每個團隊可以負責對應的業務線,服務的拆分有利於團隊之間的分工。
5)服務可以動態按需擴容
當某個服務的訪問量較大時,我們只需要將這個服務擴容即可。
6)程式碼的複用
每個服務都提供 REST API,所有的基礎服務都必須抽出來,很多的底層實現都可以以介面方式提供。

1.2微服務架構的劣勢

1)分散式部署,呼叫的複雜性高
單體應用的時候,所有模組之前的呼叫都是在本地進行的,在微服務中,每個模組都是獨立部署的,通過 HTTP 來進行通訊,這當中會產生很多問題,比如網路問題、容錯問題、呼叫關係等。
2)獨立的資料庫,分散式事務的挑戰
每個微服務都有自己的資料庫,這就是所謂的去中心化的資料管理。這種模式的優點在於不同的服務,可以選擇適合自身業務的資料,比如訂單服務可以用 MySQL、評論服務可以用 Mongodb、商品搜尋服務可以用 Elasticsearch。

缺點就是事務的問題了,目前最理想的解決方案就是柔性事務中的最終一致性,後面的章節會給大家做具體介紹。
3)測試的難度提升
服務和服務之間通過介面來互動,當介面有改變的時候,對所有的呼叫方都是有影響的,這時自動化測試就顯得非常重要了,如果要靠人工一個個介面去測試,那工作量就太大了。這裡要強調一點,就是 API 文件的管理尤為重要。
4)運維難度的提升
在採用傳統的單體應用時,我們可能只需要關注一個 Tomcat 的叢集、一個 MySQL 的叢集就可以了,但這在微服務架構下是行不通的。當業務增加時,服務也將越來越多,服務的部署、監控將變得非常複雜,這個時候對於運維的要求就高了。

1.3 Spring Cloud模組介紹

  • Eureka:服務註冊中心,用於服務管理。
  • Ribbon:基於客戶端的負載均衡元件。
  • Hystrix:容錯框架,能夠防止服務的雪崩效應。
  • Feign:Web 服務客戶端,能夠簡化 HTTP 介面的呼叫。
  • Zuul:API 閘道器,提供路由轉發、請求過濾等功能。
  • Config:分散式配置管理。
  • Sleuth:服務跟蹤。
  • Stream:構建訊息驅動的微服務應用程式的框架。
  • Bus:訊息代理的叢集訊息匯流排。

1.4 Spring Cloud與Dubbo功能對比

功能名稱 Dubbo Spring Cloud
服務註冊中心 ZooKeeper Spring Cloud Netflix Eureka
服務呼叫方式 RPC REST API
服務閘道器 Spring Cloud Netflix Zuul
斷路器 不完善 pring Cloud Netflix Hystrix
分散式配置 Spring Cloud Config
服務跟蹤 Spring Cloud Sleuth
訊息匯流排 Spring Cloud Bus
資料流 Spring Cloud Stream
批量任務 Spring Cloud Task

1.5 讀取配置檔案

。Spring Boot 中的配置通常放在 application.properties 中,讀取配置資訊非常方便,總共分為 3 種方式:

  1. Environment
    可以通過 Environment 的 getProperty 方法來獲取想要的配置資訊,程式碼如下所示。
@RestController
public class HelloController {
    // 注入物件
    @Autowired
    private Environment env;
    @GetMapping("/hello")
    public String hello() {
        // 讀取配置
        String port = env.getProperty("server.port");
        return port;
    }
}
  1. @Value
    可以注入具體的配置資訊,程式碼如下所示。
@RestController
public class HelloController {
    // 注入配置
    @Value("${server.port}")
    private String port;
    @GetMapping("/hello")
    public String hello() {
        return port;
    }
}
  1. 自定義配置
    prefix 定義配置的字首,程式碼如下所示。
@ConfigurationProperties(prefix = "net.biancheng")
@Component
public class MyConfig {
    private String name;
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
}

讀取配置的方法程式碼如下所示。

@RestController
public class HelloController {
    @Autowired
    private MyConfig myConfig;
    @GetMapping("/hello")
    public String hello() {
        return myConfig.getName();
    }
}

定義配置 application.properties 的方法如下:

net.biancheng.name=zhangsan

1.6 profiles 多環境配置