Go語言程序設計及實例 課件 第8章 Go語言微服務開發(fā)入門_第1頁
Go語言程序設計及實例 課件 第8章 Go語言微服務開發(fā)入門_第2頁
Go語言程序設計及實例 課件 第8章 Go語言微服務開發(fā)入門_第3頁
Go語言程序設計及實例 課件 第8章 Go語言微服務開發(fā)入門_第4頁
Go語言程序設計及實例 課件 第8章 Go語言微服務開發(fā)入門_第5頁
已閱讀5頁,還剩42頁未讀 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

第8章Go語言微服務開發(fā)入門微服務概述01云計算與微服務1.云計算及其服務模式2.單體應用的弊端3.微服務的提出云計算與微服務1.云計算及其服務模式自從2006年亞馬遜證明了云是可行業(yè)務并率先推出自己的云服務平臺后,眾多行業(yè)巨頭紛至沓來:2007年IBM推出BlueCloud計劃;2008年谷歌發(fā)布Google應用引擎;2009年Heroku推出第一款公有云PaaS;2010年微軟上線MicrosoftAzure(藍天)云,與此同時RackspaceHosting和NASA聯(lián)合推出OpenStack開源云計劃;2011年P(guān)ivotal推出開源PaaSCloudFoundry;2013年Docker發(fā)布……云時代的大幕徐徐拉開。云計算與微服務云服務提供商出租計算資源有3種基本模式,以滿足不同用戶的需求,如下。(1)IaaS(InfrastructureasaService,基礎設施即服務):它是最底層的云服務,僅僅將基礎的硬件資源(如服務器、存儲設備等)以虛擬機技術(shù)整合起來租給用戶使用,除此之外不提供任何對上層軟件應用開發(fā)的支持。(2)PaaS(PlatformasaService,平臺即服務):它除了具備底層完善的基礎設施外還提供上層的軟件部署平臺,包括操作系統(tǒng)、必要的中間件和編程語言運行時(runtime)等,并對硬件和操作系統(tǒng)進行了統(tǒng)一抽象,使云用戶(通常是互聯(lián)網(wǎng)應用開發(fā)者)只須關(guān)注自己的業(yè)務邏輯實現(xiàn),不需要考慮底層細節(jié)。(3)SaaS(SoftwareasaService,軟件即服務):這種模式下,完全由提供商來為企業(yè)搭建信息化所需要的全部硬件基礎設施、軟件部署平臺及應用程序(包括數(shù)據(jù)庫),并負責從前期設計到開發(fā)實施直至后期維護的一系列任務,這等于是將系統(tǒng)的開發(fā)、部署和管理全都交給了第三方,用戶不再過問任何技術(shù)問題,拿來即用,直接在上面開展自己的業(yè)務。云計算與微服務以上3種模式的系統(tǒng)分層結(jié)構(gòu)如圖,圖中以虛線分出了云服務提供商與用戶各自需要負責運維和管理的界限。云計算與微服務2.單體應用的弊端傳統(tǒng)軟件開發(fā)的基本對象是單個的應用程序(系統(tǒng)),也稱為“單體應用”,雖然開發(fā)簡單,但隨著業(yè)務復雜度的上升,單體應用系統(tǒng)的規(guī)模也隨之膨脹,程序變得難以理解和維護。即便是采用良好的分層設計和基于成熟框架(如JavaEE、SpringBoot等)開發(fā)的單體應用系統(tǒng)(其典型的架構(gòu)通常如圖)。云計算與微服務3.微服務的提出為了克服單體應用開發(fā)方式的弊端,更好地適用云時代的業(yè)務需求,世界著名軟件開發(fā)大師馬丁·福勒(MartinFowler)于2014年首次提出了微服務的概念,其基本思想是將單體應用轉(zhuǎn)化為多個可以獨立開發(fā)、獨立部署、獨立運行和獨立維護的服務,以應對更快的需求變更和更短的開發(fā)迭代周期。開發(fā)時先將明確定義的功能模塊分成更小的服務,即“微服務”,每個微服務僅描述一個單一的小業(yè)務,系統(tǒng)中的每一個微服務都可以被單獨部署,各微服務之間是松耦合的,這樣就可以獨立地對每個微服務進行升級、部署、擴展和重新啟動等,從而實現(xiàn)在對系統(tǒng)功能進行頻繁更新和迭代的同時也不會對最終用戶的使用造成任何影響。02微服務系統(tǒng)結(jié)構(gòu)微服務系統(tǒng)結(jié)構(gòu)一個典型的微服務系統(tǒng)的結(jié)構(gòu)如圖。微服務系統(tǒng)結(jié)構(gòu)微服務系統(tǒng)相比傳統(tǒng)分層架構(gòu)的單體應用系統(tǒng)來說具備如下特點。(1)將原屬于單體架構(gòu)的業(yè)務層完全獨立出來,從企業(yè)服務器遷移到云服務平臺(俗稱“上云”),并將該層的“服務”進一步細分為一個一個的“微服務”。(2)微服務遵循單一原則,能脫離開具體的操作系統(tǒng)和語言運行時,運行于容器之中,每個微服務都有屬于自己的獨立進程,使容器能夠合理地為其分配所需的系統(tǒng)資源。目前使用最為普遍的容器是Docker。(3)云服務平臺上運行著很多個Docker,通常會將從原來同一個單體應用(或功能模塊)所分出的一組微服務及其運行環(huán)境置于一個Docker之中。(4)云上的容器都由專門的軟件進行統(tǒng)一管理(編排),當前最為主流的容器編排軟件是Kubernetes,實際應用中Docker+Kubernetes的組合是最佳搭檔和標配。(5)同一或不同容器的微服務之間可以互相調(diào)用,微服務的調(diào)用采用基于標準RESTfulAPI的輕量通信協(xié)議,與具體的編程語言和操作系統(tǒng)平臺均無關(guān)。(6)由于微服務的運行是獨立的,它們之間的通信也是語言平臺無關(guān)的,每一個微服務又可以被單獨部署,這也就意味著可以將一個應用系統(tǒng)所屬的各個微服務分別交由不同的團隊乃至多個第三方去開發(fā),真正實現(xiàn)軟件系統(tǒng)開發(fā)過程的“并行化”。(7)微服務系統(tǒng)在本質(zhì)上是一個開放的分布式網(wǎng)絡應用系統(tǒng),出于安全需要,前端(相當于原分層單體應用架構(gòu)的表示層)必須通過特殊的API網(wǎng)關(guān)訪問云上的微服務,網(wǎng)關(guān)會提供系統(tǒng)基礎的授權(quán)、安全、日志、監(jiān)控、負載均衡等服務,是微服務系統(tǒng)的“海關(guān)衛(wèi)士”。(8)在后臺,微服務系統(tǒng)取消了原來的持久層,企業(yè)不用再自己花錢購買數(shù)據(jù)庫和維護龐大的數(shù)據(jù)中心,而是把數(shù)據(jù)也托付給“云”管理。第8章Go語言微服務開發(fā)入門微服務開發(fā)環(huán)境安裝01安裝Consul安裝ConsulConsul就是一款很棒的開源微服務注冊與發(fā)現(xiàn)工具,它的安裝步驟如下。(1)下載Consul訪問https://www.consul.io/downloads.html選擇對應自己使用操作系統(tǒng)版本的Consul下載,如圖。安裝Consul(2)啟動Consul以管理員身份打開Windows命令行,進入到該目錄啟動Consul,先后輸入如下:E:cdE:\Go\Consulconsul.exeagent-dev命令行窗口顯示如圖。安裝Consul(3)測試安裝打開瀏覽器,輸入http://localhost:8500,看到如圖所示的頁面說明安裝成功,此時頁面上的Services(服務)列表中已經(jīng)默認創(chuàng)建好了一個名為consul的微服務實例。02安裝gRPC1.安裝前準備2.安裝protoc3.安裝protoc-gen-go4.安裝Git工具5.安裝gRPC各組件6.測試安裝安裝gRPC1.安裝前準備在安裝gRPC之前需要先配置自己計算機Go語言環(huán)境變量,以管理員身份打開Windows命令行,先后輸入如下:goenv-wGOSUMDB=offgoenv-wGOPROXY=,direct然后再以“goenv”命令查看安裝前計算機的Go環(huán)境如下:GOPATH=C:\Users\Administrator\goGOPROXY=,directGOROOT=C:\ProgramFiles\GoGOSUMDB=off安裝gRPC命令行窗口顯示如圖,請讀者仔細看清圖中框出的幾個環(huán)境變量值,確保配置正確。安裝gRPC2.安裝protocgRPC框架默認采用的是ProtoBuf數(shù)據(jù)序列化協(xié)議(類似于XML、JSON),使用該協(xié)議來定義服務、接口和數(shù)據(jù)類型。Go語言要依靠插件(protobuf包)才能支持這個協(xié)議,而要安裝這個插件,必須首先安裝其編譯工具protoc,步驟如下。(1)下載protoc訪問/protocolbuffers/protobuf/releases/tag/v3.19.5,下載頁面如圖。安裝gRPC(2)配置bin目錄從解壓后的文件夾中找到bin目錄下的可執(zhí)行文件protoc.exe,將其放到本地Go語言環(huán)境的GOPATH\bin(筆者的是C:\Users\Administrator\go\bin)目錄下。然后,在系統(tǒng)環(huán)境變量的Path中添加C:\Users\Administrator\go\bin。(3)安裝protoc以管理員身份打開Windows命令行,執(zhí)行命令:protoc.exe安裝gRPC看到如圖所示的信息就表示安裝完成。安裝gRPC(4)測試安裝在命令行下繼續(xù)輸入:protoc--version顯示protoc的版本,如圖所示,說明安裝成功。安裝gRPC3.安裝protoc-gen-goprotoc-gen-go是Go語言的protobuf包,它是一個插件,需要借助protoc工具來編譯安裝。從Windows命令行進入GOPATH\bin目錄下依次執(zhí)行:goinstall/golang/protobuf/proto@latestgoinstall/golang/protobuf/protoc-gen-go@latest命令行顯示如圖。安裝完后,進入到本地Go環(huán)境的GOPATH\bin目錄,看到其下生成了protoc-gen-go.exe可執(zhí)行文件就表示安裝成功,如圖。安裝gRPC4.安裝Git工具因gRPC框架由好幾個不同的組件構(gòu)成,需要分別安裝,而這些組件又都沒有現(xiàn)成的可安裝版本,只能通過Git對它們的源碼執(zhí)行編譯安裝,故又必須先安裝Git工具。5.安裝gRPC各組件(1)分立安裝組件啟動GitBash,在其控制臺窗口“$”提示符后面先后輸入和執(zhí)行下面4條命令:gitclone/golang/net.git$GOPATH/src//x/netgitclone/golang/text.git$GOPATH/src//x/textgitclone/grpc/grpc-go.git$GOPATH/src//grpcgitclone/google/go-genproto.git$GOPATH/src//genproto安裝gRPC這幾條命令其實就是分別下載構(gòu)成gRPC的net、text、grpc-go和go-genproto包的源碼,執(zhí)行成功時的輸出如圖。安裝gRPC注意:上面的任何一條命令都有可能一次執(zhí)行不成功,遇此情形請讀者千萬不要慌!可多次重啟GitBash反復執(zhí)行幾次,終究是會成功的,且前面執(zhí)行失敗對再次執(zhí)行并無影響??墒褂孟旅娴拿钪刂么砑斑B接狀態(tài),增加再次執(zhí)行成功的概率:gitconfig--global--unsetxygitclonegit:///...待全部4條命令都成功執(zhí)行后,進入到本地計算機Go語言環(huán)境的GOPATH\src目錄下,可看到存放有各組件源碼的目錄,如圖。安裝gRPC(2)集成安裝在安裝好各個組件后,再通過GitBash控制臺窗口的命令進入到GOPATH\src目錄下,將所有組件集成安裝為一個完整的gRPC框架,執(zhí)行下面這條命令:goinstall/grpc@latest控制臺窗口顯示如圖。安裝gRPC6.測試安裝(1)編譯樣例工程以管理員身份打開Windows命令行,進入到樣例工程的目錄,使用protoc編譯該工程,先后輸入如下:cdC:\Users\Administrator\go\src\\grpc\examples\helloworld\helloworldprotoc--go_out=plugins=grpc:.to運行后會在樣例工程的helloworld目錄下生成一個helloworld.pb.go文件。(2)啟動服務器從命令行進入樣例工程目錄:cdC:\Users\Administrator\go\src\\grpc\examples\helloworld在該目錄下編譯和運行服務器程序,執(zhí)行命令:gorungreeter_server/main.go服務器啟動,默認在本地50051端口上監(jiān)聽,如圖。安裝gRPC(3)運行客戶端打開另外一個命令行窗口,進入樣例工程目錄,編譯和運行客戶端程序,執(zhí)行命令:orungreeter_client/main.go此時,從兩個命令行窗口可看到服務器與客戶端的通信,服務器向客戶端發(fā)出“Helloworld”問候,客戶端則回應“world”,運行過程如圖??蛻舳耸盏椒掌鞯膯柡蚍掌魇盏娇蛻舳说幕貞?章Go語言微服務開發(fā)入門在GoLand集成環(huán)境中開發(fā)微服務在GoLand集成環(huán)境中開發(fā)微服務【實例8.1】在GoLand集成開發(fā)環(huán)境下做一個簡單的微服務程序,它接收客戶端提交的編程語言名稱,用字符串拼接生成對該語言的問候再返回給客戶端輸出顯示。實現(xiàn)方式:采用Go語言原生的微服務框架Go-kit與上節(jié)安裝的gRPC相結(jié)合來實現(xiàn)微服務的遠程調(diào)用。在GoLand集成開發(fā)環(huán)境下,選擇“New”→“Project...”創(chuàng)建一個Go項目工程,項目名為MyKitGrpc,開發(fā)步驟如下。01新建proto文件新建proto文件右擊項目名,選擇“New”→“Directory”創(chuàng)建一個pb目錄,在其下新建一個文件to,編寫內(nèi)容如下:syntax="proto3";

