Spring Cloud微服務架構升級總結

来源:https://www.cnblogs.com/ourtest/archive/2019/07/02/11122178.html
-Advertisement-
Play Games

↵ 【編者的話】微服務的概念源於 2014 年 3 月 Martin Fowler 所寫的一篇文章“Microservices”。文中內容提到:微服務架構是一種架構模式,它提倡將單一應用程式劃分成一組小的服務,服務之間互相協調、互相配合,為用戶提供最終價值。 背景 應用系統的架構歷史 什麼是微服務? ...


  

【編者的話】微服務的概念源於 2014 年 3 月 Martin Fowler 所寫的一篇文章“Microservices”。文中內容提到:微服務架構是一種架構模式,它提倡將單一應用程式劃分成一組小的服務,服務之間互相協調、互相配合,為用戶提供最終價值。

背景

應用系統的架構歷史

 

 

什麼是微服務?

起源:微服務的概念源於2014年3月Martin Fowler所寫的一篇文章“Microservices”。文中內容提到:微服務架構是一種架構模式,它提倡將單一應用程式劃分成一組小的服務,服務之間互相協調、互相配合,為用戶提供最終價值。

通信方式:每個服務運行在其獨立的進程中,服務與服務間採用輕量級的通信機制互相溝通(通常是基於HTTP的RESTful API)。

微服務的常規定義:微服務是一種架構風格,一個大型複雜軟體應用由一個或多個微服務組成。系統中的各個微服務可被獨立部署,各個微服務之間是松耦合的。每個微服務僅關註於完成一件任務。

把原來的一個完整的進程服務,拆分成兩個或兩個以上的進程服務,且互相之間存在調用關係,與原先單一的進程服務相比,就是“微服務”。(微服務是一個比較級的概念,而不是單一的概念)如果你想和更多微服務技術專家交流,可以加我程式員交流QQ群:790047143,備註『csdn』。群里每周都有全球各大公司的最佳實踐以及行業最新動態。

微服務架構的優勢

  • 可擴展性:在增加業務功能時,單一應用架構需要在原先架構的代碼基礎上做比較大的調整,而微服務架構只需要增加新的微服務節點,並調整與之有關聯的微服務節點即可。在增加業務響應能力時,單一架構需要進行整體擴容,而微服務架構僅需要擴容響應能力不足的微服務節點。

  • 容錯性:在系統發生故障時,單一應用架構需要進行整個系統的修複,涉及到代碼的變更和應用的啟停,而微服務架構僅僅需要針對有問題的服務進行代碼的變更和服務的啟停。其他服務可通過重試、熔斷等機制實現應用層面的容錯。

  • 技術選型靈活:微服務架構下,每個微服務節點可以根據完成需求功能的不同,自由選擇最適合的技術棧,即使對單一的微服務節點進行重構,成本也非常低。

  • 開發運維效率更高:每個微服務節點都是一個單一進程,都專註於單一功能,並通過定義良好的介面清晰表述服務邊界。由於體積小、複雜度低,每個微服務可由一個小規模團隊或者個人完全掌控,易於保持高可維護性和開發效率。

Spring Cloud作為目前最流行的微服務開發框架,不是採用了Spring Cloud框架就實現了微服務架構,具備了微服務架構的優勢。正確的理解是使用Spring Cloud框架開發微服務架構的系統,使系統具備微服務架構的優勢(Spring Cloud就像工具,還需要“做”的過程)。

什麼是Spring Boot?什麼是Spring Cloud?

Spring Boot框架是由Pivotal團隊提供的全新框架,其設計目的是用來簡化基於Spring應用的初始搭建以及開發過程。SpringBoot框架使用了特定的方式來進行應用系統的配置,從而使開發人員不再需要耗費大量精力去定義模板化的配置文件。

