Spring Cloud 背后技術詳解

Spring Cloud 是基于 Spring Boot 的一套微服務架構解決方案。它為開發者提供了一系列的工具,用于快速構建分布式系統中的一些常見模式(例如配置管理、服務發現、斷路器等)。Spring Cloud 利用 Spring Boot 的自動配置和獨立運行能力,使得構建微服務變得異常簡單。在本博客中,我們將深入探討 Spring Cloud 背后的關鍵技術,并通過實際代碼示例來講解其工作原理。

第一部分:Spring Cloud 微服務架構基礎

1.1 微服務概述

微服務架構是一種設計方法,其中應用程序由一系列小型、獨立的服務組成,這些服務共同組成一個整體的應用。每個服務都是圍繞特定業務能力構建的,并且可以獨立部署和擴展。微服務架構有助于加快開發周期,提高系統的可擴展性和可維護性。

1.2 Spring Cloud 的核心組件

Spring Cloud 提供了多個組件,以支持微服務架構的開發。這些組件包括:

  • Spring Cloud Config:用于集中管理應用程序配置的服務。
  • Spring Cloud Netflix Eureka:一個服務發現和注冊服務器。
  • Spring Cloud Netflix Hystrix:一個斷路器,用于處理服務調用時的延遲和容錯。
  • Spring Cloud Netflix Zuul:一個路由服務器,用于為微服務架構中的服務提供統一的訪問入口。
  • Spring Cloud Stream:一個用于構建消息驅動微服務的框架。
  • Spring Cloud Sleuth:用于在分布式系統中追蹤服務調用鏈路的工具。

1.3 創建第一個 Spring Cloud 應用

下面,我們將通過一個簡單的示例來展示如何創建一個 Spring Cloud 應用。

1.3.1 創建 Spring Boot 應用

