Java應用開發(fā)(中、高級)課件 項目4 容器化微服務架構設計、開發(fā)與實施_第1頁
Java應用開發(fā)(中、高級)課件 項目4 容器化微服務架構設計、開發(fā)與實施_第2頁
Java應用開發(fā)(中、高級)課件 項目4 容器化微服務架構設計、開發(fā)與實施_第3頁
Java應用開發(fā)(中、高級)課件 項目4 容器化微服務架構設計、開發(fā)與實施_第4頁
Java應用開發(fā)(中、高級)課件 項目4 容器化微服務架構設計、開發(fā)與實施_第5頁
已閱讀5頁,還剩215頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

項目4

容器化微服務架構

設計、開發(fā)與實施【學習目標】本項目主要學習微服務架構的設計、開發(fā)與部署,了解微服務架構的設計思路,掌握使用Eureka框架構建服務注冊中心、使用feign框架便捷地調用服務接口、使用Hystrix框架實現容錯處理等微服務技術框架,解決單體應用架構可靠性差、擴展能力受限等問題;了解系統(tǒng)容器化的部署方式,掌握使用Docker鏡像制作與部署各個服務,解決系統(tǒng)快速部署的問題。【項目介紹】將項目四的餐廳點餐系統(tǒng)使用微服務架構的設計思路進行改造升級,基于主流的微服務開發(fā)框架SpringCloud,結合常用的技術框架實現服務的注冊與管理、服務之間的調用、熔斷處理以及系統(tǒng)的容器化部署。【知識結構】任務1.設計劃分微服務任務描述按照微服務架構重新設計餐廳點餐系統(tǒng),按照該系統(tǒng)的特定功能拆分出獨立的服務以及定義這些服務需要提供的接口服務。知識準備1.微服務架構介紹:微服務架構是一種架構模式,它把應用程序功能分解為一組小的服務為用戶提供最終價值,服務之間互相協(xié)調、互相配合,經常采用HTTP資源API這樣輕量的機制來相互通信,這些服務圍繞業(yè)務功能進行構建,并能通過全自動的部署機制來進行獨立部署。簡單說微服務架構是一種架構風格,可為應用程序提供更高的可維護性、可測試性和可部署性。2.服務是什么:服務就是一個單一的、可獨立部署的軟件組件,它實現了一些有用的功能,服務具有接口,為其客戶端提供對功能的訪問,比如用戶服務。3.微服務架構特點:1)由完成特定功能的小服務組成,把一個系統(tǒng)拆分成多個模塊,每個模塊又可以細分多個微服務,每個服務都可獨立的并且支持多節(jié)點部署,運行在獨立的進程中。2)去中心化的服務治理,每個微服務允許使用不同的技術來開發(fā),且數據可以不再單獨的保存在一個數據庫中,允許多種數據庫技術。3)高內聚低耦合的設計,組成各個應用的微服務,都要盡可能地實現“高內聚和低耦合”的目標,每個微服務都擁有自己的領域邊界和完整的業(yè)務邏輯。4)容錯設計和彈性設計,當服務發(fā)生故障時,能夠快速地試錯,能夠快速地檢測出故障,而且能夠在一定的情況下自動恢復。5)自動化運維,基礎設施例如服務器、數據庫、中間件等能夠彈性且自動化分配資源,微服務迭代構建要能夠滿足自動化的提交版本、自動化代碼檢查、自動化測試、自動化部署以及監(jiān)控等。4.微服務的設計步驟:1)定義系統(tǒng)操作,將應用程序的需求提煉為各種關鍵請求;2)定義服務,將系統(tǒng)拆分為多個小服務;3)定義服務接口,確定每個服務的接口,將1)中的關鍵請求分配給到各個服務接口。5.微服務的拆分設計方法:決定如何把系統(tǒng)分解為一組服務就是微服務架構的關鍵,常見的服務拆分模式有以下兩種模式:1)根據業(yè)務能力分解模式,圍繞業(yè)務功能組織服務;2)根據子域分解模式,子域圍繞領域驅動設計來組織服務。任務實施步驟1:定義系統(tǒng)操作操作者用戶故事請求接口描述管理員、服務員、后廚人員用戶登錄/login

