SpringCloud:初識(微服務與SpringCloud)
1、微服務
(1)概念
微服務架構是一種架構模式,它提倡將單一應用程式劃分成一組小的服務,服務之間互相協調、互相配合,服務執行在其獨立的程序中,服務與服務間採用輕量級的通訊機制互相協作(通常是基於HTTP協議的RESTful API)。每個服務都圍統著具體業務進行構建,並且能夠被獨立的部署到生產環境、類生產環境等。另外,應當儘量避免統一的、集中式的服務管理機制,對具體的的服務而言應根據業務上下文,選擇合適的語言、工具對其進行構建
(2)版本
使用的是英國倫敦的地鐵站進行命名,從A依次遞增
要注意SpringBoot和SpringCloud的對應關係,如:H對應2.2.x、G對應2.1.x
(3)SpringCloud
SpringCloud是一整套技術的集合
(4)特點
將單⼀應⽤程式劃分成⼀組⼩的服務,服務之間互相協調、互相配合,為⽤戶提供最終價值,例如:訂單、商品,每一個服務完成一個功能或模組。All In One模式的時候,如果一個模組出現了問題,其他的模組也會受到影響
服務與服務間採⽤輕量級的通訊機制互相協作,通常是基於HTTP協議的RESTful API
每個服務都圍繞著具體業務進⾏構建,並且能夠被獨⽴的部署到⽣產環境、類⽣產環境
(5)優缺點
- 優點
每個服務足夠內聚,足夠小,程式碼容易理解這樣能聚焦一個指定的業務功能或業務需求
開發簡單、開發效率提高,一個服務可能就是專一的只幹一件事。
微服務是鬆耦合的,是有功能意義的服務,無論是在開發階段或部署階段都是獨立的。
微服務能使用不同的語言開發。
易於和第三方整合,微服務允許容易且靈活的方式整合自動部署,通過持續整合工具,如Jenkins, Hudson, bamboo 。
微服務易於被一個開發人員理解,修改和維護,這樣小團隊能夠更關注自己的工作成果。無需通過合作才能體現價值。
微服務允許你利用融合最新技術。
微服務只是業務邏輯的程式碼,不會和HTML,CSS 或其他介面元件混合。
每個微服務都有自己的儲存能力,可以有自己的資料庫。也可以有統一資料庫。
- 缺點
開發人員要處理分散式系統的複雜性
多服務運維難度,隨著服務的增加,運維的壓力也在增大
系統部署依賴
服務間通訊成本
資料一致性
系統整合測試
效能監控……
(5)技術棧
服務開發 Springboot、Spring、SpringMVC
服務配置與管理 Netflix公司的Archaius、阿里的Diamond等
服務註冊與發現 Eureka、Consul、Zookeeper等
服務呼叫 Rest、RPC、gRPC
服務熔斷器 Hystrix、Envoy等
負載均衡 Ribbon、Nginx等
服務介面呼叫(客戶端呼叫服務的簡化工具) Feign等
訊息佇列 Kafka、RabbitMQ、ActiveMQ等
服務配置中心管理 SpringCloudConfig、Chef等
服務路由(API閘道器) Zuul等
服務監控 Zabbix、Nagios、Metrics、Spectator等
全鏈路追蹤 Zipkin,Brave、Dapper等
服務部署 Docker、OpenStack、Kubernetes等
資料流操作開發包 SpringCloud Stream(封裝與Redis,Rabbit、Kafka等傳送接收訊息)
事件訊息匯流排 Spring Cloud Bus
2、SpringCloud
(1)與SpringBoot的區別
SpringBoot專注於快速方便的開發單個個體微服務,SpringCloud關注全域性的服務治理框架。SpringBoot可以離開SpringCloud獨立使用開發專案,但是SpringCloud離不開SpringBoot,屬於依賴的關係
SpringCloud是關注全域性的微服務協調整理治理框架,它將SpringBoot開發的一個個單體微服務整合並管理起來,為各個微服務之間提供,配置管理、服務發現、斷路器、路由、微代理、事件匯流排、全域性鎖、決策競選、分散式會話等等整合服務
(2)與Dubbo對比
- 最大區別:SpringCloud拋棄了Dubbo的RPC通訊,採用的是基於HTTP的REST方式
嚴格來說,這兩種方式各有優劣。雖然從一定程度上來說,後者犧牲了服務呼叫的效能,但也避免了上面提到的原生RPC帶來的問題。而且REST相比RPC更為靈活,服務提供方和呼叫方的依賴只依靠一紙契約,不存在程式碼級別的強依賴,這在強調快速演化的微服務環境下,顯得更加合適。
- 品牌機與組裝機的區別
很明顯,Spring Cloud的功能比DUBBO更加強大,涵蓋面更廣,而且作為Spring的拳頭專案,它也能夠與Spring Framework、Spring Boot、Spring Data、Spring Batch等其他Spring專案完美融合,這些對於微服務而言是至關重要的。使用Dubbo構建的微服務架構就像組裝電腦,各環節我們的選擇自由度很高,但是最終結果很有可能因為一條記憶體質量不行就點不亮了,總是讓人不怎麼放心,但是如果你是一名高手,那這些都不是問題;而Spring Cloud就像品牌機,在Spring Source的整合下,做了大量的相容性測試,保證了機器擁有更高的穩定性,但是如果要在使用非原裝元件外的東西,就需要對其基礎有足夠的瞭解。
3、微服務案例
(1)新建一個父工程
此工程的POM檔案是其他模組會用到的,如:JDBC、Druid、junit等
(2)建立一個子模組(公共子模組)
建立子模組後與父模組形成依賴關係,即子模組依賴於父模組。其他模組想要使用本模組的內容的話需要用groupId、artifactId、version來引入該模組,不用在自己的模組中定義相同的程式碼了
<groupId>com.zhb</groupId> <artifactId> myspringcloud-api</artifactId> <version>${project.version}</version>
(3)新建provider-8001模組
匯入相關依賴(springcloud、資料庫連線等)
建立application.xml(配置mybatis、資料來源等)
建立mybatis.cfg.xml(開啟mybatis的二級快取)
建立dao、service、controller層
最後書寫該模組的主類(Springboot):
@SpringBootApplication public class DeptProvider8001_App { public static void main(String[] args) { SpringApplication.run(DeptProvider8001_App.class,args); } }
測試時可以正常訪問資料庫
(4)新建consumer模組
配置pom.xml,在此配置檔案中配置引入provider模組,從而減少程式碼的冗餘
配置application.xml
- RestTemplate
RestTemplate提供了多種便捷訪問遠端Http服務的方法, 是一種簡單便捷的訪問restful服務模板類。藉助於RestTemplate能夠訪問provider的服務
private static final String REST_URL_PREFIX = "http://localhost:8001"; @Autowired private RestTemplate restTemplate; @RequestMapping(value = "/consumer/dept/add") public boolean add(Dept dept) { return restTemplate.postForObject(REST_URL_PREFIX + "/dept/add", dept, Boolean.class); } @RequestMapping(value = "/consumer/dept/get/{id}") public Dept get(@PathVariable("id") Long id) { return restTemplate.getForObject(REST_URL_PREFIX + "/dept/get/" + id, Dept.class); } @SuppressWarnings("unchecked") @RequestMapping(value = "/consumer/dept/list") public List<Dept> list() { return restTemplate.getForObject(REST_URL_PREFIX + "/dept/list", List.class); }