Java生鮮電商平臺-微服務入門與服務的拆分架構實戰

Java生鮮電商平臺-微服務入門與服務的拆分架構實戰

剛開始進入軟件行業時還是單體應用的時代,前后端分離的概念都還沒普及,開發的時候需要花大量的時間在“強大”的JSP上面,那時候SOA已經算是新技術了。現在,微服務已經大行其道,有哪個互聯網產品不說自己是微服務架構呢?

但是,對于微服務的理解每個人都不太一樣,這篇文章主要是聊一聊我對微服務的理解以及如何搭建經典的微服務架構,目的是梳理一下自己的一些想法,如果存在不同看法的歡迎指正!

什么是微服務

首先,什么是微服務呢?

單體應用

相對的,要理解什么是微服務,那么可以先理解什么是單體應用,在沒有提出微服務的概念的“遠古”年代,一個軟件應用,往往會將應用所有功能都開發和打包在一起,那時候的一個B/S應用架構往往是這樣的:


B/S

但是,當用戶訪問量變大導致一臺服務器無法支撐時怎么辦呢?加服務器加負載均衡,架構就變成這樣了:


B/S+負載均衡

后面發現把靜態文件獨立出來,通過CDN等手段進行加速,可以提升應用的整體相應,單體應用的架構就變成:


B/S+前后端分離

上面3中架構都還是單體應用,只是在部署方面進行了優化,所以避免不了單體應用的根本的缺點:

  • 代碼臃腫,應用啟動時間長;(代碼超過1G的項目都有!)
  • 回歸測試周期長,修復一個小小bug可能都需要對所有關鍵業務進行回歸測試。
  • 應用容錯性差,某個小小功能的程序錯誤可能導致整個系統宕機;
  • 伸縮困難,單體應用擴展性能時只能整個應用進行擴展,造成計算資源浪費。
  • 開發協作困難,一個大型應用系統,可能幾十個甚至上百個開發人員,大家都在維護一套代碼的話,代碼merge復雜度急劇增加。

微服務

我認為任何技術的演進都是有跡可循的,任何新技術的出現都是為了解決原有技術無法解決的需求,所以,微服務的出現就是因為原來單體應用架構已經無法滿足當前互聯網產品的技術需求。

在微服務架構之前還有一個概念:SOA(Service-Oriented Architecture)-面向服務的體系架構。我認為的SOA只是一個架構模型的方法論,并不是一個明確而嚴謹的架構標準,只是后面很多人將SOA與The Open Group的SOA參考模型等同了,認為嚴格按照TOG-SOA標準的才算真正的SOA架構。SOA就已經提出的面向服務的架構思想,所以微服務應該算是SOA的一種演進吧。

撇開架構先不說,什么樣的服務才算微服務呢?

  • 單一職責的。一個微服務應該都是單一職責的,這才是“微”的體現,一個微服務解決一個業務問題(注意是一個業務問題而不是一個接口)。
  • 面向服務的。將自己的業務能力封裝并對外提供服務,這是繼承SOA的核心思想,一個微服務本身也可能使用到其它微服務的能力。
    我覺得滿足以上兩點就可以認為典型的微服務。

微服務典型架構

微服務架構,核心是為了解決應用微服務化之后的服務治理問題。

應用微服務化之后,首先遇到的第一個問題就是服務發現問題,一個微服務如何發現其他微服務呢?最簡單的方式就是每個微服務里面配置其他微服務的地址,但是當微服務數量眾多的時候,這樣做明顯不現實。所以需要使用到微服務架構中的一個最重要的組件:服務注冊中心,所有服務都注冊到服務注冊中心,同時也可以從服務注冊中心獲取當前可用的服務清單:

服務注冊中心

?

解決服務發現問題后,接著需要解決微服務分布式部署帶來的第二個問題:服務配置管理的問題。當服務數量超過一定程度之后,如果需要在每個服務里面分別維護每一個服務的配置文件,運維人員估計要哭了。那么,就需要用到微服務架構里面第二個重要的組件:配置中心,微服務架構就變成下面這樣了:

配置中心