用戶驗證并授權訪問資源服務員菜品列表/getdishesbypage獲取菜品列表服務員設定桌號/settableid設定點餐的餐桌號服務員點餐提交/addcart/commitcart提交點餐服務員訂單列表/getpaylist/requestpay獲取待支付列表后廚人員菜品烹飪管理/getrtdishes/dishesdone/getrtorder"通過按鈕確定對應菜品的烹制狀態(tài)(準備烹制、正在烹制、烹制完畢)管理員用戶管理/adduser/modifyuser/deleteuser/getonlinekitchen/getonlinewaiters/getuserbypage用戶的增刪改查功能管理員菜品管理/adddishes/modifydishes/deletedishes/getdishesbypage菜品的增刪改查功能根據用戶故事識別系統(tǒng)必須處理的各種請求,識別出應用程序的核心系統(tǒng)操作,見表5-1。表5-1用戶故事接口表步驟2:定義服務使用業(yè)務服務能力進行業(yè)務拆分,然后從業(yè)務能力定義出服務。訂餐系統(tǒng)的核心業(yè)務能力如下:1)用戶管理,管理服務員和后廚人員的操作流程和權限;2)菜品管理,管理菜品的添加、修改和刪除;3)訂單管理,管理從點餐、確認菜品訂單到完成訂單的全過程;1)菜品烹制管理,管理菜品烹制狀態(tài)。根據核心業(yè)務定義服務,對應列表見表5-2。核心業(yè)務能力服務用戶管理UserService菜品管理DishService訂單管理OrderService菜品烹制管理表5-2核心業(yè)務服務對應表步驟3:定義服務接口定義了系統(tǒng)操作列表和服務列表之后,下一步就是定義每個服務的接口,該接口可以由外部客戶端調用,也可以有其他服務調用。定義UserService的服務接口,見表5-3。接口功能HTTP請求方式URL地址支持格式獲取用戶列表GET/getuserbypageJSON新增用戶數據POST/adduserJSON修改用戶數據POST/adminmodifyuserJSON刪除用戶數據GET/deleteuserJSON表5-3服務接口表知識小結【對應證書技能】1)掌握微服務的常規(guī)設計步驟:定義系統(tǒng)操作、定義服務以及定義服務接口。根據用戶需求識別系統(tǒng)必須處理的各種請求來定義系統(tǒng)的操作,然后根據業(yè)務能力分解模式,圍繞業(yè)務功能組織服務,形成UserService、DishService和OrderService三個服務,最后將系統(tǒng)操作對用到服務的接口。2)基于RestfulAPI規(guī)范設計服務的接口,滿足系統(tǒng)操作的需求。本任務知識技能點與等級證書技能的對應關系見表5-4。任務1知識技能點對應證書技能知識點技能點工作領域工作任務職業(yè)技能要求等級軟件服務接口設計原則使RestfulAPI規(guī)范設計服務的接口2.軟件后端設計2.3服務接口設計2.3.1了解軟件服務接口設計原則;2.3.2掌握RestfulAPI接口的作用與規(guī)范;高級表5-4任務1知識技能點與等級證書技能對應拓展練習完成DishService和OrderService服務的接口設計列表。謝謝觀看任務2.搭建服務注冊與發(fā)現中心任務描述EurekaServer用于微服務架構下的服務注冊和發(fā)現,本任務就是使用EurekaServer搭建服務注冊與發(fā)現中心。知識準備在微服務架構中,會拆分多個“小服務”,這些“小服務”往往都有提供接口,調用接口的功能,這些“小服務”之間的調用需要服務發(fā)現和注冊中心進行維護,Eureka是Netflix中的一個開源框架,用于服務注冊和發(fā)現。Spring-CloudEuraka是SpringCloud是對Euraka的集成,實現微服務的注冊與發(fā)現。Eureka包含EurekaServer和EurekaClient兩部分。為了便于理解,將Eurekaclient再分為ServiceProvider和ServiceConsumer,下面是各部分的作用:1)EurekaServer,提供服務的注冊與發(fā)現;2)ServiceProvider,服務提供方,將自身服務注冊到Eureka,從而使服務消費方能夠找到;3)ServiceConsumer,服務消費方,從Eureka獲取注冊服務列表,從而能夠消費服務。任務實施步驟1:創(chuàng)建項目1)使用SpringStarterProject創(chuàng)建項目,單擊選擇“File->New->Project”,在彈出的“NewProject”窗口選擇“SrpingBoot->SpringStarterProject”,單擊“Next”按鈕,過程如圖

5-1所示:圖5-1創(chuàng)建項目-12)在“NewSpringStarterProject”窗口,設置Name為“ordersys_eurekaserver”,Group為“com.chinasofti”,JavaVersion為“8”,Package為“com.chinasofti.ordersys_eurekaserver”,單擊“Next”按鈕,過程如圖5-2所示:圖5-2創(chuàng)建項目-23)在“NewSpringStarterProjectDependencies”窗口,單擊選擇“SpringCloudDiscovery->EurekaServer”和“Web->SpringWeb”,單擊“Finish”按鈕,過程如圖

5-3所示:圖5-3創(chuàng)建項目-3步驟2:在啟動類上添加@EnableEurekaServer,使該項目作為注冊中心。@EnableEurekaServer@SpringBootApplicationpublicclassOrdersysEurekaserverApplication{ publicstaticvoidmain(String[]args){ SpringApplication.run(OrdersysEurekaserverApplication.class,args); }}步驟3:配置Eureka注冊中心參數。1)將“resources”目錄下的“application.properties”文件改名為“application.yml”。2)配置“application.yml”文件,通過配置registerWithEureka和fetchRegistry為false來表明該服務是eurekaserver。server:port:8761eureka:instance:hostname:localhostclient:#聲明自己是個服務端registerWithEureka:falsefetchRegistry:falseserviceUrl:defaultZone:http://${eureka.instance.hostname}:${server.port}/eureka/server:enable-self-preservation:false步驟4:啟動&訪問注冊中心頁面1)啟動注冊中心,選擇啟動類“OrdersysEurekaserverApplication”,右鍵單擊選擇“RunAs->SpringBootApp”,過程如圖

5-4所示:圖5-4啟動注冊中心2)訪問注冊中心,打開瀏覽器,在地址欄中輸入“http://localhost:8761/”,結果如圖5-5所示:圖5-5訪問注冊中心知識小結【對應證書技能】使用Spring-CloudEuraka搭建服務注冊與發(fā)現中心步驟簡單,主要是下面三個步驟:使用SpringBoot快速構建項目,注意要導入“SpringCloudDiscovery->EurekaServer”依賴;在啟動類上添加@EnableEurekaServer,啟動注冊中心;配置“application.yml”文件設置注冊中心的參數。本任務知識技能點與等級證書技能的對應關系見表5-5。任務2知識技能點對應證書技能知識點技能點工作領域工作任務職業(yè)技能要求等級服務注冊與發(fā)現中心使用Euraka框架搭建服務注冊與發(fā)現中心3.高性能系統(tǒng)開發(fā)3.3Java微服務開發(fā)與部署3.3.4熟練掌握Eruka/Consul服務注冊與發(fā)現中心的部署于配置;高級表5-5任務2知識技能點與等級證書技能對應謝謝觀看任務3.實現菜品服務的設計與開發(fā)任務描述

本任務就是使用EurekaClient構建菜品服務并將服務注冊到注冊中心。知識準備EurekaClient(服務提供者)EurekaClient用于將服務注冊到注冊中心,EurekaServer會將注冊信息向其他EurekaServer進行同步,當服務消費者要調用服務提供者,則向服務注冊中心獲取服務提供者地址,然后會將服務提供者地址緩存在本地,下次再調用時,則直接從本地緩存中取,完成一次調用。任務實施步驟1:創(chuàng)建菜品服務項目參考任務2創(chuàng)建項目“ordersys_dishservice”,選擇該項目的依賴“SpringCloudDiscovery->EurekaDiscoveryClient”、“Web->SpringWeb”和“SpringCloudRouting->OpenFeign”,創(chuàng)建項目,如圖