optiongo_package="pb/"; //設置proto文件所在的目錄

packagepb;

serviceHelloService{rpcSayhello(StringRequest)returns(StringResponse){}}

messageStringRequest{stringA=1;stringB=2;}

messageStringResponse{stringRet=1;stringErr=2;}新建proto文件說明:(1)在文件中定義了一個服務接口HelloService,其中有一個Sayhello方法,它就是客戶端要調(diào)用遠程服務器上微服務的方法名,文件中還定義了雙方交互的請求參數(shù)(StringRequest)及響應返回值(StringResponse)的構(gòu)成。(2)文件開頭必須設置其所在的目錄“optiongo_package="pb/";”,這樣接下來編譯工具protoc才能正確找到這個proto文件,并在與之相同的目錄下生成RPC框架代碼。02生成RPC框架代碼生成RPC框架代碼在Goland環(huán)境底部的“Terminal”子窗口中執(zhí)行如下命令:protoc--go_out=plugins=grpc:.pb/to命令執(zhí)行后會在pb目錄下生成RPC框架代碼,對應的文件為string.pb.go,如圖。03開發(fā)微服務1.Go-kit原理2.開發(fā)業(yè)務層3.開發(fā)端點層4.開發(fā)傳輸層5.開發(fā)服務器開發(fā)微服務1.Go-kit原理(1)業(yè)務層(service):專注于業(yè)務邏輯,實現(xiàn)微服務功能,向客戶端(或其他微服務)提供可調(diào)用的遠程方法。(2)端點層(endpoint):它是Go-kit框架的核心,主要負責請求/響應格式的轉(zhuǎn)換,在某些應用場合還起到攔截器作用。另外,該層很好地彌補了gRPC服務治理能力的不足,提供對日志、限流、熔斷、鏈路追蹤和服務監(jiān)控等微服務諸多方面的擴展支持。(3)傳輸層(transport):這是最底層,主要負責網(wǎng)絡傳輸,它接收客戶端(或其他微服務)的請求并將其轉(zhuǎn)化為端點可以處理的對象,交給上面的端點層去執(zhí)行,同時把上層端點傳下來的處理結(jié)果又轉(zhuǎn)化為響應對象返回給客戶端(或發(fā)起請求的微服務)。開發(fā)微服務Go-kit框架抽象的端點設計讓開發(fā)者可以很容易地整合微服務環(huán)境的各種組件。本例將把Go-kit與gRPC整合在一起使用,程序運行時,微服務接收的客戶端請求先交由gRPC處理,它會調(diào)用解碼器進行解碼,即把請求內(nèi)容轉(zhuǎn)換為對象形式交給上層相應的“端點”,再傳送至最上面的業(yè)務層;而業(yè)務層的處理結(jié)果也是通過“端點”下傳,經(jīng)由傳輸層的編碼器編碼后才返回給客戶端的,整個過程如圖。開發(fā)微服務在項目目錄下創(chuàng)建一個kitgrpc子目錄,用于存放本例程序的所有源碼(除前面protoc自動生成的string.pb.go外),再在kitgrpc目錄下創(chuàng)建一個kit包,其中新建3個Go源文件:service.go、endpoint.go和transport.go,分別編寫實現(xiàn)業(yè)務層、端點層和傳輸層的代碼,如圖。開發(fā)微服務2.開發(fā)業(yè)務層業(yè)務層定義了一個Service接口,里面有一個Sayhello方法;又定義了一個HelloService服務(結(jié)構(gòu)體),它實現(xiàn)了接口中的Sayhello方法,打印輸出客戶端用戶提交的編程語言名稱,并將兩個字符串拼接成問候語返回(returna+b,nil)客戶端。程序代碼如下(service.go):packagekitimport( "context" "fmt")//定義服務接口typeServiceinterface{ Sayhello(ctxcontext.Context,a,bstring)(string,error)}//HelloService實現(xiàn)服務接口typeHelloServicestruct{}func(sHelloService)Sayhello(ctxcontext.Context,a,bstring)(string,error){ fmt.Println("用戶提交的是",b) returna+b,nil //返回客戶端}開發(fā)微服務3.開發(fā)端點層端點層定義了一個名為HelloEndpoint的端點,實際應用中的微服務程序往往不止一個端點,為管理方便,通常將所有端點置于一個端點集(本例為Endpoints結(jié)構(gòu)體)中;另外,還需要定義創(chuàng)建端點的函數(shù),本例定義了MakeHelloEndpoint函數(shù)用于生成HelloEndpoint端點的實例。程序代碼如下(endpoint.go):4.開發(fā)傳輸層傳輸層將HTTP請求中的參數(shù)封裝為對應的請求對象(解碼)傳遞給端點執(zhí)行,并將端點返回的響應結(jié)構(gòu)體編碼為對應的HTTP響應返回客戶端,因此這一層的關(guān)鍵就是實現(xiàn)編(解)碼函數(shù)。程序代碼如下(transport.go):開發(fā)微服務5.開發(fā)服務器在分別開發(fā)好三層的程序后,再通過寫在main函數(shù)中的服務器程序?qū)⒏鲗哟a統(tǒng)一組織起來,最終實現(xiàn)完整的微服務功能。服務器程序的源文件直接位于kitgrpc目錄下(kit包外部),代碼如下(server.go):packagemainimport( service"MyKitGrpc/kitgrpc/kit" "MyKitGrpc/pb" "context" "flag" "/grpc" "net")

funcmain(){

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論