本文以筆者個(gè)人經(jīng)歷講述關(guān)于微服務(wù)方面的技術(shù)選型和相關(guān)知識(shí)點(diǎn)。微服務(wù)模式的項(xiàng)目從初建到上線(xiàn)部署應(yīng)用,每一個(gè)環(huán)節(jié)都會(huì)涉及到相當(dāng)多的技術(shù)細(xì)節(jié)(上線(xiàn)后的性能調(diào)優(yōu)更需要)。本文著重介紹一套微服務(wù)搭建流程中面臨的一些技術(shù)選型,戰(zhàn)略性的技術(shù)方案及相關(guān)技術(shù)的簡(jiǎn)要介紹,不做每一項(xiàng)技術(shù)的深入說(shuō)明。
微服務(wù)簡(jiǎn)介
微服務(wù)是指開(kāi)發(fā)一個(gè)單個(gè)小型的但有業(yè)務(wù)功能的服務(wù),每個(gè)服務(wù)都有自己的處理和輕量通訊機(jī)制,可以部署在單個(gè)或多個(gè)服務(wù)器上。微服務(wù)也指一種種松耦合的、有一定的有界上下文的面向服務(wù)架構(gòu)。
微服務(wù)是系統(tǒng)架構(gòu)上的一種設(shè)計(jì)風(fēng)格,主旨是將一個(gè)原本獨(dú)立的系統(tǒng)拆分成多個(gè)小型服務(wù),這些小型服務(wù)都在各自獨(dú)立的進(jìn)程中運(yùn)行,服務(wù)之間通過(guò)基于HTTP/HTTPS協(xié)議的RESTful API進(jìn)行通信協(xié)作,也可以通過(guò)RPC協(xié)議進(jìn)行通信協(xié)作。被拆分成的每一個(gè)小型服務(wù)都圍繞著系統(tǒng)中一些耦合度較高的業(yè)務(wù)功能進(jìn)行構(gòu)建,并且每個(gè)服務(wù)都維護(hù)著自身的數(shù)據(jù)存儲(chǔ),業(yè)務(wù)開(kāi)發(fā),自動(dòng)化測(cè)試案例以及獨(dú)立部署機(jī)制。由于有了輕量級(jí)的通信協(xié)作基礎(chǔ),所以這些微服務(wù)可以使用不同的語(yǔ)言來(lái)編寫(xiě)。
微服務(wù)的優(yōu)點(diǎn)
每個(gè)微服務(wù)都很小,這樣能夠聚焦一個(gè)指定的業(yè)務(wù)功能或業(yè)務(wù)需求。
微服務(wù)能夠被小團(tuán)隊(duì)單獨(dú)開(kāi)發(fā),這個(gè)小團(tuán)隊(duì)是2到5人的開(kāi)發(fā)人員組成。
微服務(wù)是松耦合的,是有功能意義的服務(wù),無(wú)論是在開(kāi)發(fā)階段或部署階段都是獨(dú)立的。
微服務(wù)能使用不同的語(yǔ)言開(kāi)發(fā),如Java、Python、PHP、C#等。
微服務(wù)允許容易且靈活的方式集成自動(dòng)部署,通過(guò)持續(xù)集成工具,如Jenkins, Travis CI等工具。
一個(gè)團(tuán)隊(duì)的新成員能夠更快投入生產(chǎn)。
微服務(wù)易于被一個(gè)開(kāi)發(fā)人員理解,修改和維護(hù),這樣小團(tuán)隊(duì)能夠更關(guān)注自己的工作成果。無(wú)需通過(guò)合作才能體現(xiàn)價(jià)值。
微服務(wù)方便融合最新技術(shù)。
微服務(wù)只是業(yè)務(wù)邏輯的代碼,不會(huì)和HTML,CSS 或其他界面組件混合。
微服務(wù)能夠即時(shí)被要求擴(kuò)展。
微服務(wù)能部署中低端配置的服務(wù)器上。
易于和第三方應(yīng)用系統(tǒng)集成。
每個(gè)微服務(wù)都有自己的存儲(chǔ)能力,可以有自己的數(shù)據(jù)庫(kù),也可以有統(tǒng)一數(shù)據(jù)庫(kù)。
微服務(wù)技術(shù)選型
前幾年較為火的微服務(wù)技術(shù)有阿里的Dubbo方案。后面又出現(xiàn)了Spring體系下的微服務(wù)方案。本文主要介紹Spring體系下的微服務(wù)技術(shù)選型方案。