5-6所示:圖5-6創(chuàng)建項目步驟2:在啟動類上添加@EnableEurekaClient,使該項目作為服務提供者。@EnableEurekaClient@SpringBootApplicationpublicclassOrdersysDishserviceApplication{ publicstaticvoidmain(String[]args){ SpringApplication.run(OrdersysDishserviceApplication.class,args); }}步驟3:配置服務提供者參數1)將“resources”目錄下的“application.properties”文件改名為“application.yml”。2)配置“application.yml”文件,配置“defaultZone:http://localhost:8761/eureka/”指向注冊中心,“name:dishService”指定dishService為服務名字,用于對外提供服務名。server:port:8771#指向注冊中心地址eureka:client:serviceUrl:defaultZone:http://localhost:8761/eureka/#服務名稱,建議駝峰命名spring:application:name:dishService步驟5:引入項目四的菜品代碼1)引入JAVA項目代碼,根據提供的項目代碼復制到DishService項目,結果如圖5-8所示:圖5-8菜品代碼目錄2)配置“pom.xml”,引入Mybatis框架和MySQL驅動,代碼如下:<!--mybatis--><dependency> <groupId>org.mybatis.spring.boot</groupId> <artifactId>mybatis-spring-boot-starter</artifactId> <version>2.0.1</version></dependency>

<!--數據庫驅動--><dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <scope>runtime</scope> <version>8.0.15</version></dependency>3)配置“application.yml”,#服務名稱,建議駝峰命名spring:application:name:dishServiceprofiles:active:dev#熱編譯devtools:restart:#需要實時更新的目錄additional-paths:resources/**,static/**,templates/**datasource:driver-class-name:com.mysql.cj.jdbc.Driverurl:jdbc:mysql://34:3306/ordersys-v3?useUnicode=true&characterEncoding=utf-8&allowMultiQueries=true&useSSL=false&serverTimezone=UTCusername:rootpassword:Apj123@pjplatform:mysqlmybatis:#指定實體類存放的包路徑type-aliases-package:com.chinasofti.ordersys_dishservice.model#指定mapper.xml文件的位置為/mybatis-mappers/下的所有xml文件mapper-locations:classpath:/mybatis-mappers/*#轉換到駝峰命名configuration:mapUnderscoreToCamelCase:true步驟6:驗證服務接口1)按順序分別運行注冊中心和菜品服務。2)打開Postman,在地址欄中輸入“http://localhost:8771/admin/dishes/toprecommend”,可以看到獲取頭4條推薦菜品信息,結果如圖5-9所示:圖5-9驗證菜品服務知識小結【對應證書技能】使用Spring-CloudEurakaClient搭建服務并注冊到注冊中心,主要是下面三個步驟:1)使用SpringBoot快速構建項目,注意要導入“SpringCloudDiscovery->EurekaServer”依賴;2)在啟動類上添加@EnableEurekaServer,啟動注冊中心;3)配置“application.yml”文件設置注冊中心的參數。本任務知識技能點與等級證書技能的對應關系見表5-6。

任務2知識技能點對應證書技能知識點技能點工作領域工作任務職業(yè)技能要求等級構建服務提供者使用EurakaClient構建服務并注冊到注冊中心3.高性能系統(tǒng)開發(fā)3.3Java微服務開發(fā)與部署3.3.4熟練掌握Eruka/Consul服務注冊與發(fā)現中心的部署于配置;高級表5-6任務3知識技能點與等級證書技能對應拓展練習按照任務3的步驟構建用戶服務并注冊到注冊中心。謝謝觀看任務4.實現訂單服務設計與開發(fā)任務描述本任務是開發(fā)訂單服務并將服務注冊到注冊中心,同時通過Feign框架提供訂單服務作為服務消費者去調用菜單服務的能力。知識準備1)Feign(服務消費者)Feign是springcloud中服務消費端的調用框架,Feign是一個聲明式、模板化的HTTP客戶端,可幫助更加便捷、優(yōu)雅的調用接口。在SpringCloud中,使用Feign創(chuàng)建一個接口并對它進行注解,編碼就完成了。它具有可插拔的注解支持包括Feign注解與JAX-RS注解,Feign還支持可插拔的編碼器與解碼器,SpringCloud對Feign做了增強,使Feign支持SpringMVC的注解,并集成Ribbon和Eureka,使用Feign使用非常方便。2)Hystix(熔斷器)Hystrix是Netflix開源的一款容錯框架,同樣具有自我保護能力,Hystix是一個遠程過程調用的代理,在連續(xù)失敗次數超過指定閾值后的一段時間內,這個代理會立即拒絕其他調用。3)服務故障的“雪崩”效應為了保證其高可用,單個服務通常會集群部署。由于網絡原因或者自身的原因,服務并不能保證100%可用,如果單個服務出現問題,調用這個服務就會出現線程阻塞,此時若有大量的請求涌入,Servlet容器的線程資源會被消耗完畢,導致服務癱瘓。服務與服務之間的依賴性,故障會傳播,會對整個微服務系統(tǒng)造成災難性的嚴重后果,這就是服務故障的“雪崩”效應,Hystrix用于解決服務故障的“雪崩”效應這個問題。任務實施步驟1:創(chuàng)建訂單服務1)參考任務3創(chuàng)建項目“ordersys_orderservice”,其中依賴包與任務3完全相同。2)在啟動類上添加@EnableEurekaClient,使該項目作為服務提供者。@EnableEurekaClient@SpringBootApplicationpublicclassOrdersysOrderserviceApplication{ publicstaticvoidmain(String[]args){ SpringApplication.run(OrdersysOrderserviceApplication.class,args); }}3)修改并配置“application.yml”文件。server:port:8772#指向注冊中心地址eureka:client:serviceUrl:defaultZone:http://localhost:8761/eureka/#服務名稱,建議駝峰命名spring:application:name:orderService步驟2:驗證訂單服務是否注冊1)按順序分別運行啟動文件,啟動注冊中心、菜品服務和訂單服務。2)訪問注冊中心,打開瀏覽器,在地址欄中輸入“http://localhost:8761/”,可以看到dishService和orderService服務已經在注冊中心中,結果如圖5-10所示:圖5-10注冊中心的訂單服務步驟3:引入項目四中的訂單相關代碼參考任務3的步驟,根據提供的代碼引入訂單代碼到項目。步驟4:服務間調用在項目實際應用中,往往需要服務之間相互調用,如在點餐系統(tǒng)中,訂單服務根據菜品的ID獲取菜品詳情,微服務框架中常常使用Feign框架來實現服務之間的調用通信。1)在菜品服務中增加獲取菜品詳情接口,在“ordersys_dishservice”項目的“AdminDishesController”類中增加getDishesForApi()方法,其中對外接口URL為“/admin/dishes/api/get”,使用@RequestParam將請求參數“dishesId”綁定到方法參數上,代碼如下:@GetMapping("/api/get")publicResults<DishesInfo>getDishesForApi(@RequestParam(value="dishesId")IntegerdishesId){ returnResults.success(service.getDishesById(dishesId));}2)在訂單服務中啟用Feign客戶端,啟動類“OrdersysOrderserviceApplication”中增加@EnableFeignClients注解,開啟SpringCloudFeign的支持功能,代碼如下:@EnableEurekaClient@EnableFeignClients@SpringBootApplicationpublicclassOrdersysOrderserviceApplication{ publicstaticvoidmain(String[]args){ SpringApplication.run(OrdersysOrderserviceApplication.class,args); }}3)在訂單服務中定義DishFeignClient訪問菜品服務,在“service”包下增加DishFeignClient接口,使用@FeignClient注解指定服務名“dishservice”來綁定菜單服務,然后再使用@GetMapping("/admin/dishes/api/get")注解來綁定具體菜單服務提供的REST接口,@RequestParam綁定參數,注意一定要和菜品服務中的getDishesForApi()方法的參數保持一致。@FeignClient(name="dishservice")publicinterfaceDishFeignClient{ @GetMapping("/admin/dishes/api/get") Results<DishesInfo>findAllOrders(@RequestParam(value="dishesId")intid);}4)在“OrderController”下引入DishFeignClient,增加getDishesForApi()方法,通過調用findAllOrders()來獲取菜品數據。@AutowiredprivateDishFeignClientdishFeignClient;