Spring Cloud是一個基於Spring Boot實現的雲應用開發工具,它為基於JVM的雲應用開發中的配置管理、服務註冊,服務發現、斷路器、智能路由、微代理、控制匯流排、全局鎖、決策競選、分散式會話和集群狀態管理等操作提供了一種簡單的開發方式。

微服務、Spring Boot、Spring Cloud三者之間的關係

思想:微服務是一種架構的理念,提出了微服務的設計原則,從理論為具體的技術落地提供了指導思想。
腳手架:Spring Boot是一套快速配置腳手架,可以基於Spring Boot快速開發單個微服務。
多個組件的集合:Spring Cloud是一個基於Spring Boot實現的服務治理工具包;Spring Boot專註於快速、方便集成的單個微服務個體;Spring Cloud關註全局的服務治理框架。

技術解析

Everything is jar,Everything is http

Spring Boot通過@SpringBootApplication註解標識為Spring Boot應用程式。所有的應用都通過jar包方式編譯,部署和運行。
@SpringBootApplication 
public class Application {     
private static final Logger LOGGER = LoggerFactory.getLogger(Application.class);     
public static void main(String[] args) {         
    SpringApplication.run(Application.class, args);         
    LOGGER.info(”啟動成功!");     
} 
} 

每個Spring Boot的應用都可以通過內嵌Web容器的方式提供http服務,僅僅需要在pom文件中依賴spring-boot-start-web即可,原則上微服務架構希望每個獨立節點都提供http服務。

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>

Spring boot Task任務啟動和定時任務

在Spring Boot需要啟動任務時,只要繼承CommandLineRunner介面實現其run方法即可。
@SpringBootApplication 
public class ClientDataListener implements CommandLineRunner
public void run(String... strings) throws Exception {     
    clientInfoListenerHandler(); 
}
} 

在Spring Boot需要執行定時任務時,只需要在定時任務方法上增加@Scheduled(cron = “0 15 0 * * ?”)註解(支持標準cron表達式),並且在服務啟動類上增加@EnableScheduling的註解即可。