構(gòu)建一套微服務(wù)最基本的是需要搭建網(wǎng)關(guān),注冊(cè)中心,開(kāi)發(fā)具體實(shí)現(xiàn)業(yè)務(wù)功能的服務(wù)。對(duì)于各個(gè)微服務(wù)之間的通信,可通過(guò)Feign方案處理。具體搭建一套微服務(wù)技術(shù)選型可參考如下方案:

不同的技術(shù)選擇應(yīng)用的場(chǎng)景不同:
網(wǎng)關(guān):若整個(gè)公司業(yè)務(wù)都基于java開(kāi)發(fā),可以直接使用Spring Gateway做網(wǎng)關(guān)。若還存在其他的開(kāi)發(fā)語(yǔ)言,也可選擇kong網(wǎng)關(guān)模式。
注冊(cè)中心:基于java開(kāi)發(fā),Spring體系下可直接用 Spring Eureka。若還存在其他語(yǔ)言編寫(xiě)的服務(wù),可使用Consul。
微服務(wù)搭建:各自語(yǔ)言都可以搭建。若采用java開(kāi)發(fā),可參考Spring boot方案搭建微服務(wù)。
持續(xù)集成的方案,三種都可以。若基于java開(kāi)發(fā),第一種最為傳統(tǒng),運(yùn)維人員或開(kāi)發(fā)人員工作更多,需編寫(xiě)啟動(dòng)腳本,使用jdk命令啟動(dòng)java程序。建議使用第二種方案。第三種方案操作更為簡(jiǎn)便,但需用阿里云的產(chǎn)品。
Spring Boot 項(xiàng)目構(gòu)建:采用Spring Boot模式搭建微服務(wù)項(xiàng)目時(shí),對(duì)于Maven項(xiàng)目pom.xml配置文件的使用需注意pom文件配置單項(xiàng)目模式和項(xiàng)目聚合模式的區(qū)別。對(duì)于網(wǎng)關(guān),注冊(cè)中心可采用單項(xiàng)目模式。但在搭建真正業(yè)務(wù)的服務(wù)時(shí),建議采用父子級(jí)項(xiàng)目聚合的方式。筆者最初做微服務(wù)開(kāi)發(fā)時(shí),采用了單項(xiàng)目的模式,當(dāng)開(kāi)發(fā)了多個(gè)業(yè)務(wù)的微服務(wù)后,單項(xiàng)目模式在引用依賴(lài)項(xiàng)目版本,管理項(xiàng)目時(shí)極為不便。
微服務(wù)相關(guān)知識(shí)點(diǎn)
本文針對(duì)Spring體系下微服務(wù)常用的幾個(gè)知識(shí)點(diǎn)做簡(jiǎn)要說(shuō)明,具體細(xì)節(jié),原理,如何應(yīng)用可通過(guò)關(guān)鍵詞搜索詳細(xì)了解。
Spring Boot
Spring Boot是由 Pivotal團(tuán)隊(duì)提供的全新框架,其設(shè)計(jì)目的是用來(lái)簡(jiǎn)化新 Spring應(yīng)用的初始搭建以及開(kāi)發(fā)過(guò)程。該框架使用了特定的方式來(lái)進(jìn)行配置,從而使開(kāi)發(fā)人員不再需要定義樣板化的配置。
Spring Boot的核心思想就是約定大于配置,一切自動(dòng)完成。采用 Spring Boot可以大大的簡(jiǎn)化開(kāi)發(fā)模式,通過(guò)組件的模式集成常用的框架。
Spring Cloud
Spring Cloud是一系列框架的有序集合。它利用 Spring Boot的開(kāi)發(fā)便利性巧妙地簡(jiǎn)化了分布式系統(tǒng)基礎(chǔ)設(shè)施的開(kāi)發(fā),如服務(wù)發(fā)現(xiàn)注冊(cè)、配置中心、消息總線(xiàn)線(xiàn)、負(fù)載均衠、斷路器、數(shù)據(jù)監(jiān)控等,都可以用 Spring Boot的開(kāi)發(fā)風(fēng)格做到一鍵啟動(dòng)和部署。 Spring并沒(méi)有重復(fù)制造輪子,它只是將目前各家公司開(kāi)發(fā)的比較成熟、經(jīng)得起實(shí)際考驗(yàn)的服務(wù)框架組臺(tái)起來(lái),通過(guò) Spring Boot風(fēng)格進(jìn)行再封裝屏蔽掉了復(fù)雜的配置和實(shí)現(xiàn)原理,最終給開(kāi)發(fā)者留出了一套簡(jiǎn)單易懂、易部署和易維護(hù)的分布式系統(tǒng)開(kāi)發(fā)工具包。
微服務(wù)是可以獨(dú)立部署、水平擴(kuò)展、獨(dú)立訪(fǎng)問(wèn)(或者有獨(dú)立的數(shù)據(jù)庫(kù))的服務(wù)單元, Spring Cloud就是這些微服務(wù)的大管家,采用了微服務(wù)這種架構(gòu)之后,項(xiàng)目的數(shù)量會(huì)非常多, Spring Cloud做為大管家就需要提供各種方案來(lái)維護(hù)整個(gè)生態(tài)。
Spring Cloud就是一套分布式服務(wù)治理的框架,既然它是一套服務(wù)治理的框架,那么它本身不會(huì)提供具體功能性的操作,更專(zhuān)注于服務(wù)之間的通訊、熔斷、監(jiān)控等。因此就需要很多的組件來(lái)支持一套功能。
Spring Cloud的子項(xiàng)目,大致可分成兩類(lèi),一類(lèi)是對(duì)現(xiàn)有成熟框架”Spring Boot化”的封裝和抽象,也是數(shù)量最多的項(xiàng)目;第二類(lèi)是開(kāi)發(fā)了一部分分布式系統(tǒng)的基礎(chǔ)設(shè)施的實(shí)現(xiàn),如Spring Cloud Stream扮演的就是kafka, ActiveMQ這樣的角色。
Spring Cloud Eureka
Spring Cloud Eureka是Spring Cloud Netflix項(xiàng)目下的服務(wù)治理模塊。而Spring Cloud Netflix項(xiàng)目是Spring Cloud的子項(xiàng)目之一,主要內(nèi)容是對(duì)Netflix公司一系列開(kāi)源產(chǎn)品的包裝,它為Spring Boot應(yīng)用提供了自配置的Netflix OSS整合。通過(guò)一些簡(jiǎn)單的注解,開(kāi)發(fā)者就可以快速的在應(yīng)用中配置一下常用模塊并構(gòu)建龐大的分布式系統(tǒng)。它主要提供的模塊包括:服務(wù)發(fā)現(xiàn)(Eureka),斷路器(Hystrix),智能路由(Zuul),客戶(hù)端負(fù)載均衡(Ribbon)等。
Spring Cloud Gateway
Spring Cloud Gateway是Spring官方基于Spring 5.0,Spring Boot 2.0和Project Reactor等技術(shù)開(kāi)發(fā)的網(wǎng)關(guān),Spring Cloud Gateway旨在為微服務(wù)架構(gòu)提供一種簡(jiǎn)單而有效的統(tǒng)一的API路由管理方式。Spring Cloud Gateway作為Spring Cloud生態(tài)系中的網(wǎng)關(guān),目標(biāo)是替代Netflix ZUUL,其不僅提供統(tǒng)一的路由方式,并且基于Filter鏈的方式提供了網(wǎng)關(guān)基本的功能,例如:安全,監(jiān)控/埋點(diǎn),和限流等。
Spring Cloud Feign
Feign是一個(gè)偽客戶(hù)端,即它不做任何的請(qǐng)求處理。Feign通過(guò)處理注解生成request,從而實(shí)現(xiàn)簡(jiǎn)化HTTP API開(kāi)發(fā)的目的,即開(kāi)發(fā)人員可以使用注解的方式定制request api模板,在發(fā)送http request請(qǐng)求之前,feign通過(guò)處理注解的方式替換掉request模板中的參數(shù),這種實(shí)現(xiàn)方式顯得更為直接、可理解。
Feign?封裝了Http調(diào)用流程,更適合面向接口化的編程習(xí)慣?。在服務(wù)調(diào)用的場(chǎng)景中,我們經(jīng)常調(diào)用基于Http協(xié)議的服務(wù),而我們經(jīng)常使用到的框架可能有HttpURLConnection、Apache HttpComponnets、OkHttp3 、Netty等等,這些框架在基于自身的專(zhuān)注點(diǎn)提供了自身特性。而從角色劃分上來(lái)看,他們的職能是一致的提供Http調(diào)用服務(wù)。