@GetMapping("/api/get")publicResults<DishesInfo>getDishesForApi(@RequestParam(value="dishesId")IntegerdishesId){ returndishFeignClient.findAllOrders(dishesId);}5)驗證服務之間的調用通信。按順序分別運行注冊中心、菜品服務和訂單服務,打開Postman,在地址欄中輸入“http://localhost:8772/order/api/get?dishesId=1”,可以看到訂單服務通過調用菜品服務獲取菜品信息,結果如圖5-11所示:圖5-11驗證訂單服務步驟5:服務熔斷處理在微服務架構的點餐系統(tǒng)中,訂單服務請求菜品服務,如果菜品服務出現故障,會導致連鎖故障。當對特定的服務的調用的不可用且達到一個閥值,如Hystrix是5秒20次,斷路器將會被打開。1)在“pom.xml”文件中增加Hystrix依賴,代碼如下:<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-hystrix</artifactId> <version>2.2.8.RELEASE</version></dependency>2)開啟feign支持熔斷處理,修改訂單服務的“application.yml”文件,開啟hystrix,代碼如下:feign:circuitbreaker:enabled:true3)在啟動類上添加@EnableCircuitBreaker注解,代碼如下:@EnableCircuitBreaker@EnableEurekaClient@EnableFeignClients@SpringBootApplicationpublicclassOrdersysOrderserviceApplication{ publicstaticvoidmain(String[]args){ SpringApplication.run(OrdersysOrderserviceApplication.class,args); }}4)增加配置熔斷處理類,在DishFeignClient接口的注解中加上fallback的指定類“DishFeignClientFallback”用于實現斷路器,Fallback相當于是降級操作.對于查詢操作,實現一個fallback方法,當請求菜品服務出現異常的時候,可以使用fallback方法返回的值,fallback方法的返回值一般是設置的默認值或者直接返回錯誤,代碼如下:@FeignClient(name="dishservice",fallback=DishFeignClientFallback.class)publicinterfaceDishFeignClient{ @GetMapping("/admin/dishes/api/get") Results<DishesInfo>findAllOrders(@RequestParam(value="dishesId")intid);}5)實現熔斷處理類,“service”包下增加DishFeignClientFallback實現DishFeignClient接口,直接返回錯誤,代碼如下:publicclassDishFeignClientFallbackimplementsDishFeignClient{ @Override publicResults<DishesInfo>findAllOrders(intid){ System.out.println("降級處理!"); circuitbreakerreturnResults.failure(10001,"抱歉,菜品服務走失了..."); }}知識小結【對應證書技能】在微服務架構中,多個服務之間使用Feign框架實現服務間的通信,Feign是一個聲明式的偽Http客戶端,使用Feign,僅需要創(chuàng)建一個接口并通過@FeignClient注解綁定調用目標服務即可調用該服務;在服務與服務之間相互調用時,Hystrix框架用于如果服務出現故障時提供熔斷功能,通過fallback方法可以直接返回一個固定值,避免連鎖故障拖垮服務。本任務知識技能點與等級證書技能的對應關系見表5-7。任務2知識技能點對應證書技能知識點技能點工作領域工作任務職業(yè)技能要求等級服務間調用;服務斷路器和熔斷處理;