以上應用內部的服務治理,當客戶端或外部應用調用服務的時候怎么處理呢?服務A可能有多個節點,服務A、服務B和服務C的服務地址都不同,服務授權驗證在哪里做?這時,就需要使用到服務網關提供統一的服務入口,最終形成典型微服務架構:


典型微服務架構

上面是一個典型的微服務架構,當然微服務的服務治理還涉及很多內容,比如:

  • 通過熔斷、限流等機制保證高可用;
  • 微服務之間調用的負載均衡;
  • 分布式事務(2PC、3PC、TCC、LCN等);
  • 服務調用鏈跟蹤等等。

微服務框架

目前國內企業使用的微服務框架主要是Spring Cloud和Dubbo(或者DubboX),但是Dubbo那兩年的停更嚴重打擊了開發人員對它的信心,Spring Cloud已經逐漸成為主流,比較兩個框架的優劣勢的文章在網上有很多,這里就不重復了,選擇什么框架還是按業務需求來吧,業務框架決定技術框架。
Spring Cloud全家桶提供了各種各樣的組件,基本可以覆蓋微服務的服務治理的方方面面,以下列出了Spring Cloud一些常用組件:


Spring Cloud常用組件

搭建典型微服務架構

本章節主要介紹如何基于Spring Cloud相關組件搭建一個典型的微服務架構。
首先,創建一個Maven父項目spring-cloud-examples,用于管理項目依賴包版本。由于Spring Cloud組件很多,為保證不同組件之間的兼容性,一般通過spring-cloud-dependencies統一管理Spring Cloud組件版本,而非每個組件單獨引入。

pom.xml配置如下:

    <!-- 繼承SpringBoot父項目,注意與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> 

搭建服務配置中心

  • spring-cloud-examples項目下創建一個子項目spring-cloud-example-config,添加Spring Cloud Config Server端的相關依賴包:
<dependencies><dependency><groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-config-server</artifactId> </dependency> </dependencies> 
  • 添加Spring Boot配置文件application.yml,配置如下:
spring:application:name: spring-cloud-example-configprofiles:active: native #啟用本地配置文件cloud:config:server:native:search-locations: classpath:/configs/ #配置文件掃描目錄server:port: 8000 #服務端口
  • 啟動類添加注解@EnableConfigServer通過啟用Config Server服務。
@SpringBootApplication
@EnableConfigServer
public class Application { public static void main(String[] args) { SpringApplication.run(Application.class, args); } } 

搭建服務注冊中心

  • spring-cloud-examples項目下創建一個子項目spring-cloud-example-registry,在pom.xml中添加Eureka Server相關依賴包:
    <dependencies><dependency><groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-netflix-eureka-server</artifactId> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-config</artifactId> </dependency> </dependencies> 
  • spring-cloud-example-config配置中心項目的src/main/resource/configs目錄下添加一個服務配置文件spring-cloud-example-registry.yml,配置如下:
spring:application:name: spring-cloud-example-registry# Eureka相關配置
eureka:client:register-with-eureka: false #不注冊服務fetch-registry: false #不拉去服務清單 serviceUrl: defaultZone: http://localhost:${server.port}/eureka/ #多個通過英文逗號分隔 server: port: 8001 
  • spring-cloud-example-registry項目的src/main/resource/目錄添加bootstrap.yml配置文件,配置如下:
spring:cloud:config:name: spring-cloud-example-registry #配置文件名稱,多個通過逗號分隔uri: http://localhost:8000 #Config Server服務地址
  • 啟動類添加注解@EnableEurekaServer通過啟用Eureka Server服務。
@SpringBootApplication
@EnableEurekaServer
public class Application { public static void main(String[] args) { SpringApplication.run(Application.class, args); } } 

搭建業務服務A

  • spring-cloud-examples項目下創建一個業務服務A的子項目spring-cloud-example-biz-a,在pom.xml中添加以下依賴包:
    <dependencies><!-- Spring Boot Web Starter --><dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <!-- feign --> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-openfeign</artifactId> </dependency> <!-- Eureka Client Starter --> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId> </dependency> <!-- Config Client Starter --> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-config</artifactId> </dependency> </dependencies> 
  • spring-cloud-example-config配置中心項目的src/main/resource/configs目錄下添加一個服務配置文件spring-cloud-example-biz-a.yml,配置如下:
spring:application:name: spring-cloud-example-biz-aserver:port: 8010# Eureka相關配置
eureka:client:serviceUrl:defaultZone: http://localhost:8001/eureka/instance:lease-renewal-interval-in-seconds: 10 # 心跳時間,即服務續約間隔時間(缺省為30s) lease-expiration-duration-in-seconds: 60 # 發呆時間,即服務續約到期時間(缺省為90s) prefer-ip-address: true instance-id: ${spring.application.name}:${spring.application.instance_id:${server.port}} 
  • spring-cloud-example-biz-a項目的src/main/resource/目錄添加bootstrap.yml配置文件,配置如下:
spring:cloud:config:name: spring-cloud-example-biz-a #配置文件名稱,多個通過逗號分隔uri: http://localhost:8000 #Config Server服務地址
  • 添加一個示例接口,代碼參考:
@RestController
@RequestMapping("/hello")
public class HelloController { /** * 示例方法 * * @return */ @GetMapping public String sayHello() { return "Hello,This is Biz-A Service."; } } 

搭建業務服務B

參考上面業務服務A搭建另外一個業務服務B。

搭建服務網關

  • spring-cloud-examples項目下創建一個業務服務A的子項目spring-cloud-example-gateway,在pom.xml中添加以下依賴包:
    <dependencies><!-- zuul --><dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-zuul</artifactId> </dependency> <!-- Eureka Client Starter --> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId> </dependency> <!-- Config Client Starter --> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-config</artifactId> </dependency> </dependencies> 
  • spring-cloud-example-config配置中心項目的src/main/resource/configs目錄下添加一個服務配置文件spring-cloud-example-gateway.yml,配置如下:
spring:application:name: spring-cloud-example-gatewayserver:port: 8002# Eureka相關配置
eureka:client:serviceUrl:defaultZone: http://localhost:8001/eureka/instance:lease-renewal-interval-in-seconds: 10 # 心跳時間,即服務續約間隔時間(缺省為30s) lease-expiration-duration-in-seconds: 60 # 發呆時間,即服務續約到期時間(缺省為90s) prefer-ip-address: true instance-id: ${spring.application.name}:${spring.application.instance_id:${server.port}} 
  • spring-cloud-example-gateway項目的src/main/resource/目錄添加bootstrap.yml配置文件,配置如下:
spring:cloud:config:name: spring-cloud-example-gateway #配置文件名稱,多個通過逗號分隔uri: http://localhost:8000 #Config Server服務地址
  • 啟動類添加注解@EnableZuulProxy通過啟用網關代理服務。
@SpringBootApplication
@EnableZuulProxy
public class Application { public static void main(String[] args) { SpringApplication.run(Application.class, args); } } 

啟動示例

  • 啟動順序
    spring-cloud-example-config>>spring-cloud-example-eureka>>spring-cloud-example-biz-a/spring-cloud-example-biz-b/spring-cloud-example-gateway

  • 通過網關訪問服務A接口


    服務A調用
  • 通過網關訪問服務B接口


    服務B調用

服務之間調用

  • 在業務服務A中添加一個Feign Client Bean,參考代碼如下:
@FeignClient(name = "spring-cloud-example-biz-b") # 指定服務名稱
public interface RemoteService { /** * 調用服務B的hello方法 * * @return */ @GetMapping("/hello") #指定請求地址 String sayHello(); } 
  • 業務服務A示例接口類增加call2b接口,代碼如下:
@RestController
@RequestMapping("/hello")
public class HelloController { @Autowired private RemoteService remoteService; /** * 示例方法 * * @return */ @GetMapping public String sayHello() { return "Hello,This is Biz-A Service."; } /** * 示例方法:調用服務B * * @return */ @GetMapping(path = "/call2b") public String sayHello2B() { return remoteService.sayHello(); } } 
  • 重啟業務服務A,通過調用/hello/call2b接口:
    服務之間調用

下一代微服務

目前網上很多說是下一代微服務架構就是Service Mesh,Service Mesh主流框架有Linkerd和Istio,其中Istio有大廠加持所以呼聲更高。Service Mesh我接觸還不多,但是個人感覺并不一定能稱為下一代微服務架構,可能認為是服務治理的另外一種解決方案更合適,是否能夠取代當前的微服務架構還需要持續觀察。

轉載于:https://www.cnblogs.com/jurendage/p/11331366.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/247174.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/247174.shtml
英文地址,請注明出處:http://en.pswp.cn/news/247174.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

詳解MTK系統中字符轉換問題

詳解MTK系統中字符轉換問題 2011-09-05 19:02 佚名 互聯網 字號&#xff1a;T | TMTK系統中字符轉換問題是本文要介紹的內容&#xff0c;主要是來了解并學習MTK中一些小案例的應用&#xff0c;具體內容來看本文詳解。 AD&#xff1a;2014WOT全球軟件技術峰會北京站 課程視頻發布…

Java生鮮電商平臺-微服務架構概述

Java生鮮電商平臺-微服務架構概述 單體架構存在的問題 在傳統的軟件技術架構系統中&#xff0c;基本上將業務功能集中在單一應用內&#xff0c;或者是單一進程中。盡管現代化的軟件架構理論以及設計原則已推廣多年&#xff0c;但實際技術衍化的速度遲緩并且變革動力不足。 其中…

Jensen不等式及其證明

? 詹森不等式以丹麥數學家約翰詹森&#xff08;JohanJensen&#xff09;命名。它給出積分的凸函數值和凸函數的積分值間的關系。 關于凸函數&#xff1a; if &#xff08;-f&#xff09;是凸函數&#xff08;convex&#xff09;&#xff0c;則f是凹的&#xff08;concave…

ios自帶NSURLConnection下載文件

//同步下載,同步請求的主要代碼如下 - (IBAction)downLoad:(id)sender { NSString *urlAsString"http://7jpnsh.com1.z0.glb.clouddn.com/TravelDemo.plist";//文件地址 NSURL *url[NSURL URLWithString:urlAsString]; NSURLRequest *request[NSURLRequest requestWi…

國外程序員整理的機器學習資源大全

本列表選編了一些機器學習領域牛B的框架、庫以及軟件&#xff08;按編程語言排序&#xff09;。 C 計算機視覺 CCV —基于C語言/提供緩存/核心的機器視覺庫&#xff0c;新穎的機器視覺庫 OpenCV—它提供C, C, Python, Java 以及 MATLAB接口&#xff0c;并支持Windo…

五款幫助創業者迅速熟悉互聯網創業的在線學習工具

相信很多有志青年都想借助互聯網開拓自己的事業&#xff0c;可是經常面臨一個很現實的問題——缺乏一定的專業知識和技能。沒關系&#xff0c;互聯網中的豐富教育資源就可以讓你迅速地跨越這一障礙&#xff0c;熟悉與創業相關的運營、管理、融資等操作技巧。下面介紹的五個在線…

C++ 中復雜的聲明

1、方法也是有類型的&#xff0c;方法的類型由返回類型和形參表決定。比如int F (int)的類型就是去掉方法名&#xff0c;int (int)。 2、對于方法類型&#xff0c;在返回類型和形參表之間&#xff0c;加上一個名稱F&#xff0c;就表示一個特定的方法F。 3、思考&#xff0c;如果…

caffe 下測試 MNIST數據

詳細說明可參考網頁&#xff1a;http://blog.csdn.net/wangchuansnnu/article/details/44341753http://blog.sina.com.cn/s/blog_49ea41a20102w4uu.htmlhttp://www.cnblogs.com/yymn/p/4553671.html caffe 下 mnist 進行實驗&#xff1a; MNIST&#xff0c;一個經典的手寫數字庫…

Java生鮮電商平臺-秒殺系統微服務架構設計與源碼解析實戰

Java生鮮電商平臺-秒殺系統微服務架構設計與源碼解析實戰 Java生鮮電商平臺- 什么是秒殺 通俗一點講就是網絡商家為促銷等目的組織的網上限時搶購活動 比如說京東秒殺&#xff0c;就是一種定時定量秒殺&#xff0c;在規定的時間內&#xff0c;無論商品是否秒殺完畢&#xff0c…

LInux 下安裝 python notebook 及指向路徑,運行計時,炫酷的深藍午夜主題,本地登陸遠程服務器

1. 安裝 pip工具 sudo apt-get install pyton-pip 2. 安裝ipython及其依賴包 sudo apt-get install ipython ipython-notebook 3. 安裝可選的附加工具(需要時間較長) sudo apt-get install python-matplotlib python-scipy python-pandas python-sympy python-nose 4. 測試i…

對TypeScript進行研究

1.npm install -g typescript 在編輯器&#xff0c;將下面的代碼輸入到greeter.ts文件里&#xff1a; function greeter(person) {return "Hello, " person; } let user "Jane User"; document.body.innerHTML greeter(user); 我們使用了.ts擴展名&…

caffe 提取特征并可視化(已測試可執行)及在線可視化

網絡結構在線可視化工具 http://ethereon.github.io/netscope/#/editor 參考主頁&#xff1a; caffe 可視化的資料可在百度云盤下載 鏈接: http://pan.baidu.com/s/1jIRJ6mU 提取密碼&#xff1a;xehi http://cs.stanford.edu/people/karpathy/cnnembed/ http://lijianch…

ncnn:提取所有層特征值

官方代碼托管地址&#xff1a;https://github.com/Tencent/ncnn 在Extractor類中添加以下方法&#xff1a; int Extractor::extract_all_blobs() {for (int blob_index 0; blob_index < blob_mats.size(); blob_index){Mat outMat;extract(blob_index, outMat);// write to…

Caffe + Ubuntu 15.04/16.04 + CUDA 7.5/8.0 在服務器上安裝配置及卸載重新安裝(已測試可執行)

本文參考如下: caffe 安裝所需的所有資源可在百度網盤下載 鏈接: http://pan.baidu.com/s/1jIRJ6mU 提取密碼&#xff1a;xehi 在服務器上為每個子用戶拷貝caffe 使用 Linux探索之旅 | 第一部分第四課&#xff1a;磁盤分區完成Ubuntu安裝 Ubuntu16.04 1080Ti深度學習環境配…

ASP.NET MVC Action向視圖傳值之匿名類型

在使用ASP.NET MVC過程中想必大家都有遇到過一個問題就是我們的Action如何向視圖傳遞匿名類型的值呢&#xff0c;如果不做特殊處理則無法實現。 接下來我們來看一個示例&#xff1a; 在我們的控制中&#xff1a; using System.Collections.Generic; using System.Web.Mvc;names…

2015倫敦深度學習峰會筆記(轉載)

摘要&#xff1a;在倫敦舉行的第三屆深度學習峰會由RE.WORK主辦&#xff0c;匯集了從工業領域到學術領域不同背景的專業人士&#xff0c;本文是該峰會第一天的筆記。包括Koray Kavukcuoglu、Sander Dieleman等知名深度學習專家分享了自己的經驗。上周&#xff0c;我有機會參加在…

[webrtc] rtcp模塊中rtt時間計算

RTT指 round-trip time&#xff0c;即計算AB兩端的往返時延 這里可以分成兩個問題&#xff1a; 如何在A端估算A和B之間的RTT時間? 如何在B端估算A和B之間的RTT時間? 本文參考資料:rfc 3550rfc 3611webrtc issue https://code.google.com/p/webrtc/issues/detail?id1613以及解…

Deep learning Reading List

本文轉自&#xff1a; http://jmozah.github.io/links/ http://www.datakit.cn/blog/2014/12/31/Deep_learning_Reading_List.html 文章來自J Mohamed Zahoor的深度學習閱讀書單。 Following is a growing list of some of the materials i found on the web for Deep Learning…

商戶網站使用第三方支付的大致原理和實現

如果把商戶網站使用第三方支付平臺(比如支付寶)的原理搞清楚&#xff0c;那編程就變得簡單多了。 整個過程大致這樣&#xff1a; 1、商戶與支付寶簽約。2、在商戶網站購買商品&#xff0c;填寫數量&#xff0c;確定購買后跳轉到結賬頁面。結賬頁面可能包括訂單號、定單狀態(已支…

Awesome Deep Vision

本文轉自&#xff1a;https://github.com/kjw0612/awesome-deep-vision http://jiwonkim.org/awesome-deep-vision/ A curated list of deep learning resources for computer vision, inspired by awesome-php and awesome-computer-vision. Maintainers - Jiwon Kim, Heesoo …