首先,我們需要創建一個 Spring Boot 應用。這可以通過 Spring Initializr(https://start.spring.io/)來完成。選擇?Maven 或 Gradle 作為構建工具,并添加 Spring Web 依賴。

1.3.2 添加 Spring Cloud 依賴

在創建好的 Spring Boot 應用中,我們需要添加 Spring Cloud 的依賴。例如,如果我們想要使用 Spring Cloud Config,我們可以在?pom.xml?文件中添加如下依賴:

<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-config</artifactId>
</dependency>

1.3.3 配置 Spring Cloud 組件

接下來,我們需要在應用的配置文件中配置 Spring Cloud 組件。例如,如果我們使用 Spring Cloud Config,我們可以在?application.yml?文件中指定配置服務的地址:

spring:cloud:config:uri: http://localhost:8888

1.3.4 編寫業務代碼

最后,我們可以編寫業務代碼,利用 Spring Cloud 提供的組件來實現微服務架構中的功能。例如,我們可以創建一個 REST 控制器,用于獲取配置信息:

@RestController
@RequestMapping("/config")
public class ConfigController {@Value("${config.example.property}")private String property;@GetMappingpublic String getProperty() {return property;}
}

在這個例子中,@Value("${config.example.property}")?注解用于從配置服務器獲取屬性值。

1.4 運行和測試 Spring Cloud 應用

完成上述步驟后,我們可以運行 Spring Boot 應用,并測試 Spring Cloud 組件的功能。例如,我們可以啟動 Spring Cloud Config 服務器,然后運行我們的應用,并通過 REST 接口獲取配置信息。

在后續部分,我們將深入探討 Spring Cloud 的各個核心組件,并詳細講解它們的工作原理和最佳實踐。通過這些內容的學習,你將能夠更好地理解和使用 Spring Cloud 來構建分布式系統和微服務架構。

第二部分:Spring Cloud Config

Spring Cloud Config 是 Spring Cloud 的配置管理組件,它提供了服務器和客戶端支持,用于集中管理應用程序的配置。這使得在不同環境中部署的應用程序可以使用相同的配置源,并且可以輕松地更新配置而無需重新部署應用程序。

2.1 Spring Cloud Config 服務器

Spring Cloud Config 服務器是一個可以存儲后端存儲庫(如 Git、SVN)中配置文件的服務器。它支持配置文件的動態刷新,并且可以將配置屬性加密和解密。

2.1.1 創建 Config 服務器

要創建一個 Config 服務器,首先需要在項目中添加?spring-cloud-config-server?依賴。

<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-config-server</artifactId>
</dependency>

然后,在主應用程序類上添加?@EnableConfigServer?注解。

@SpringBootApplication
@EnableConfigServer
public class ConfigServerApplication {public static void main(String[] args) {SpringApplication.run(ConfigServerApplication.class, args);}
}

在?application.yml?或?application.properties?文件中,配置服務器的存儲庫信息。

spring:cloud:config:server:git:uri: https://github.com/yourusername/config-repo.git

2.1.2 訪問配置屬性

Config 服務器提供了多個端點,用于訪問配置屬性。例如,要獲取?development?環境的?application?配置,可以使用以下 URL:

http://localhost:8888/application/development

2.2 Spring Cloud Config 客戶端

Spring Cloud Config 客戶端是用于從 Config 服務器獲取配置的應用程序。要創建一個 Config 客戶端,首先需要在項目中添加?spring-cloud-starter-config?依賴。

<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-config</artifactId>
</dependency>

在?bootstrap.yml?或?bootstrap.properties?文件中,配置客戶端以指向 Config 服務器的位置。

spring:cloud:config:uri: http://localhost:8888profile: developmentname: application

客戶端應用程序可以使用?@Value?或?@ConfigurationProperties?注解來注入配置屬性。

2.3 配置刷新

Spring Cloud Config 支持配置的動態刷新。要啟用這個功能,需要在客戶端應用程序中添加?spring-cloud-starter-bus-amqp?依賴,以連接到消息代理(如 RabbitMQ)。

<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-bus-amqp</artifactId>
</dependency>

然后,可以通過發送 POST 請求到?/actuator/refresh?端點來觸發配置的刷新。

curl -X POST http://localhost:8080/actuator/refresh

第三部分:Spring Cloud Netflix Eureka

Spring Cloud Netflix Eureka 是一個服務發現和注冊服務器。它提供了一個中心化的服務注冊表,服務實例可以在啟動時注冊到 Eureka,并且可以通過 Eureka 來發現其他服務實例。

3.1 Eureka 服務器

Eureka 服務器是服務發現和注冊的中心節點。要創建一個 Eureka 服務器,首先需要在項目中添加?spring-cloud-starter-netflix-eureka-server?依賴。

<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>

然后,在主應用程序類上添加?@EnableEurekaServer?注解。

@SpringBootApplication
@EnableEurekaServer
public class EurekaServerApplication {public static void main(String[] args) {SpringApplication.run(EurekaServerApplication.class, args);}
}

在?application.yml?或?application.properties?文件中,配置 Eureka 服務器的相關屬性。

eureka:client:registerWithEureka: falsefetchRegistry: falseserviceUrl:defaultZone: http://localhost:8761/eureka/

3.2 Eureka 客戶端

Eureka 客戶端是用于注冊服務實例的應用程序。要創建一個 Eureka 客戶端,首先需要在項目中添加?spring-cloud-starter-netflix-eureka-client?依賴。

<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>

在?application.yml?或?application.properties?文件中,配置客戶端以連接到 Eureka 服務器。

eureka:client:serviceUrl:defaultZone: http://localhost:8761/eureka/

在應用程序啟動時,Eureka 客戶端會自動將服務實例注冊到 Eureka 服務器。其他服務可以通過 Eureka 服務器來發現這個服務實例。

3.3 服務發現

在 Eureka 環境中,服務可以通過 Eureka 客戶端來發現其他服務。Spring Cloud 提供了?DiscoveryClient?接口,用于從 Eureka 獲取注冊的服務實例信息。

@Autowired
private DiscoveryClient discoveryClient;public List<ServiceInstance> getServiceInstances(String serviceName) {return discoveryClient.getInstances(serviceName);
}

此外,Spring Cloud 還提供了?@LoadBalanced?注解,用于創建一個負載均衡的?RestTemplate?實例,這樣就可以通過服務 ID 來調用服務,而無需知道服務的具體地址。

@Bean
@LoadBalanced
public RestTemplate restTemplate() {return new RestTemplate();
}

使用?RestTemplate?調用服務:

restTemplate.getForObject("http://SERVICE-NAME/path", String.class);

第四部分:Spring Cloud Netflix Hystrix

Spring Cloud Netflix Hystrix 是一個斷路器,用于處理服務調用時的延遲和容錯。它通過線程隔離、超時檢測和斷路器模式來防止級聯故障,提高系統的整體穩定性。

4.1 Hystrix 斷路器

要使用 Hystrix 斷路器,首先需要在項目中添加?spring-cloud-starter-netflix-hystrix?依賴。

<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
</dependency>

然后,在主應用程序類上添加?@EnableCircuitBreaker?或?@EnableHystrix?注解。

@SpringBootApplication
@EnableCircuitBreaker
public class HystrixApplication {public static void main(String[] args) {SpringApplication.run(HystrixApplication.class, args);}
}

4.2 Hystrix 命令

Hystrix 命令是用于封裝對依賴服務的調用的對象。通過定義 Hystrix 命令,可以實現對服務調用的線程隔離、超時檢測和斷路器邏輯。

@HystrixCommand(fallbackMethod = "getDefaultValue")
public String getValueFromService() {// 服務調用邏輯
}public String getDefaultValue() {// 服務降級邏輯return "default";
}

在上述代碼中,@HystrixCommand?注解用于指定服務調用方法和服務降級方法。當服務調用失敗時,Hystrix 會自動調用服務降級方法。

4.3 Hystrix Dashboard

Hystrix Dashboard 是一個實時監控 Hystrix 斷路器狀態的工具。要使用 Hystrix Dashboard,首先需要在項目中添加?spring-cloud-starter-netflix-hystrix-dashboard?依賴。

<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-netflix-hystrix-dashboard</artifactId>
</dependency>

然后,在主應用程序類上添加?@EnableHystrixDashboard?注解。

@SpringBootApplication
@EnableHystrixDashboard
public class HystrixDashboardApplication {public static void main(String[] args) {SpringApplication.run(HystrixDashboardApplication.class, args);}
}

啟動應用后,訪問?http://localhost:8080/hystrix,可以看到 Hystrix Dashboard 的界面。通過輸入 Hystrix 監控端點的 URL,可以監控特定服務的 Hystrix 狀態。

第五部分:Spring Cloud Netflix Zuul

Spring Cloud Netflix Zuul 是一個路由服務器,用于為微服務架構中的服務提供統一的訪問入口。它支持動態路由、負載均衡、安全認證等功能。

5.1 Zuul 代理

要使用 Zuul 代理,首先需要在項目中添加?spring-cloud-starter-netflix-zuul?依賴。

<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-netflix-zuul</artifactId>
</dependency>

然后,在主應用程序類上添加?@EnableZuulProxy?注解。

@SpringBootApplication
@EnableZuulProxy
public class ZuulApplication {public static void main(String[] args) {SpringApplication.run(ZuulApplication.class, args);}
}

在?application.yml?或?application.properties?文件中,配置 Zuul 代理的相關屬性。

zuul:routes:service-name:path: /service-name/**serviceId: service-name

在上面的配置中,service-name?是 Zuul 路由的名稱,serviceId?是目標服務的服務 ID。

5.2 Zuul 過濾器

Zuul 支持自定義過濾器,用于在請求和響應的生命周期中插入邏輯。要創建一個 Zuul 過濾器,需要實現?ZuulFilter?接口。

@Component
public class MyZuulFilter implements ZuulFilter {@Overridepublic String filterType() {// 返回過濾器類型,例如 pre、post、errorreturn "pre";}@Overridepublic int filterOrder() {// 返回過濾器順序return 1;}@Overridepublic boolean shouldFilter() {// 返回是否執行過濾器邏輯return true;}@Overridepublic Object run() {// 過濾器邏輯return null;}
}

在上述代碼中,filterType?定義了過濾器的類型,filterOrder?定義了過濾器的執行順序,shouldFilter?定義了是否執行過濾器邏輯,run?方法包含了過濾器的具體邏輯。

5.3 Zuul 安全

Zuul 支持多種安全認證機制,例如 OAuth2。要使用 OAuth2 認證,首先需要在項目中添加?spring-cloud-starter-security?依賴。

<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-security</artifactId>
</dependency>

然后,在?application.yml?或?application.properties?文件中配置 OAuth2 客戶端信息。

security:oauth2:client:client-id: your-client-idclient-secret: your-client-secretscope: read,writegrant-type: client_credentials

總結

Spring Cloud 是一套完整的微服務架構解決方案,它為開發者提供了一系列的工具和組件,用于快速構建分布式系統中的一些常見模式。通過本博客的探討,我們了解了 Spring Cloud 的核心組件和它們的工作原理。

Spring Cloud Config 提供了集中管理應用程序配置的服務,Spring Cloud Eureka 提供了服務發現和注冊的功能,Spring Cloud Hystrix 提供了斷路器以處理服務調用時的延遲和容錯,Spring Cloud Zuul 提供了路由服務器以統一訪問微服務架構中的服務。

掌握 Spring Cloud 的這些組件和技術,可以幫助開發者構建穩定、可擴展的微服務架構。隨著 Spring Cloud 生態系統的不斷發展和完善,我們可以期待更多的創新和改進,進一步推動微服務架構的發展。對于希望在這個快速變化的技術領域中保持競爭力的開發者來說,深入理解和掌握 Spring Cloud 是一個不可或缺的技能。

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

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

相關文章

C語言例題41、八進制轉換為十進制

#include<stdio.h>void main() {int x;printf("請輸入一個8進制整數&#xff1a;");scanf("%o", &x);printf("轉換成十進制后的整數為%d\n", x); }運行結果&#xff1a; 本章C語言經典例題合集&#xff1a;http://t.csdnimg.cn/FK0Qg…

Java基礎(33)Java Web攔截器作用和用法

Java Web攔截器&#xff08;Interceptor&#xff09;是Java Web開發中一個重要的概念&#xff0c;它允許開發者在處理HTTP請求和響應之前或之后執行特定的代碼&#xff0c;從而實現如權限檢查、日志記錄、事務管理等功能。攔截器可以作用于Java EE的Servlet、Spring框架、Strut…

redis試題按知識點歸類(四)

十六、實戰應用 1.如何使用 Redis 存儲用戶會話&#xff1f; 2.Redis 在電子商務平臺中的應用是什么&#xff1f; 3.如何使用 Redis 進行實時數據分析&#xff1f; 十七、面試題綜合 1.描述一次你解決 Redis 性能問題的經歷。 2.你如何理解 Redis 中的“單線程”模型&…

Java入門基礎學習筆記21——Scanner

在程序中接收用戶通過鍵盤輸入的數據&#xff1a; 需求&#xff1a; 請在程序中&#xff0c;提示用戶通過鍵盤輸入自己的姓名、年齡、并能在程序中收到這些信息&#xff0c;怎么解決&#xff1f; Java已經寫好了實現程序&#xff0c;我們調用即可。 API&#xff1a;Applicat…

2024 年中國大學生程序設計競賽全國邀請賽(鄭州)暨第六屆CCPC河南省大學生程序設計競賽 problem K. 樹上問題

//先找一個美麗的樹&#xff0c;然后遍歷樹找節點,分析是否符合條件。 //畫幾個圖&#xff0c;思考下。 #include<bits/stdc.h> using namespace std; #define int long long const int n1e611; int a,b,c[n],d,l,r,k,w,an; vector<int>t[n]; void dfs(int x,int…

MLT剪輯sample

#include <framework/mlt.h> int main(int argc, char **argv) { // 初始化MLT mlt_factory factory mlt_factory_init(NULL); // 加載素材&#xff08;這里假設我們有一個名為"video.mp4"的視頻文件&#xff09; mlt_profile profile mlt_prof…

什么是頁分裂、頁合并?

數據組織方式 在InnoDB存儲引擎中&#xff0c;表數據都是根據主鍵順序組織存放的&#xff0c;這種存儲方式的表稱為索引組織表(index organized table IOT)。 行數據&#xff0c;都是存儲在聚集索引的葉子節點上的。而我們之前也講解過InnoDB的邏輯結構圖&#xff1a; 在I…

61、內蒙古工業大學、內蒙科學技術研究院:CBAM-CNN用于SSVEP - BCI的分類方法[腦機二區還是好發的]

前言&#xff1a; 之前寫過一篇對CBAM模型改進的博客&#xff0c;在CBAM中引入了ECANet結構&#xff0c;對CBAM中的CAM、SAM模塊逐一改進&#xff0c;并提出ECA-CBAM單鏈雙鏈結構&#xff0c;我的這個小的想法已經被一些同學實現了&#xff0c;并進行了有效的驗證&#xff0c;…

快速對比 找出2個名單不同之處

import pandas as pd# 讀取兩個Excel文件 df1 pd.read_excel(1.xlsx) df2 pd.read_excel(2.xlsx)# 檢查兩個DataFrame的列是否相同 if list(df1.columns) ! list(df2.columns):print("兩個Excel文件的列不一致。")print("文件1的列&#xff1a;", df1.co…

AI智能體|手把手教你申請一個Kimi(Moonshot)的API KEY

大家好&#xff0c;我是無界生長。 今天分享一下如何申請一個Kimi(Moonshot)的API KEY&#xff0c;為后面Kimi(Moonshot)接入微信機器人做鋪墊。學會了的話&#xff0c;歡迎分享轉發&#xff01; 前提 擁有一個Kimi(Moonshot)賬號 使用手機號注冊即可&#xff0c;新用戶可免費…

oracle如何設計生成token給程序使用

在Oracle中設計生成token&#xff08;令牌&#xff09;供程序使用通常涉及幾個步驟&#xff0c;這些步驟可能因您的具體需求和使用的技術棧而有所不同。以下是一個基本的指南&#xff0c;描述了如何設計并生成token&#xff1a; 確定token的用途和屬性&#xff1a; 確定token…

【線程創建】——三種方式?多線程案例練習

02 線程創建 Thread , Runnable , Callable 三種創建方式 Thread class - 繼承Thread類 (重點) Runnable接口 - 實現Runnable接口 (重點) Callable接口 - 實現Callable接口 (了解) Thread 類實現 它繼承了老祖宗 Object java.lang.Object java.lang.Thread 它實現了 Runnab…

文本到語音的學習筆記:從Docker開始

1.docker 是什么意思&#xff1f; Docker 是一種開源的容器化平臺&#xff0c;它允許開發者將應用及其依賴打包到一個輕量級、可移植的容器中&#xff0c;然后可以在任何支持Docker的系統上運行這個應用&#xff0c;而不必擔心環境差異導致的問題。 以下是Docker的一些關鍵特…

原子操作std::atomic

std::atomic是 C11 標準庫提供的一個模板類&#xff0c;用于實現原子操作。原子操作是指不會被線程調度機制打斷的操作&#xff0c;即這種操作一旦開始&#xff0c;就一直運行到結束&#xff0c;中間不會有任何線程切換。在多線程編程中&#xff0c;原子操作對于確保數據的一致…

EasyExcel 導出,保留兩位小數并顯示 千分位

實體類 屬性類型為 BigDecimal 注解 NumberFormat("#,###.00") 試過了不頂用&#xff0c;原因不太清楚 值為 0.81 這種&#xff0c;導出后變為 .81 所以&#xff0c;換個思路&#xff0c;寫個轉換器&#xff0c;就是麻煩點 轉換器 BigDecimalConvert import cn.h…

【go項目01_學習記錄11】

操作數據庫 1 文章列表2 刪除文章 1 文章列表 &#xff08;1&#xff09;先保證文章已經有多篇&#xff0c;可以直接在數據庫中添加&#xff0c;或者訪問鏈接: localhost:3000/articles/create&#xff0c;增加幾篇文章。 &#xff08;2&#xff09;之前設置好了articles.ind…

【Web后端】監聽器Listener

1、簡介 用來監聽Servlet組件對象狀態發生變化的組件可以監聽的源包括:ServetRequest、HttpSession、ServletContext當監聽到事件源狀態發生變化時&#xff0c;會有對應的響應行為 2、使用方法 在web.xml文件中配置 <listener> <listener-class>com.coder.util.…

【DevOps】詳解 Linux 用戶和權限管理:添加用戶、分組及文件權限設置

目錄 1. 用戶管理 用戶分類 用戶相關文件 常用命令 2. 組管理 組相關文件 常用命令 3. 權限管理 文件權限 權限表示 修改權限 修改所有者和所屬組 特殊權限 4. 示例 命令的詳細解釋 權限解釋 示例&#xff1a;文件權限 -rw-r--r-- 的含義 在 Linux 中&#xf…

棧隊列經典OJ題(詳細過程)

1. 有效的括號 - 力扣&#xff08;LeetCode&#xff09; 第一題判斷有效的括號&#xff0c;這道題我們會用到棧的知識&#xff0c;棧是后進先出的&#xff0c;可以根據這個來解這道題&#xff0c;先看一下題目和示例。 1.1整體思路 我們通過示例可以看出括號匹配就返回true&am…

【JAVA】BOSS系統發版藝術:構建高效、優雅的微服務部署策略

在現代軟件開發領域&#xff0c;微服務架構與容器化部署已迅速成為行業新趨勢。微服務架構通過將應用拆分成多個小型、自治的服務單元&#xff0c;每個服務承擔某項特定的業務功能。而容器化部署則以其輕量級和高度可移植的特性&#xff0c;為這些微服務的有效打包、分發和運行…