使用SpringCloudHystrix實現服務熔斷;使用SpringCloudFeign實現服務間的調用;3.高性能系統(tǒng)開發(fā)3.3Java微服務開發(fā)與部署3.3.7能夠基于SpringCloud實現服務斷路器和熔斷處理;高級表5-7任務4知識技能點與等級證書技能對應謝謝觀看任務5.構建Gateway網關路由服務任務描述本任務就是使用SpringCloudGateway框架構建網關服務,接收并轉發(fā)所有的客戶端調用。知識準備1)網關服務通常在項目中為了簡化前端的調用邏輯,同時也簡化內部服務之間互相調用的復雜度,具體作用就是轉發(fā)服務,接收并轉發(fā)所有內外部的客戶端調用,網關其他常見的功能還有權限認證,限流控制,日志輸出等等。2)SpringCloudGateway是SpringCloud的一個全新項目,該項目是基于Spring5.0,SpringBoot2.0和ProjectReactor等技術開發(fā)的網關,它旨在為微服務架構提供一種簡單有效的統(tǒng)一的API路由管理方式。SpringCloudGateway不僅提供統(tǒng)一的路由方式,并且基于Filter鏈的方式提供了網關基本的功能,例如:安全,監(jiān)控/指標,和限流。3)SpringCloudGateway的核心概念路由(Route):路由是網關最基礎的部分,路由信息由ID、目標URI、一組斷言和一組過濾器組成。如果斷言路由為真,則說明請求的URI和配置匹配。斷言(Predicate):Java8中的斷言函數。SpringCloudGateway中的斷言函數輸入類型是Spring5.0框架中的ServerWebExchange。SpringCloudGateway中的斷言函數允許開發(fā)者去定義匹配來自于HttpRequest中的任何信息,比如請求頭和參數等。過濾器(Filter):一個標準的SpringWebFilter。SpringCloudGateway中的Filter分為兩種類型,分別是GatewayFilter和GlobalFilter。過濾器將會對請求和響應進行處理。任務實施步驟1:創(chuàng)建網關服務1)參考任務2創(chuàng)建項目“ordersys_gateway”,選擇該項目的依賴“SpringCloudDiscovery->EurekaDiscoveryClient”和“SpringCloudRouting->Gateway”,創(chuàng)建項目,如圖5-13所示:圖5-13創(chuàng)建網關服務2)在啟動類上添加@EnableEurekaClient,使該項目作為服務提供者。@EnableEurekaClient@SpringBootApplicationpublicclassOrdersysGatewayApplication{ publicstaticvoidmain(String[]args){ SpringApplication.run(OrdersysGatewayApplication.class,args); }}3)修改并配置“application.yml”文件,設置服務端口8762以及向注冊中心注冊。server:port:8762#指向注冊中心地址eureka:client:serviceUrl:defaultZone:http://localhost:8761/eureka/#服務名稱,建議駝峰命名spring:application:name:gateway步驟2:自定義配置路由規(guī)則1)修改“application.yml”文件,增加“cloud:gateway:routes”配置,字段配置作用如下:id:設置自定義的路由ID,保持唯一,名字為“dishservice-route”;uri:設置跳轉到目標服務地址,此處設置為“l(fā)b://dishservice”,對應格式為“l(fā)b://服務注冊名字”,意為使用的協(xié)議為“l(fā)b”,服務注冊名字為“dishservice”,Gateway將使用LoadBalancerClient通過eureka解析為實際的主機和端口,并進行負載均衡訪問。predicates:設置路由跳轉條件,Predicate接受一個輸入參數,返回一個布爾值結果,設置“Path=/api/dishservice/**”,意為當訪問路徑包含“/api/dishservice/”時,跳轉到uri配置的“dishservice”服務。filters:設置過濾器規(guī)則,StripPrefix參數表示在將請求發(fā)送到下游服務之前從請求中剝離的路徑個數,設置StripPrefix=2,意為當通過Gateway網關向“/api/dishservice/admin/dishes/toprecommend”發(fā)出請求時,轉發(fā)到服務的實際請求為“/admin/dishes/toprecommend”。詳細代碼如下:#服務名稱,建議駝峰命名spring:application:name:gatewaycloud:gateway:routes:-id:dishservice-routeuri:lb://dishservicepredicates:-Path=/api/dishservice/**filters:-StripPrefix=22)按順序分別運行注冊中心、菜品服務、訂單服務和網關服務,打開Postman,在地址欄中輸入“http://localhost:8762/api/dishservice/admin/dishes/toprecommend”,可以看到訪問網關服務后跳轉到菜品服務,結果如圖5-14所示:圖5-14驗證網關路由功能步驟3:自動配置路由規(guī)則步驟2中實現了手動配置路由轉發(fā)規(guī)則,實現轉發(fā)到菜品服務的功能,微服務架構中服務較多,可以使用自動配置的方式代替手動配置的方式實現全部服務的轉發(fā)功能。1)修改“application.yml”文件,增加“cloud:gateway:routes:discovery:locator”配置,字段配置作用如下:enabled:設置為true,表明gateway開啟服務注冊和發(fā)現的功能,并且springcloudgateway自動根據服務發(fā)現為每一個服務創(chuàng)建了一個路由router,這個router將以服務名開頭的請求路徑轉發(fā)到對應的服務。lowerCaseServiceId:設置為true,表明將請求路徑上的服務名配置為小寫,注冊中心注冊時將服務名默認是大寫。詳細代碼如下:#服務名稱,建議駝峰命名spring:application:name:gatewaycloud:gateway:discovery:locator:enabled:truelowerCaseServiceId:true2)按順序分別運行注冊中心、菜品服務、訂單服務和網關服務,打開Postman,在地址欄中輸入“http://localhost:8762/dishservice/admin/dishes/toprecommend”,可以看到訪問網關服務后根據服務名跳轉到菜品服務,結果如圖5-15所示:圖5-15驗證網關路由功能知識小結【對應證書技能】使用SpringCloudGateway構建網關服務,提供核心的路由功能,為微服務架構提供統(tǒng)一的API路由管理方式,通過配置路由信息ID、目標URI、斷言Predicate和過濾器Filter實現路由根據匹配規(guī)則轉發(fā)請求。本任務知識技能點與等級證書技能的對應關系見表5-8。任務2知識技能點對應證書技能知識點技能點工作領域工作任務職業(yè)技能要求等級構建網關服務使用SpringCloudGateway框架構建網關服務3.高性能系統(tǒng)開發(fā)3.3Java微服務開發(fā)與部署3.3.6能夠基于SpringCloudGateway實現網關轉發(fā)與請求過濾;高級表5-8任務5知識技能點與等級證書技能對應謝謝觀看任務6.實現鏈路追蹤功能任務描述本任務是使?Zipkin和Sleuth框架實現業(yè)務分析調?鏈路追蹤系統(tǒng),用于分析微服務架構的服務接口問題分析、性能診斷等問題。知識準備1)Sleuth框架在微服務框架中,一個由客戶端發(fā)起的請求在后端系統(tǒng)中會經過不同的服務節(jié)點調用來協(xié)同產生的最后的請求結果,每一個前端請求都會形成一條復雜的分布式調用鏈路,鏈路中的任何一個環(huán)節(jié)出現高延時或錯誤都會引起整個請求的失敗。SpringCloudSleuth為SpringCloud實現了分布式跟蹤解決方案,且兼容Zipkin,結合Zipkin做鏈路跟蹤。Sleuth是一個工具,能跟蹤一個用戶請求的過程,捕獲到跟蹤數據,構建微服務的整個調用鏈的視圖,它是調試和監(jiān)控微服務的關鍵工具,可以快速發(fā)現錯誤根源以及監(jiān)控分析每條請求鏈路上的性能。2)Zipkin框架Zipkin是一個可視化的分布式跟蹤系統(tǒng)。它有助于收集解決服務體系結構中的延遲問題所需的時序數據。Zipkin最初是為了在Cassandra上存儲數據而構建的,因為Cassandra是可擴展的,具有靈活的模式,并且在Twitter中大量使用。除了支持Cassandra,還支持ElasticSearch和MySQL。如果日志文件中有跟蹤ID,則可以直接跳至該跟蹤ID。還可以基于屬性進行查詢,例如服務,操作名稱,標簽和持續(xù)時間,服務中花費的時間百分比以及操作是否失敗。任務實施步驟1:增加Sleuth鏈路追蹤功能1)在各個微服務項目的“pom.xml”文件添加sleuth依賴,<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-sleuth</artifactId></dependency>2)啟動全部服務,打開Postman,在地址欄中輸入“http://localhost:8762/orderservice/order/api/get?dishesId=1”,通過訂單服務調用菜單服務,打開STS的“Console”分析Sleuth日志的結果,如圖5-16所示:圖5-16Sleuth日志功能可以看到Sleuth在日志中增加“[dishservice,8fa6395f7b567ced,42502fd383b15965]”信息用于日志追蹤,分析如下:第一個值:服務名,對應的是的值;第二個值:TraceID,用來標識一條請求鏈路,一條請求鏈路中包含一個TraceID;第三個值:SpanID,基本的工作單元,獲取元數據。步驟2:構建Zipkin服務端通過Sleuth框架收集到日志鏈路信息,并不方便開發(fā)人員查看分析,通過引入Zipkin框架來實現鏈路追蹤的可視化WEB界面分析調用鏈路耗時等情況。1)啟動Zipkin服務端,下載提供的“zipkin-server-2.12.9-exec.jar”文件,執(zhí)行“java-jarzipkin-server-2.12.9-exec.jar”命令,啟動Zipkin服務端,打開瀏覽器訪問“:9411/”,結果如圖