@SpringBootApplication
@EnableScheduling
public class Application {     
private static final Logger LOGGER = LoggerFactory.getLogger(Application.class);     
public static void main(String[] args) {         
    SpringApplication.run(Application.class, args);         
    LOGGER.info(”啟動成功!");     
} 
} 
// some class
@Scheduled(cron = "0 15 0 * * ?")
public void someTimeTask() {
***
} 

Spring boot Actuator監控

Actuator是Spring Boot提供的對應用系統自身進行監控的組件,在引入spring-boot-start-web基礎上引入spring-boot-starter-actuator即可。

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-actuator</artifactId>
</dependency>

Spring cloud Config配置中心

在我們實現微服務架構時,每個微服務節點都需要自身的相關配置數據項,當節點眾多,維護就變得非常困難,因此需要建立一個中心配置服務。

Spring Cloud Config分為兩部分。Spring Cloud Config server作為一個服務進程,Spring Cloud Config File為配置文件存放位置。

Spring cloud Eureka 服務註冊中心

服務註冊的概念早在微服務架構之前就出現了,微服務架構更是把原先的單一應用節點拆分成非常多的微服務節點。互相之間的調用關係會非常複雜,Spring Cloud Eureka作為註冊中心,所有的微服務都可以將自身註冊到Spring Cloud Eureka進行統一的管理和訪問(Eureka和Zookeeper不同,在AOP原則中選擇了OP,更強調服務的有效性)

Spring Cloud Zuul服務端智能路由

當我們把所有的服務都註冊到Eureka(服務註冊中心)以後,就涉及到如何調用的問題。Spring Cloud Zuul是Spring Cloud提供的服務端代理組件,可以看做是網關,Zuul通過Eureka獲取到可用的服務,通過映射配置,客戶端通過訪問Zuul來訪問實際需要需要訪問的服務。所有的服務通過spring.application.name做標識,不同IP地址,相同spring.application.name就是一個服務集群。當我們增加一個相同spring.application.name的節點,Zuul通過和Eureka通信獲取新增節點的信息實現智能路由,增加該類型服務的響應能力。

Spring cloud Ribbon客戶端智能路由

與Spring Cloud Zuul的服務端代理相對應,Spring Cloud Ribbon提供了客戶端代理。在服務端代理中,客戶端並不需要知道最終是哪個微服務節點為之提供服務,而客戶端代理獲取實質提供服務的節點,並選擇一個進行服務調用。Ribbon和Zuul相似,也是通過和Eureka(服務註冊中心)進行通信來實現客戶端智能路由。

Spring Cloud Sleuth分散式追蹤

 

 

Spring Cloud Zipkin調用鏈

 

 

Spring Cloud Feign http客戶端

Spring Cloud Feign是一種聲明式、模板化的http客戶端。 使用Spring Cloud Feign請求遠程服務時能夠像調用本地方法一樣,讓開發者感覺不到這是遠程方法(Feign集成了Ribbon做負載均衡)。

把遠程服務和本地服務做映射:

@FeignClient(name = "rabbitmq-http", url = "${SKYTRAIN_RABBITMQ_HTTP}") 
public interface TaskService {     
@RequestMapping(value = "/api/queues", method = RequestMethod.GET)     
public String query(@RequestHeader("Authorization") String token); 
} 

以調用本地服務的方式調用遠程服務:

@Autowired 
private TaskService taskService; 
private String queryRabbitmqStringInfo() {     
byte[] credentials = Base64 .encodeBase64((rabbitmqHttpUserName + ":" + rabbitmqHttpPassword).getBytes(StandardCharsets.UTF_8));     
String token = "Basic " + new String(credentials, StandardCharsets.UTF_8);     
return taskService.query(token); 
} 

Spring cloud Hystrix斷路器

 

 

微服務實踐

我們開發的幾個微服務組件:應用管理中心

應用管理中心可以對每個已經註冊的微服務節點進行停止,編譯,打包,部署,啟動的完整的上線操作。

我們開發的幾個微服務組件:ZooKeeper數據查詢中心

ZooKeeper數據查詢中心根據ZooKeeper地址、埠、命令獲取ZooKeeper數據信息。

我們開發的幾個微服務組件:微服務健康檢測中心

健康檢測中心周期性檢查每個微服務的狀態,當發現有微服務狀態處於DOWN或連接超時時,觸發報警。

我們開發的幾個微服務組件:定時任務查詢中心

// 在BeanPostProcessor子類中攔截
@Component
public class SkytrainBeanPostProcessor implements BeanPostProcessor, Ordered {
***
/**
 * Bean 實例化之後進行的處理
 */
public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
    beanPostProcessor.postProcessAfter(bean, beanName);
    return bean;
}
***
}
// 攔截後獲取定時任務註解
***
public Object postProcessAfter(Object bean, String beanName) {
Class targetClass = AopUtils.getTargetClass(bean);
Map annotatedMethods = MethodIntrospector.selectMethods(targetClass,
        new MethodIntrospector.MetadataLookup() {

            public Set inspect(Method method) {

                Set scheduledMethods = AnnotatedElementUtils.getMergedRepeatableAnnotations(method,
                        Scheduled.class, Schedules.class);
                return (!scheduledMethods.isEmpty() ? scheduledMethods : null);
            }
        });
if (!annotatedMethods.isEmpty()) {
    String className = targetClass.getName();
    for (Map.Entry entry : annotatedMethods.entrySet()) {
        Method method = entry.getKey();
        for (Scheduled scheduled : entry.getValue()) {
            String key = className + ":" + method.getName();
            String value = scheduled.toString();
            taskInfos.put(key, value);
        }
    }
}
return null;
}
***

