SpringCloud學習筆記1 - 20181127
一.引言
- 什麼是微服務?
- 官方定義解釋:微服務就是由一系列服務功能組成,能單獨跑在自己的程序裡,每個服務獨立開發,獨立部署,分散式的管理。
- 微服務特點?
- 由一系列小服務組成
- 獨立的執行在自己的計算機程序
- 獨立部署
- 基於分散式管理的服務
- 為什麼會出現微服務?
- 單體架構
優點:易部署、易測試
缺點:開發效率低、程式碼難維護、部署不靈活、穩定性不高、擴充套件性不高(上手難) - 架構的演變
ORM(單一架構) —>MVC(垂直架構) —>RPC(分散式架構) —>SOA(流動式架構)
- .微服務解決方案(阿里系、SpringCloud棧)
- 阿里系(核心技術Dubbo) ~”Dubbo死於13年,復活於17年“
Dubbo、Zookeeper、SpringMVC or SpringBoot … - SpringCloud(一棧式,微服務開發) ~“棧,指全棧”
SpringCloud Netflix Eureka、SpringBoot …
-
什麼是SpringCloud
SpringCloud 是一個 包括多個子專案的開發工具集,集合了眾多的開源框架(簡稱”集合工具集 “) ,他利用SpringBoot開發的便利性,實現了很多功能,如:服務註冊,負載均衡等。SpringCloud在整合過程中主要針對Netflix(耐非)開源元件的封裝。
SpringCloud的出現,真正的簡化了分散式架構的開發。 -
SpringCloud的特性
服務註冊和發現、 路由、service - to - service呼叫、負載均衡、 斷路器 -
服務架構圖
二.Eureka 服務端開發/客戶端開發
-
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).
-
eureka的註冊中心開發步驟
①引入依賴
②配置eureka的配置檔案
③開發入口類 加入如下註解@EnableEurekaServer 用在類上,代表這個啟動是一個eurekaServer
④啟動eureka專案
⑤訪問 示例:http://localhost:8761
[ ctrl+c 停止jar包形式啟動的eureka ]
- eureka客戶端開發
① 引入eureka 客戶端依賴
② 開發服務類(區別dubbo,類是controller類)
③暴露服務 並註冊eureka的註冊中心:application.yml
④只需在入口類Application加上 註解@EnableEurekaClient 即可,低耦合 ; 註解@EnableDiscoveryClient 也可以,更通用,不耦合一種註冊中心
三.SpringCloud 通訊方式
- 兩大協議對比 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的。
- ribbon
- ribbon是一個負載均衡客戶端,可以很好的控制http和tcp一些行為。Feign預設整合ribbon。
- 開發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 進行兩端釋出服務呼叫