1. 程式人生 > >SpringCloud學習筆記1 - 20181127

SpringCloud學習筆記1 - 20181127

一.引言

  1. 什麼是微服務?
  • 官方定義解釋:微服務就是由一系列服務功能組成,能單獨跑在自己的程序裡,每個服務獨立開發,獨立部署,分散式的管理。
  1. 微服務特點?
  • 由一系列小服務組成
  • 獨立的執行在自己的計算機程序
  • 獨立部署
  • 基於分散式管理的服務
  1. 為什麼會出現微服務?
  • 單體架構
    優點:易部署、易測試
    缺點:開發效率低、程式碼難維護、部署不靈活、穩定性不高、擴充套件性不高(上手難)
  • 架構的演變
    ORM(單一架構) —>MVC(垂直架構) —>RPC(分散式架構) —>SOA(流動式架構)

    在這裡插入圖片描述
  1. .微服務解決方案(阿里系、SpringCloud棧)
  • 阿里系(核心技術Dubbo) ~”Dubbo死於13年,復活於17年“
    Dubbo、Zookeeper、SpringMVC or SpringBoot …
  • SpringCloud(一棧式,微服務開發) ~“棧,指全棧”
    SpringCloud Netflix Eureka、SpringBoot …
  1. 什麼是SpringCloud
      SpringCloud 是一個 包括多個子專案的開發工具集,集合了眾多的開源框架(簡稱”集合工具集 “) ,他利用SpringBoot開發的便利性,實現了很多功能,如:服務註冊,負載均衡等。SpringCloud在整合過程中主要針對Netflix(耐非)開源元件的封裝。
    SpringCloud的出現,真正的簡化了分散式架構的開發。

  2. SpringCloud的特性
      服務註冊和發現、 路由、service - to - service呼叫、負載均衡、 斷路器

  3. 服務架構圖
    在這裡插入圖片描述

二.Eureka 服務端開發/客戶端開發

  1. Eureka是一個基於REST(Representational State Transfer)的服務,主要用於AWS cloud, 提供服務定位(locating services)、負載均衡(load balancing)、故障轉移(failover of middle-tier servers)。我們把它叫做Eureka Server. Eureka也提供了基於Java的客戶端元件,Eureka Client,內建的負載均衡器可以實現基本的round-robin負載均衡能力。在Netflix,一個基於Eureka的更復雜的負載均衡器針對多種因素(如流量、資源利用率、錯誤狀態等)提供加權負載均衡,以實現高可用(superior resiliency).

  2. eureka的註冊中心開發步驟
    ①引入依賴
    ②配置eureka的配置檔案
    ③開發入口類 加入如下註解@EnableEurekaServer 用在類上,代表這個啟動是一個eurekaServer
    ④啟動eureka專案
    ⑤訪問 示例:http://localhost:8761

[ ctrl+c 停止jar包形式啟動的eureka ]

  1. eureka客戶端開發
    ① 引入eureka 客戶端依賴
    ② 開發服務類(區別dubbo,類是controller類)
    ③暴露服務 並註冊eureka的註冊中心:application.yml
    ④只需在入口類Application加上 註解@EnableEurekaClient 即可,低耦合 ; 註解@EnableDiscoveryClient 也可以,更通用,不耦合一種註冊中心

三.SpringCloud 通訊方式

  1. 兩大協議對比 HTTP vs RPC
  • Dubbo “是一個RPC框架,底層是TCP協議通訊框架”
    ①基於tcp協議基礎,封裝出dubbo協議,rmi協議

基於dubbo 開發的應用還是要依賴周邊的平臺生態, 相比其它的RPC框架, dubbo 在服務治理與服務整合上可謂是非常常完善, 不僅提供了服務註冊,發現還提供了負載均衡,叢集容錯等基礎能力同時,還提供了面向開發測試節點的Mock 和泛化呼叫等機制。 在spring cloud 出現之前dubbo 在國內應十分廣泛,但dubbo 定位始終是一個RPC框架。

  • SpringCloud “輕量級HTTP協議”
    ①通訊方式: http + restful 方式
    堅持HTTP協議原因:
    1)springcloud的目標是微服務架構下一棧式解決;
    2)使用http+restful方式通訊(輕量易用適用性強),可以做到跨語言,跨平臺和與已有系統整合。

SpringCloud 的目標是微服務架構下的一棧式解決方案,自dubbo 復活後dubbo 官方表示要積極適配到springcloud的生態方式,比如作為springcloud的二進位制通訊方案來發揮dubbo 的效能優勢,或者通過dubbo 的模組化以及對http的支援適配到SpringCloud,但是到目前為止dubbo 與springclo ud 還是不怎麼相容,springcloud 微服務架構下微服務之間使用http的RestFul方式進行通訊,HttpR estFul 本身輕量易用適用性強,可以很容易跨語言,跨平臺,或者與已有的系統整合。

四.開發服務的消費者/Eureka的客戶端(兩種呼叫方式:一種ribbon + restTemplate,另一種frign)

在微服務架構中,業務都會被拆分成一個個獨立的服務,服務之間通訊是基於http restful的。

  1. ribbon
  • ribbon是一個負載均衡客戶端,可以很好的控制http和tcp一些行為。Feign預設整合ribbon。
  1. 開發SpringCloud的服務
    ①建立客戶端服務工程 引入依賴
    ②配置client的服務註冊中心 application.yml
    ③開發入口類
  • 第一種方式 (非註冊中心模型,是直接訪問訪問,與服務中心無關)
 		//第一種方式呼叫
        RestTemplate restTemplate = new RestTemplate();
        //引數 暴露的介面url,返回值string
        String forObject = restTemplate.getForObject("http://localhost:8989/hello/hello?name=" +name, String.class);
        return forObject;

問題:耦合主機名和埠號

  • 第二種方式
	@Autowired
    //用來負載均衡的客戶端
    private LoadBalancerClient loadBalancerClient;
    
    //第二種方式呼叫
        //choose用來書寫呼叫eureka服務名稱,可以拿到埠服務(可getHost和getPort)
        ServiceInstance serviceInstance = loadBalancerClient.choose("HELLO-SERVICE");
        RestTemplate restTemplate = new RestTemplate();

        String url="http://"+serviceInstance.getHost()+":"+serviceInstance.getPort();
        String forObject = restTemplate.getForObject( url+"/hello/hello?name="+name, String.class);
        return forObject;
  • 第三種方式(建議)
//先封裝工具類
@Configuration
public class Beans {
    @Bean
    @LoadBalanced   //1.解決該服務在叢集環境下,負載均衡
    //2.解決問題:UnknownHostException: HELLO-SERVICE
    public RestTemplate getRestTemplate(){

        return new RestTemplate();
    }
}

	@Autowired
    //DI
    private RestTemplate restTemplate;
    
    //第三種方式
    String forObject = restTemplate.getForObject("http://HELLO-SERVICE/hello/hello?name=" + name, String.class);

    return forObject;

五.Eureka高可用(Eureka Server的叢集 )

EurekaServer在微服務中架構中非常重要,若宕機會導致整個微服務架構崩潰,所以解決EurekaServer在現有系統中,高可用是勢在必行的。

  • 準備兩個EurekaServer 告知互相的備元件是誰即可

六.SpringCloud在專案中的實戰應用 (商城APP功能)

示例:
電商系統的服務拆分 ---- product_service商品服務
          ---- product_order商品訂單
☆利用restTemplate 進行兩端釋出服務呼叫
在這裡插入圖片描述