5-17所示:圖5-17Zipkin服務步驟3:服務中增加Zipkin客戶端在網關服務、菜品服務和訂單服務的“pom.xml”文件中添加Zipkin依賴<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-sleuth-zipkin</artifactId></dependency>步驟4:配置Zipkin服務端地址在網關服務、菜品服務和訂單服務的“application.yml”文件中配置zipkin和sleuth,注意與application是同層級,通過“zipkin:base-url”設置指向Zipkin服務端地址和“sleuth:sampler:probability”設置采樣百分比,設為1代表100%采樣,即記錄全部的sleuth信息。#服務名稱,建議駝峰命名spring:application:name:dishservicezipkin:base-url::9411/discovery-client-enabled:falsesleuth:sampler:probability:1.0步驟5:驗證可視化的鏈路追蹤系統(tǒng)1)啟動全部服務,打開Postman,在地址欄中輸入“http://localhost:8762/orderservice/order/api/get?dishesId=1”。2)在瀏覽器中訪問“:9411/”查看鏈路追蹤系統(tǒng),可以看到調用的服務名,結果如圖5-18所示:圖5-18查看鏈路追蹤系統(tǒng)圖

5-19查看鏈路耗時3)選擇“orderservice”服務,單擊“查詢”按鈕,可以看到鏈路耗時情況,結果如下圖5-19所示:3)選擇“orderservice”服務,單擊“查詢”按鈕,可以看到鏈路耗時情況,結果如下圖5-19所示:圖5-20查看鏈路詳情知識小結【對應證書技能】微服務架構系統(tǒng)服務之間調用很多次后端服務才能完成特定功能,當整個請求變慢或不可用時,很難得知該請求是由哪個后端服務引起的,這時就需要解決如何快讀定位服務故障點,本任務就是使用Sleuth結合Zipkin構建調?鏈路追蹤功能,可以很方便的理清服務間的調用關系,看出每個采樣請求的耗時,分析出哪些服務調用比較耗時,然后優(yōu)化鏈路。本任務知識技能點與等級證書技能的對應關系見表5-9。任務2知識技能點對應證書技能知識點技能點工作領域工作任務職業(yè)技能要求等級開發(fā)服務間調用的分析追蹤系統(tǒng);使用Sleuth結合Zipkin構建鏈路追蹤系統(tǒng),分析服務提供者與消費者鏈路;3.高性能系統(tǒng)開發(fā)3.3Java微服務開發(fā)與部署3.3.5能夠基于Eruka/Consul服務注冊與發(fā)現中心開發(fā)實現服務提供者與消費者;高級表5-9任務6知識技能點與等級證書技能對應謝謝觀看任務7.完成各個服務的Docker打包任務描述本任務是將注冊中心、網關、菜品和訂單服務使用Docker容器打包,以方便實現快速部署。知識準備1)docker-maven-plugin插件在項目打包發(fā)布的持續(xù)集成過程中,項目常常使用Maven框架進行編譯打包,并生成鏡像,通過鏡像部署上線,可以極大提升系統(tǒng)上線效率,同時能夠快速動態(tài)擴容,快速回滾等需求。Spotify公司開發(fā)的docker-maven-plugin插件就是通過簡單的配置,在Maven工程中自動生成鏡像并推送到Docker倉庫中。任務實施步驟1:配置遠程連接Docker服務1)打開STS工具,菜單欄單擊選擇“Window->ShowView->Other->Docker->DockerExplore”,單擊“open”按鈕打開Docker視圖,在該視圖下單擊建立DockerConnection,輸入已開啟遠程連接的Docker服務端地址(項目四中使用的Docker服務),單擊“Finish”按鈕,結果如圖5-21所示:圖5-21配置Docker連接2)連接成功,可以看到當前Dockerserver中已有鏡像和容器,結果如圖5-22所示:圖5-22DockerExplore視圖步驟2:構建服務注冊中心的Docker鏡像1)修改服務注冊中心的“pom.xml”文件,增加Spotify的docker-maven-plugin插件,提供使用maven插件構建docker鏡像的功能。<build><finalName>eurekaserver</finalName><plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> <plugin> <groupId>com.spotify</groupId> <artifactId>dockerfile-maven-plugin</artifactId> <version>1.3.6</version> <configuration> <buildArgs> <JAR_FILE>target/${project.build.finalName}.jar</JAR_FILE> </buildArgs> </configuration> </plugin></plugins></build>2)在項目根目錄下,創(chuàng)建用來構建鏡像的Dockerfile文件,編寫命令如下:###基礎鏡像,使用alpine操作系統(tǒng),openjkd使用8u201FROMopenjdk:8u201-jdk-alpine3.9#系統(tǒng)編碼ENVLANG=C.UTF-8LC_ALL=C.UTF-8#聲明一個掛載點,容器內此路徑會對應宿主機的某個文件夾VOLUME/tmp#構建成功的jar文件復制到鏡像內,名字改成app.jarADDtarget/eurekaserver.jarapp.jar#啟動容器時的進程ENTRYPOINT["java","-jar","/app.jar"]#暴露鏡像端?EXPOSE87613)使用Maven打包服務注冊中心,右擊“ordersys_eurekaserver”項目,選擇“RunAs->MavenInstall”,構建成功之后,可以看到“target”目錄下生成eurekaserver.jar文件,結果如圖5-23所示:圖5-23Maven打包服務注冊中心4)單擊“啟動”按鈕后的三角號,選擇“RunConfiguration...”,如下圖5-24所示:圖5-24RunConfiguration過程5)選擇“BuildDockerImage”,右擊選擇“NewConfiguration”,過程如圖5-25所示:圖5-25BuildDockerImage6)配置構建Docker鏡像的服務端,其中Name為“eurekaserver”,DockerConnection選擇步驟一中配置的docker服務端“docker云”,BuildContextPath選擇“\ordersys_eurekaserver”目錄,Repositoryname設置為“ordersys_eurekaserver”,Dockerfilename設置為前面創(chuàng)建的“Dockerfile”文件,過程如圖5-26所示:圖5-26配置服務注冊中心構建參數7)單擊“Run”按鈕,顯示構建成功,運行結果如下圖所示:8)單擊選擇“DockerExplorer”視圖,可以看到“ordersys_eurekaserver”鏡像被成功創(chuàng)建,結果如圖5-27所示:圖5-27服務注冊中心鏡像上傳至倉庫步驟3:構建菜品服務的Docker鏡像1)修改菜品服務的“pom.xml”文件,增加Spotify的docker-maven-plugin插件,代碼如下:<build><finalName>dishservice</finalName><plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> <plugin> <groupId>com.spotify</groupId> <artifactId>dockerfile-maven-plugin</artifactId> <version>1.3.6</version> <configuration> <buildArgs> <JAR_FILE>target/${project.build.finalName}.jar</JAR_FILE> </buildArgs> </configuration> </plugin></plugins></build>2)修改菜品服務的“application.yml”文件,修改注冊中心指向DockerServer容器:#指向注冊中心地址eureka:client:serviceUrl:defaultZone:31:8761/eureka/3)在項目根目錄下,創(chuàng)建用來構建鏡像的Dockerfile文件,編寫命令如下:###基礎鏡像,使用alpine操作系統(tǒng),openjkd使用8u201FROMopenjdk:8u201-jdk-alpine3.9#系統(tǒng)編碼ENVLANG=C.UTF-8LC_ALL=C.UTF-8#聲明一個掛載點,容器內此路徑會對應宿主機的某個文件夾VOLUME/tmp#構建成功的jar文件復制到鏡像內,名字改成app.jarADDtarget/dishservice.jarapp.jar#啟動容器時的進程ENTRYPOINT["java","-jar","/app.jar"]#暴露鏡像端?EXPOSE87714)使用Maven打包菜品服務,右擊“ordersys_dishservice”項目,選擇“RunAs->MavenInstall”,構建成功之后,可以看到“target”目錄下生成dishservice.jar文件,結果如圖5-28所示:圖5-28Maven打包菜品服務5)配置構建Docker鏡像的服務端,其中Name為“dishservice”,DockerConnection選擇步驟一中配置的docker服務端“docker云”,BuildContextPath選擇“\ordersys_eurekaserver”目錄,Repositoryname設置為“ordersys_dishservice”,Dockerfilename設置為前面創(chuàng)建的“Dockerfile”文件,過程如圖5-29所示:圖5-29配置菜品服務構建參數6)單擊“Run”按鈕,運行完成后選擇“DockerExplorer”視圖,可以看到“ordersys_dishservice”鏡像被成功創(chuàng)建,結果如圖5-30所示:圖5-30菜品鏡像上傳至倉庫拓展練習構建其他服務的Docker鏡像參照步驟三,分別構建訂單服務和網關服務的Docker鏡像。知識小結【對應證書技能】使用Spotify公司開發(fā)的docker-maven-plugin插件將SpringBoot項目自動構建Docker鏡像,使用該插件構建Docker鏡像,需要有一個安裝好的Docker運行環(huán)境,本案例中使用的CentOS系統(tǒng)下安裝的Docker服務,構建鏡像的核心任務分為三個步驟:1)在pom.xml中引入dockerfile-maven-plugin插件,并配置該插件;2)編寫Dockerfile文件;3)構建Docker鏡像并推送到Docker倉庫中。本任務知識技能點與等級證書技能的對應關系見表5-10。任務2知識技能點對應證書技能知識點技能點工作領域工作任務職業(yè)技能要求等級JAVA項目構建Docker鏡像將SpringBoot項目構建成Docker鏡像1.容器管理1.2容器鏡像制作1.2.1能使用Dockerfile來定制一個構建鏡像;高級表5-10任務7知識技能點與等級證書技能對應謝謝觀看任務8.完成系統(tǒng)的容器化部署任務描述本任務是將鏈路追蹤系統(tǒng)、服務注冊中心、網關、菜品和訂單服務實現容器化部署。知識準備1.容器化部署技術容器化部署是指將應用整合到容器中并且運行起來的這個過程,容器能夠簡化應用的構建、部署和運行過程。這個過程簡單地說,就是將Java項目和依賴包打成一個帶有操作指令的鏡像文件,然后在服務器創(chuàng)建一個容器,讓鏡像在容器內運行,從而實現項目的部署。

