基於 SpringCloud 微服務架構的廣告系統(第一部分:eureka、zuul、通用模組)
- 2019 年 11 月 12 日
- 筆記
版權聲明:本文為部落客原創文章,遵循 CC 4.0 BY-SA 版權協議,轉載請附上原文出處鏈接和本聲明。
本文鏈接:https://blog.csdn.net/weixin_43126117/article/details/102911115
目錄
廣告系統架構圖
一、eureka服務
二、zuul網關
zuul啟動與自定義過濾器(實現訪問記錄)示意圖
三、通用模組(統一響應與統一異常)
統一響應(對象)示意圖
統一響應示意圖
統一異常(對象)示意圖
通用索引表
這不是一個完整的廣告系統,主要涉及兩方面 廣告檢索 、廣告投放 ,這兩個方面我感覺是最重要的,但是也使用Kafka的消息傳遞,為剩下的曝光見監測、 報表 、扣費 這三個部分留下了介面。
這一章,是為廣告檢索 、廣告投放提前做的準備,主要實現eureka 服務註冊與發現模組、統一響應模組 、zuul網關模組、系統監控模組。(不講程式碼實現,下載程式碼自己看。)
spring cloud 架構圖

spring cloud 架構實現計劃—總體技術分層

當前項目所用到技術棧
JDK 、Kafka 、MySQL
框架 SpringCloud: Finchley.RELEASE 、Spring 、Spring Data JPA 、Spring boot
源碼 : github https://github.com/yingyingqiqi/luoweiying-ad-spring-cloud/tree/master
一、eureka服務

一個單節點的eureka服務,為整個微服務提供服務註冊與發現,盡量不要用單節點的,穩定性不夠高,要是這個節點崩了,整個微服務就用不了,建議使用多節點。
maven坐標
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId> </dependency>
配置文件
spring: application: name: ad-eureka server: port: 8000 eureka: instance: hostname: localhost client: # 是否獲取註冊資訊,單節點 是否向eureka註冊 fetch-registry: false register-with-eureka: false service-url: defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/
啟動類
@EnableEurekaServer //啟動eureka服務 @SpringBootApplication //springboot引導 public class EurekaApplication { public static void main(String[] args) { SpringApplication.run(EurekaApplication.class, args); } }
二、zuul網關

網關介紹:微服務系統中往往包含很多個功能不同的子系統或微服務,外部應用怎樣去訪問各種各樣的微服務呢?這也是zuul所需要解決的主要問題。在微服務架構中, 後端服務往往不直接開放給調用端, 而是通過一個服務網關 根據請求的 url, 路由到相應的服務, 即實現請求轉發。
微服務的網關功能,與我們所使用的路由器、硬體網關…等是有類是功能的,做路由轉發、均衡負載、反向代理、動態路由等等。
在此項目中,我們使用路由轉發 和 ZuulFilter自定義過濾器(實現訪問記錄)。
補充:Zuul是奈菲提供的,ZuulFilter這個類沒有使用servlet.Filter。
maven坐標
<!-- Eureka 客戶端, 客戶端向 Eureka Server 註冊的時候會提供一系列的元數據資訊, 例如: 主機, 埠, 健康檢查url等 Eureka Server 接受每個客戶端發送的心跳資訊, 如果在某個配置的超時時間內未接收到心跳資訊, 實例會被從註冊列表中移除 --> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId> </dependency> <!-- 服務網關 --> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-zuul</artifactId> </dependency>
配置文件
spring: application: name: ad-gateway server: port: 9000 #向eureka註冊 eureka: client: service-url: defaultZone: http://localhost:8000/eureka/ #網關配置 zuul: prefix: /ad routes: ad-sponsor: path: /ad-sponsor/** serviceId: eureka-client-ad-sponsor strip-prifix: true # 轉發的時候保留前綴 如 ip:8000/ad/ad-sponsor/craete/adPlan 轉發:/ad-sponsro/create/adPlan ad-search: path: /ad-search/** serviceId: eureka-client-ad-search strip-prifix: true
zuul啟動與自定義過濾器(實現訪問記錄)示意圖

自定義過濾器(實現訪問記錄),繼承ZuulFilter類:
- 1.實現過濾器 路由前後順序、
- 2.此過濾器選擇路由後的執行順序 、
- 3.此過濾器是否執行、
- 4.要執行的方法 這裡用到(RequestContext.getCurrentContext),保存訪問開始資訊。
三、通用模組(統一響應與統一異常)
為什麼要做這個模組,響應與異常處理,每個微服務大都需要的,要是每個服務都使用一份獨特的,這樣特別不利於維護。
- 通用的程式碼,配置不應該散落在各個微服務模組,不利於維護。
- 統一的響應,一個大的系統,響應對象需要一層統一的封裝。
- 統一的異常處理,不直接展示錯誤,對用戶友好 ; 異常分類,便於排查問題,debug ; 降低業務程式碼中對異常處理的耦合。
統一響應(對象)示意圖

統一響應示意圖

統一異常(對象)示意圖

統一的響應與統一異常處理總結:
- 1.用了Spring MVC ControllerAdvice的攔截器 ResponseBodyAdvice介面、 @ExceptionHandler註解。
- 2.實現Webconfigurer介面的configureMessageconverters方法,清空所有轉換器,只添加MappingJackson2HttpMessageConverter轉換器
- 3.詳細的介紹 點擊 Spring MVC ControllerAdvice深入解析
通用索引表

這些索引表,是為了各個服務調用時,作為傳遞對象使用,使用頻率很高,所有也放在通用模組。
上面三個部分是這個廣告投放項目的準備工作,後面的部分比較難,我通過兩章來進一部介紹。