// 獲取定時任務後註冊
***
public void taskRegister() {
String nodeInfo = ipAddress + ":" + serverPort + ":";
try {
    /**
     * 定時任務
     */
    Map infos = taskInfos;
    for (Entry item : infos.entrySet()) {
        String taskId = nodeInfo + item.getKey();
        String taskParameter = item.getValue();
        JSONObject info = new JSONObject();
        info.put("taskId", taskId);
        info.put("taskParameter", taskParameter);
        info.put("applicationName", applicationName);
        info.put("taskType", "schedule");
        LOGGER.info(info.toString());
        zooKeeperExecutor.createZKNode(SKYTRAIN_TASK_ZKNODE_PREFIX + taskId, info.toString());
    }
}
catch (Exception ex) {
    LOGGER.error("", ex);
}
}
***

微服務的分類

  • 微服務平臺組件
  • 公共服務組件
  • 基礎服務組件/業務服務組件

整體微服務架構圖

 

感謝您的觀看,如有不足之處,歡迎批評指正。

獲取資料

本次給大家推薦一個免費的學習群,裡面概括Java架構/分散式/微服務/docker/高性能高併發以及面試資源等。
對Java架構感興趣的程式猿,歡迎加入Q群:790047143,不管你是剛入行得還是大牛我都歡迎,還有大牛整理的一套高效率學習路線和教程與您免費分享,同時每天更新視頻資料。
最後,祝大家早日學有所成。


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 可以用 v-on 指令監聽 DOM 事件,併在觸發時運行一些 JavaScript 代碼,例如: 渲染結果為: 我們給測試按鈕添加了一個mouseenter和click事件,滑鼠移上去式控制台輸出: 當點擊時,輸出為: Vue的事件綁定有很多種寫法,例如: 可以看到v-on對應事件可以很多種格式的, ...
  • DOM(元素節點) 基本選擇器 常規 常規 <div id="box">div_id_1</div> <div id="box">div_id_2</div> <div id="char">div_id_2</div> <div class="cont">div_class_1</div> <div ...
  • 一、打開谷歌控制台:https://console.developers.google.com/apis 二、點擊創建憑據,如下圖,填寫項目地址等 三、創建好客戶端ID和秘鑰後,填寫對應的項目網址和登錄頁網址 四、修改OAuth同意屏幕網站首頁地址和隱私政策網址 五、代碼部分如下: ...
  • 一、兄弟元素的外邊距合併 效果圖如下:(二者之間的間距為100px,不是150px) 二、嵌套元素的外邊距合併 對於兩個嵌套關係的元素,如果父元素中沒有內容或者內容在子元素的後面並且沒有上內邊距及邊框,則父元素的上邊距會與子元素的上外邊距發生合併,且值為最大的那個上外邊距,同時該值作為父元素的上外邊 ...
  • NPM幾個常用命令和參數的意思: 安裝模塊如不指定版本號 預設會安裝最新的版本 安裝指定版本的模塊 這個命令會在當前目錄生成一個package.json文件,這個文件中會記錄一些關於項目的信息,比如:項目的作者,git地址,入口文件、命令設置、項目名稱和版本號等等,一般情況下這個文件是必須要有的,方 ...
  • // 購物車數量減少$('.reduce').click(function () { addMinus(this,0)});// 購物車數量增加$('.increase').click(function () { addMinus(this,1)});function addMinus(t,stat ...
  • 一、新建dist 文件夾; 二、新建src文件夾: 在其下麵創建 css 、js 、images文件夾及 index.html、main.js(這是項目Js的主入口) 三、html中簡單創建一個列表; main.js中設置單雙行變色; 四、由於ES6太高級,瀏覽器解析不了,需要轉換為低級的能識別的版 ...
  • 跟我學SpringCloud | 第三篇:服務的提供與Feign調用 上一篇,我們介紹了註冊中心的搭建,包括集群環境嚇註冊中心的搭建,這篇文章介紹一下如何使用註冊中心,創建一個服務的提供者,使用一個簡單的客戶端去調用服務端提供的服務。 本篇文章中需要三個角色,分別是服務的提供者,服務的消費者,還有一 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...