針對SpringBoot項目的容器化部署過程主要有以下幾個步驟:(1)項目創(chuàng)建Dockerfile文件;(2)打包并構建項目的Docker鏡像;(3)將項目鏡像上傳到Docker倉庫;(4)使用Dockerrun命令運行項目容器完成部署;任務實施步驟1:使用Docker容器部署Zipkin服務端1)使用Putty登錄到CentOS服務器,執(zhí)行命令“dockerpullopenzipkin/zipkin:latest”拉取Zipkin鏡像,結果如圖5-31所示:圖5-31拉取Zipkin鏡像2)執(zhí)行“dockerimages”命令查看鏡像,結果如圖5-32所示:圖5-32拉取Zipkin鏡像3)執(zhí)行“dockerrun--nameordersys-zipkin-d-p9411:94119b4acc3eb019”命令啟動Zipkin服務器,其中“dockerrun--nameordersys-zipkin-d-p9411:94119b4acc3eb019”是上面查詢到的zipkin的鏡像ID,另外如果使用的是華為云等云服務器,記得配置網絡安全組開放9411端口,結果如圖5-33所示:圖5-33運行Zipkin容器4)訪問Zipkin,打開瀏覽器訪問“http://公?ip:9411/zipkin/”,結果如圖5-34所示:圖5-34訪問Zipkin5)修改全部服務的“application.yml”文件,將zipkin服務端地址指向“31:9411/zipkin/”,否則無法實現鏈路追蹤。zipkin:base-url:31:9411/步驟2:使用Docker容器部署服務中心1)執(zhí)行“dockerimages”命令查看鏡像,結果如圖5-35所示:圖5-35查看鏡像2)執(zhí)行“dockerrun--nameordersys_eurekaserver-d-p8761:8761916ccf8e36b1”命令啟動服務注冊中心,結果如圖5-36所示:圖5-36啟動服務注冊中心3)打開瀏覽器訪問“31:8761/”,結果如圖5-37所示:圖5-37查看服務注冊中心4)修改全部服務的“application.yml”文件,將注冊中心地址指向“31:8761/eureka/”,然后重新構建鏡像。#指向注冊中心地址eureka:client:serviceUrl:defaultZone:31:8761/eureka/instance:

