Java生鲜电商平台-微服务入门与服务的拆分架构实战
Java生鮮電商平臺(tái)-微服務(wù)入門(mén)與服務(wù)的拆分架構(gòu)實(shí)戰(zhàn)
剛開(kāi)始進(jìn)入軟件行業(yè)時(shí)還是單體應(yīng)用的時(shí)代,前后端分離的概念都還沒(méi)普及,開(kāi)發(fā)的時(shí)候需要花大量的時(shí)間在“強(qiáng)大”的JSP上面,那時(shí)候SOA已經(jīng)算是新技術(shù)了。現(xiàn)在,微服務(wù)已經(jīng)大行其道,有哪個(gè)互聯(lián)網(wǎng)產(chǎn)品不說(shuō)自己是微服務(wù)架構(gòu)呢?
但是,對(duì)于微服務(wù)的理解每個(gè)人都不太一樣,這篇文章主要是聊一聊我對(duì)微服務(wù)的理解以及如何搭建經(jīng)典的微服務(wù)架構(gòu),目的是梳理一下自己的一些想法,如果存在不同看法的歡迎指正!
什么是微服務(wù)
首先,什么是微服務(wù)呢?
單體應(yīng)用
相對(duì)的,要理解什么是微服務(wù),那么可以先理解什么是單體應(yīng)用,在沒(méi)有提出微服務(wù)的概念的“遠(yuǎn)古”年代,一個(gè)軟件應(yīng)用,往往會(huì)將應(yīng)用所有功能都開(kāi)發(fā)和打包在一起,那時(shí)候的一個(gè)B/S應(yīng)用架構(gòu)往往是這樣的:
B/S
但是,當(dāng)用戶訪問(wèn)量變大導(dǎo)致一臺(tái)服務(wù)器無(wú)法支撐時(shí)怎么辦呢?加服務(wù)器加負(fù)載均衡,架構(gòu)就變成這樣了:
B/S+負(fù)載均衡
后面發(fā)現(xiàn)把靜態(tài)文件獨(dú)立出來(lái),通過(guò)CDN等手段進(jìn)行加速,可以提升應(yīng)用的整體相應(yīng),單體應(yīng)用的架構(gòu)就變成:
B/S+前后端分離
上面3中架構(gòu)都還是單體應(yīng)用,只是在部署方面進(jìn)行了優(yōu)化,所以避免不了單體應(yīng)用的根本的缺點(diǎn):
- 代碼臃腫,應(yīng)用啟動(dòng)時(shí)間長(zhǎng);(代碼超過(guò)1G的項(xiàng)目都有!)
- 回歸測(cè)試周期長(zhǎng),修復(fù)一個(gè)小小bug可能都需要對(duì)所有關(guān)鍵業(yè)務(wù)進(jìn)行回歸測(cè)試。
- 應(yīng)用容錯(cuò)性差,某個(gè)小小功能的程序錯(cuò)誤可能導(dǎo)致整個(gè)系統(tǒng)宕機(jī);
- 伸縮困難,單體應(yīng)用擴(kuò)展性能時(shí)只能整個(gè)應(yīng)用進(jìn)行擴(kuò)展,造成計(jì)算資源浪費(fèi)。
- 開(kāi)發(fā)協(xié)作困難,一個(gè)大型應(yīng)用系統(tǒng),可能幾十個(gè)甚至上百個(gè)開(kāi)發(fā)人員,大家都在維護(hù)一套代碼的話,代碼merge復(fù)雜度急劇增加。
微服務(wù)
我認(rèn)為任何技術(shù)的演進(jìn)都是有跡可循的,任何新技術(shù)的出現(xiàn)都是為了解決原有技術(shù)無(wú)法解決的需求,所以,微服務(wù)的出現(xiàn)就是因?yàn)樵瓉?lái)單體應(yīng)用架構(gòu)已經(jīng)無(wú)法滿足當(dāng)前互聯(lián)網(wǎng)產(chǎn)品的技術(shù)需求。
在微服務(wù)架構(gòu)之前還有一個(gè)概念:SOA(Service-Oriented Architecture)-面向服務(wù)的體系架構(gòu)。我認(rèn)為的SOA只是一個(gè)架構(gòu)模型的方法論,并不是一個(gè)明確而嚴(yán)謹(jǐn)?shù)募軜?gòu)標(biāo)準(zhǔn),只是后面很多人將SOA與The Open Group的SOA參考模型等同了,認(rèn)為嚴(yán)格按照TOG-SOA標(biāo)準(zhǔn)的才算真正的SOA架構(gòu)。SOA就已經(jīng)提出的面向服務(wù)的架構(gòu)思想,所以微服務(wù)應(yīng)該算是SOA的一種演進(jìn)吧。
撇開(kāi)架構(gòu)先不說(shuō),什么樣的服務(wù)才算微服務(wù)呢?
- 單一職責(zé)的。一個(gè)微服務(wù)應(yīng)該都是單一職責(zé)的,這才是“微”的體現(xiàn),一個(gè)微服務(wù)解決一個(gè)業(yè)務(wù)問(wèn)題(注意是一個(gè)業(yè)務(wù)問(wèn)題而不是一個(gè)接口)。
- 面向服務(wù)的。將自己的業(yè)務(wù)能力封裝并對(duì)外提供服務(wù),這是繼承SOA的核心思想,一個(gè)微服務(wù)本身也可能使用到其它微服務(wù)的能力。
我覺(jué)得滿足以上兩點(diǎn)就可以認(rèn)為典型的微服務(wù)。
微服務(wù)典型架構(gòu)
微服務(wù)架構(gòu),核心是為了解決應(yīng)用微服務(wù)化之后的服務(wù)治理問(wèn)題。
應(yīng)用微服務(wù)化之后,首先遇到的第一個(gè)問(wèn)題就是服務(wù)發(fā)現(xiàn)問(wèn)題,一個(gè)微服務(wù)如何發(fā)現(xiàn)其他微服務(wù)呢?最簡(jiǎn)單的方式就是每個(gè)微服務(wù)里面配置其他微服務(wù)的地址,但是當(dāng)微服務(wù)數(shù)量眾多的時(shí)候,這樣做明顯不現(xiàn)實(shí)。所以需要使用到微服務(wù)架構(gòu)中的一個(gè)最重要的組件:服務(wù)注冊(cè)中心,所有服務(wù)都注冊(cè)到服務(wù)注冊(cè)中心,同時(shí)也可以從服務(wù)注冊(cè)中心獲取當(dāng)前可用的服務(wù)清單:
?
解決服務(wù)發(fā)現(xiàn)問(wèn)題后,接著需要解決微服務(wù)分布式部署帶來(lái)的第二個(gè)問(wèn)題:服務(wù)配置管理的問(wèn)題。當(dāng)服務(wù)數(shù)量超過(guò)一定程度之后,如果需要在每個(gè)服務(wù)里面分別維護(hù)每一個(gè)服務(wù)的配置文件,運(yùn)維人員估計(jì)要哭了。那么,就需要用到微服務(wù)架構(gòu)里面第二個(gè)重要的組件:配置中心,微服務(wù)架構(gòu)就變成下面這樣了:
以上應(yīng)用內(nèi)部的服務(wù)治理,當(dāng)客戶端或外部應(yīng)用調(diào)用服務(wù)的時(shí)候怎么處理呢?服務(wù)A可能有多個(gè)節(jié)點(diǎn),服務(wù)A、服務(wù)B和服務(wù)C的服務(wù)地址都不同,服務(wù)授權(quán)驗(yàn)證在哪里做?這時(shí),就需要使用到服務(wù)網(wǎng)關(guān)提供統(tǒng)一的服務(wù)入口,最終形成典型微服務(wù)架構(gòu):
典型微服務(wù)架構(gòu)
上面是一個(gè)典型的微服務(wù)架構(gòu),當(dāng)然微服務(wù)的服務(wù)治理還涉及很多內(nèi)容,比如:
- 通過(guò)熔斷、限流等機(jī)制保證高可用;
- 微服務(wù)之間調(diào)用的負(fù)載均衡;
- 分布式事務(wù)(2PC、3PC、TCC、LCN等);
- 服務(wù)調(diào)用鏈跟蹤等等。
微服務(wù)框架
目前國(guó)內(nèi)企業(yè)使用的微服務(wù)框架主要是Spring Cloud和Dubbo(或者DubboX),但是Dubbo那兩年的停更嚴(yán)重打擊了開(kāi)發(fā)人員對(duì)它的信心,Spring Cloud已經(jīng)逐漸成為主流,比較兩個(gè)框架的優(yōu)劣勢(shì)的文章在網(wǎng)上有很多,這里就不重復(fù)了,選擇什么框架還是按業(yè)務(wù)需求來(lái)吧,業(yè)務(wù)框架決定技術(shù)框架。
Spring Cloud全家桶提供了各種各樣的組件,基本可以覆蓋微服務(wù)的服務(wù)治理的方方面面,以下列出了Spring Cloud一些常用組件:
Spring Cloud常用組件
搭建典型微服務(wù)架構(gòu)
本章節(jié)主要介紹如何基于Spring Cloud相關(guān)組件搭建一個(gè)典型的微服務(wù)架構(gòu)。
首先,創(chuàng)建一個(gè)Maven父項(xiàng)目spring-cloud-examples,用于管理項(xiàng)目依賴包版本。由于Spring Cloud組件很多,為保證不同組件之間的兼容性,一般通過(guò)spring-cloud-dependencies統(tǒng)一管理Spring Cloud組件版本,而非每個(gè)組件單獨(dú)引入。
pom.xml配置如下:
<!-- 繼承SpringBoot父項(xiàng)目,注意與SpringCloud版本的匹配 --><parent><groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.1.4.RELEASE</version> </parent> <properties> <spring.boot.version>2.1.4.RELEASE</spring.boot.version> <spring.cloud.version>Greenwich.SR1</spring.cloud.version> <lombok.version>1.18.8</lombok.version> <maven.compiler.plugin.version>3.8.1</maven.compiler.plugin.version> </properties> <dependencyManagement> <dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-dependencies</artifactId> <version>${spring.cloud.version}</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement>搭建服務(wù)配置中心
- 在spring-cloud-examples項(xiàng)目下創(chuàng)建一個(gè)子項(xiàng)目spring-cloud-example-config,添加Spring Cloud Config Server端的相關(guān)依賴包:
- 添加Spring Boot配置文件application.yml,配置如下:
- 啟動(dòng)類(lèi)添加注解@EnableConfigServer通過(guò)啟用Config Server服務(wù)。
搭建服務(wù)注冊(cè)中心
- 在spring-cloud-examples項(xiàng)目下創(chuàng)建一個(gè)子項(xiàng)目spring-cloud-example-registry,在pom.xml中添加Eureka Server相關(guān)依賴包:
- 在spring-cloud-example-config配置中心項(xiàng)目的src/main/resource/configs目錄下添加一個(gè)服務(wù)配置文件spring-cloud-example-registry.yml,配置如下:
- 在spring-cloud-example-registry項(xiàng)目的src/main/resource/目錄添加bootstrap.yml配置文件,配置如下:
- 啟動(dòng)類(lèi)添加注解@EnableEurekaServer通過(guò)啟用Eureka Server服務(wù)。
搭建業(yè)務(wù)服務(wù)A
- 在spring-cloud-examples項(xiàng)目下創(chuàng)建一個(gè)業(yè)務(wù)服務(wù)A的子項(xiàng)目spring-cloud-example-biz-a,在pom.xml中添加以下依賴包:
- 在spring-cloud-example-config配置中心項(xiàng)目的src/main/resource/configs目錄下添加一個(gè)服務(wù)配置文件spring-cloud-example-biz-a.yml,配置如下:
- 在spring-cloud-example-biz-a項(xiàng)目的src/main/resource/目錄添加bootstrap.yml配置文件,配置如下:
- 添加一個(gè)示例接口,代碼參考:
搭建業(yè)務(wù)服務(wù)B
參考上面業(yè)務(wù)服務(wù)A搭建另外一個(gè)業(yè)務(wù)服務(wù)B。
搭建服務(wù)網(wǎng)關(guān)
- 在spring-cloud-examples項(xiàng)目下創(chuàng)建一個(gè)業(yè)務(wù)服務(wù)A的子項(xiàng)目spring-cloud-example-gateway,在pom.xml中添加以下依賴包:
- 在spring-cloud-example-config配置中心項(xiàng)目的src/main/resource/configs目錄下添加一個(gè)服務(wù)配置文件spring-cloud-example-gateway.yml,配置如下:
- 在spring-cloud-example-gateway項(xiàng)目的src/main/resource/目錄添加bootstrap.yml配置文件,配置如下:
- 啟動(dòng)類(lèi)添加注解@EnableZuulProxy通過(guò)啟用網(wǎng)關(guān)代理服務(wù)。
啟動(dòng)示例
-
啟動(dòng)順序
spring-cloud-example-config>>spring-cloud-example-eureka>>spring-cloud-example-biz-a/spring-cloud-example-biz-b/spring-cloud-example-gateway -
通過(guò)網(wǎng)關(guān)訪問(wèn)服務(wù)A接口
服務(wù)A調(diào)用 -
通過(guò)網(wǎng)關(guān)訪問(wèn)服務(wù)B接口
服務(wù)B調(diào)用
服務(wù)之間調(diào)用
- 在業(yè)務(wù)服務(wù)A中添加一個(gè)Feign Client Bean,參考代碼如下:
- 業(yè)務(wù)服務(wù)A示例接口類(lèi)增加call2b接口,代碼如下:
- 重啟業(yè)務(wù)服務(wù)A,通過(guò)調(diào)用/hello/call2b接口:
服務(wù)之間調(diào)用
下一代微服務(wù)
目前網(wǎng)上很多說(shuō)是下一代微服務(wù)架構(gòu)就是Service Mesh,Service Mesh主流框架有Linkerd和Istio,其中Istio有大廠加持所以呼聲更高。Service Mesh我接觸還不多,但是個(gè)人感覺(jué)并不一定能稱為下一代微服務(wù)架構(gòu),可能認(rèn)為是服務(wù)治理的另外一種解決方案更合適,是否能夠取代當(dāng)前的微服務(wù)架構(gòu)還需要持續(xù)觀察。
轉(zhuǎn)載于:https://www.cnblogs.com/jurendage/p/11331366.html
總結(jié)
以上是生活随笔為你收集整理的Java生鲜电商平台-微服务入门与服务的拆分架构实战的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: Linux三剑客之grep命令
- 下一篇: 蜗牛星际黑群晖硬盘休眠的设置