#以IP地址注冊到服務中心,相互注冊使用IP地址prefer-ip-address:true步驟3:使用Docker容器部署菜品服務1)執(zhí)行“dockerimages”命令查看鏡像,結果如圖5-38所示:圖5-38查看鏡像2)執(zhí)行“dockerrun--nameordersys_dishservice-d-p8771:8771e8a1063ddf23”命令啟動菜品服務,其中e8a1063ddf23為ordersys_dishservice的鏡像ID。圖5-39啟動菜品服務3)打開Postman訪問接口“http://31:8771/admin/dishes/toprecommend”,成功返回數據,結果如圖5-40所示:圖5-40驗證菜品服務4)打開瀏覽器訪問“31:8761/”,看到“DISHSERVICE”已經注冊到注冊中心,結果如圖5-41所示:圖5-41菜品注冊到注冊中心步驟4:使用Docker容器部署網關服1)執(zhí)行“dockerimages”命令查看鏡像,結果如圖5-42所示:圖5-42查看鏡像2)執(zhí)行“dockerrun--nameordersys_gateway-d-p8762:876208321d099afc”命令啟動菜品服務,其中08321d099afc為ordersys_gateway的鏡像ID,結果如圖5-43所示:圖5-43啟動菜品服務3)打開瀏覽器訪問“31:8761/”,看到“GATEWAY”已經注冊到注冊中心,結果如圖5-44所示:圖5-44啟動菜品服務4)打開Postman訪問接口“http://31:8762/dishservice/admin/dishes/toprecommend”,成功返回數據代表網關部署成功,結果如圖5-45所示:圖5-45網關中轉到菜品服務5)打開瀏覽器訪問“31:9411/zipkin/”鏈路追蹤系統(tǒng),查詢“serviceName=dishservice”,結果如圖5-46所示:圖5-46驗證網關服務拓展練習使用Docker容器部署訂單服務參照步驟三,使用Docker容器部署訂單服務,并查看注冊中心是否成功注冊。知識小結【對應證書技能】本任務主要是實現兩種應用服務的部署,一種是Zipkin第三方服務的部署,另一種是餐廳點餐系統(tǒng)應用服務的部署。1)第三方服務服務的部署,如Zipkin服務部署,首先使用dockerpull命令拉取Zipkin鏡像,然后使用dockerrun命令運行Zipkin容器提供服務。2)餐廳點餐系統(tǒng)應用服務的部署,直接使用dockerrun命令運行docker倉庫中的鏡像即可。注意在運行容器的時候使用“-p”參數設置容器端口映射宿主機端口。本任務知識技能點與等級證書技能的對應關系見表5-11。表5-11任務8知識技能點與等級證書技能對應任務2知識技能點對應證書技能知識點技能點工作領域工作任務職業(yè)技能要求等級Docker基礎操作掌握Docker搜索、拉取、配置網絡端口以及運

溫馨提示

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

評論

0/150

提交評論