前言
本文從spring和springboot 引出Spring Cloud,緊接著介紹Spring Cloud Alibaba。以及如何快速上手Spring Cloud Alibaba:Spring Cloud Alibaba核心技術(shù)與實(shí)戰(zhàn)案例
Spring Cloud
等等。在我們深入研究Spring Cloud之前,讓我們先了解一下Spring和Spring Boot。
Spring框架
我們都知道Spring框架已經(jīng)存在很長(zhǎng)時(shí)間了,它提供了以下功能:
- Spring JDBC
- Spring MVC
- Spring Security
- Spring AOP
- Spring ORM(與Hibernate進(jìn)行映射)
- Spring Test
通過(guò)這些功能,Java開(kāi)發(fā)人員過(guò)去通常使用Spring MVC開(kāi)發(fā)Web應(yīng)用程序,然后將Spring應(yīng)用程序與任何ORM框架(如Hibernate)進(jìn)行連接。
在那個(gè)時(shí)代,我們使用JSP頁(yè)面調(diào)用Spring Controller來(lái)調(diào)用與數(shù)據(jù)庫(kù)交互的Service層。然后我們需要運(yùn)行一個(gè)獨(dú)立的Web服務(wù)器(如tomcat),并將war/ear文件放入tomcat中來(lái)運(yùn)行我們的Web應(yīng)用程序。
很多年前,有一個(gè)著名的面試問(wèn)題:
“如何將Spring與Hibernate集成?” - 我們都知道我們需要執(zhí)行以下步驟:
- 創(chuàng)建applicatoncontext.xml文件
- 聲明數(shù)據(jù)源并提供配置
- 聲明Hibernate Session Factory并與數(shù)據(jù)源關(guān)聯(lián)
- 最后,將Session Factory映射到Spring框架的HibernateTemplate
在進(jìn)行了這些配置之后,Spring和Hibernate可以無(wú)縫地工作。
Spring Boot
Spring框架有很多功能,它是一個(gè)強(qiáng)大的框架,被Java開(kāi)發(fā)人員廣泛使用。但正如我們上面討論的,它仍然存在一些缺點(diǎn)。世界正在朝著松耦合的架構(gòu)發(fā)展,以使用任何可插拔的前端框架,如Angular、React等,但Spring框架與Spring MVC緊密耦合,使用JSP頁(yè)面。
然后,Spring Boot框架出現(xiàn)了,它用于快速構(gòu)建與任何UI框架插件相關(guān)的REST API。它還通過(guò)提供以下功能解決了Spring框架的所有缺點(diǎn):
- 內(nèi)嵌的Tomcat服務(wù)器
- Spring Data JPA(無(wú)需任何配置即可自動(dòng)連接Hibernate)
- 默認(rèn)日志記錄器的自動(dòng)記錄
- 全局異常處理器(使用AOP來(lái)處理異常)
- 自動(dòng)配置
- 內(nèi)存數(shù)據(jù)庫(kù)(非常適用于執(zhí)行單元測(cè)試用例)
- Starter依賴項(xiàng)
在Spring Boot和微服務(wù)進(jìn)化之后,傳統(tǒng)的Spring框架的使用量已經(jīng)減少,幾乎每個(gè)組織都已經(jīng)遷移到了Spring Boot,這是開(kāi)發(fā)生產(chǎn)級(jí)Java Web應(yīng)用程序的現(xiàn)代方式。
Spring Cloud
現(xiàn)在讓我們來(lái)看看Spring Cloud領(lǐng)域。正如前面討論的,Spring Boot用于編寫(xiě)?yīng)毩⒌腏ava Web應(yīng)用程序。那么如何配置它與外部系統(tǒng)或組件一起使用呢?答案是Spring Cloud。是的,你沒(méi)聽(tīng)錯(cuò)。
Spring Cloud提供了以下對(duì)于現(xiàn)代分布式系統(tǒng)非常關(guān)鍵的功能:
-
分布式/版本化配置
一個(gè)集中的配置服務(wù)器用于維護(hù)應(yīng)用程序配置
這可以與代碼倉(cāng)庫(kù)分開(kāi)維護(hù),并且易于管理 -
服務(wù)注冊(cè)和發(fā)現(xiàn)
所有服務(wù)都將其標(biāo)識(shí)注冊(cè)到注冊(cè)服務(wù)器,其中最著名的是Eureka。
連接到中央服務(wù)器的客戶端可以更新和檢索地址。 -
服務(wù)間調(diào)用
服務(wù)可以通過(guò)以下步驟相互發(fā)現(xiàn)以進(jìn)行通信:- 注冊(cè)服務(wù)
- 獲取注冊(cè)表
- 查找下游服務(wù)
- 解析底層IP地址
- 使用RestTemplate調(diào)用REST端點(diǎn)
-
負(fù)載均衡
負(fù)載均衡的目標(biāo)是最大化吞吐量,最小化響應(yīng)時(shí)間,提高效率和優(yōu)化資源使用。
使用帶有負(fù)載均衡的多個(gè)組件可以通過(guò)冗余提高可靠性和可用性。
Eureka依賴項(xiàng)具有名為Ribbon的內(nèi)置負(fù)載均衡器,它在單個(gè)服務(wù)的實(shí)例之間平衡負(fù)載。 -
斷路器
當(dāng)調(diào)用另一個(gè)微服務(wù)/另一個(gè)系統(tǒng)的API失敗時(shí),斷路器用作回退機(jī)制。
它們使得打開(kāi)和關(guān)閉電路以及在失敗情況下該做什么成為可能。斷路器能夠優(yōu)雅地處理這些故障。
Spring Boot中廣泛使用的斷路器是resilience4j。 -
API網(wǎng)關(guān)
Spring Cloud Gateway是為Spring Boot應(yīng)用程序設(shè)計(jì)的API網(wǎng)關(guān)。它具有以下功能:- 基于Spring框架5、項(xiàng)目反應(yīng)器和Spring Boot 2.0構(gòu)建
- 能夠根據(jù)任何請(qǐng)求屬性匹配路由
- 謂詞和過(guò)濾器特定于路由
- 斷路器集成
- Spring Cloud Discovery Client集成
- 易于編寫(xiě)謂詞和過(guò)濾器
- 請(qǐng)求速率限制
- 路徑重寫(xiě)
-
Spring Cloud安全
Spring Security集成,提供身份驗(yàn)證和授權(quán)
支持JWT令牌驗(yàn)證
Spring Cloud Security通過(guò)使用Spring Boot和Spring Security OAuth2提供了一組用于構(gòu)建安全應(yīng)用程序的基本功能
我們可以快速創(chuàng)建實(shí)現(xiàn)單點(diǎn)登錄、令牌中繼和令牌交換等常見(jiàn)模式的系統(tǒng)。 -
分布式跟蹤
跟蹤在微服務(wù)中非常有用,因?yàn)閬?lái)自客戶端的請(qǐng)求可能在多個(gè)微服務(wù)之間傳遞。對(duì)于開(kāi)發(fā)人員來(lái)說(shuō),查看請(qǐng)求在服務(wù)之間的狀態(tài)是至關(guān)重要的,而Spring Cloud通過(guò)提供以下依賴項(xiàng)來(lái)解決這個(gè)問(wèn)題
我們可以向項(xiàng)目中添加Spring Cloud Sleuth庫(kù)以啟用跟蹤。Sleuth負(fù)責(zé)記錄時(shí)間,并生成用于延遲分析的請(qǐng)求ID。有了這個(gè)請(qǐng)求ID,我們可以跟蹤請(qǐng)求在服務(wù)之間的傳遞情況。
Zipkin是一種專(zhuān)為分析微服務(wù)架構(gòu)內(nèi)的延遲問(wèn)題而設(shè)計(jì)的分布式跟蹤工具。它公開(kāi)了用于收集輸入數(shù)據(jù)的HTTP端點(diǎn)。如果我們需要向項(xiàng)目中添加跟蹤功能,我們應(yīng)該添加spring-cloud-starter-Zipkin依賴項(xiàng)。 -
分布式消息傳遞
Spring Cloud Bus通過(guò)輕量級(jí)消息代理將分布式系統(tǒng)的節(jié)點(diǎn)連接起來(lái)。然后可以使用AMQP和其他消息傳遞協(xié)議來(lái)廣播應(yīng)用程序中的狀態(tài)更改。
這是微服務(wù)中非常常見(jiàn)的一種用例,通過(guò)將消息推送到RabbitMQ、Kafka、AWS SQS等實(shí)現(xiàn)異步通信。
Spring Cloud Stream是Spring Cloud中的另一個(gè)框架,用于構(gòu)建與共享消息系統(tǒng)連接的高度可擴(kuò)展的事件驅(qū)動(dòng)微服務(wù)。它用于流處理。
正如我們上面所看到的,Spring Cloud具有許多用于分布式系統(tǒng)通信的功能,我們可以包含所需的依賴項(xiàng)并非常容易地使用它。
簡(jiǎn)而言之,Spring Boot是用于開(kāi)發(fā)獨(dú)立的微服務(wù)應(yīng)用程序的應(yīng)用程序,而Spring Cloud用于配置這些服務(wù)之間的通信。因此,為了實(shí)現(xiàn)生產(chǎn)級(jí)微服務(wù)系統(tǒng),兩者都是必需的。
Spring Cloud Alibaba
Spring Cloud作為微服務(wù)的大管家,可以管理眾多微服務(wù),因此需要很多小助手來(lái)提供幫助。
pring Cloud Alibaba 致力于提供微服務(wù)開(kāi)發(fā)的一站式解決方案。此項(xiàng)目包含開(kāi)發(fā)分布式應(yīng)用微服務(wù)的必需組件,方便開(kāi)發(fā)者通過(guò) Spring Cloud 編程模型輕松使用這些組件來(lái)開(kāi)發(fā)分布式應(yīng)用服務(wù)。
組件
-
Sentinel:把流量作為切入點(diǎn),從流量控制、熔斷降級(jí)、系統(tǒng)負(fù)載保護(hù)等多個(gè)維度保護(hù)服務(wù)的穩(wěn)定性。
-
Nacos:一個(gè)更易于構(gòu)建云原生應(yīng)用的動(dòng)態(tài)服務(wù)發(fā)現(xiàn)、配置管理和服務(wù)管理平臺(tái)。
-
RocketMQ:一款開(kāi)源的分布式消息系統(tǒng),基于高可用分布式集群技術(shù),提供低延時(shí)的、高可靠的消息發(fā)布與訂閱服務(wù)。
-
Seata:阿里巴巴開(kāi)源產(chǎn)品,一個(gè)易于使用的高性能微服務(wù)分布式事務(wù)解決方案。
-
Alibaba Cloud OSS: 阿里云對(duì)象存儲(chǔ)服務(wù)(Object Storage Service,簡(jiǎn)稱(chēng) OSS),是阿里云提供的海量、安全、低成本、高可靠的云存儲(chǔ)服務(wù)。您可以在任何應(yīng)用、任何時(shí)間、任何地點(diǎn)存儲(chǔ)和訪問(wèn)任意類(lèi)型的數(shù)據(jù)。
-
Alibaba Cloud SchedulerX: 阿里中間件團(tuán)隊(duì)開(kāi)發(fā)的一款分布式任務(wù)調(diào)度產(chǎn)品,提供秒級(jí)、精準(zhǔn)、高可靠、高可用的定時(shí)(基于 Cron 表達(dá)式)任務(wù)調(diào)度服務(wù)。
-
Alibaba Cloud SMS: 覆蓋全球的短信服務(wù),友好、高效、智能的互聯(lián)化通訊能力,幫助企業(yè)迅速搭建客戶觸達(dá)通道。
如何使用如何引入依賴
如果需要使用已發(fā)布的版本,在 dependencyManagement 中添加如下配置。
<dependencyManagement>
<dependencies>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-dependencies</artifactId>
<version>2022.0.0.0-RC2</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
然后在 dependencies 中添加自己所需使用的依賴即可使用。
如何掌握Spring Cloud Alibaba
為了讓大家快速上手掌握Spring Cloud Alibaba,給大家推薦一本書(shū)《Spring Cloud Alibaba核心技術(shù)與實(shí)戰(zhàn)案例》
京東鏈接:https://item.jd.com/14010448.html
特色
不留遺漏:全面覆蓋Dubbo核心知識(shí)點(diǎn)
直擊要害:實(shí)戰(zhàn)化案例精準(zhǔn)定位技術(shù)細(xì)節(jié)
學(xué)以致用:精要式演示確保開(kāi)發(fā)、學(xué)習(xí)不脫節(jié)
潛移默化:研磨式知識(shí)講解滲透技術(shù)要點(diǎn)
提升效率:垂直式技術(shù)精講不饒彎路
循序提升:漸進(jìn)式知識(shí)點(diǎn)編排確保連貫
配套資源:贈(zèng)送全書(shū)案例源文件助力學(xué)習(xí)
內(nèi)容簡(jiǎn)介
本書(shū)從分布式系統(tǒng)的基礎(chǔ)概念講起,逐步深入分布式系統(tǒng)中間件Spring Cloud Alibaba進(jìn)階實(shí)戰(zhàn),重點(diǎn)介紹了使用Spring Cloud Alibaba框架整合各種分布式組件的完整過(guò)程,讓讀者不但可以系統(tǒng)地學(xué)習(xí)分布式中間件的相關(guān)知識(shí),
而且還能對(duì)業(yè)務(wù)邏輯的分析思路、實(shí)際應(yīng)用開(kāi)發(fā)有更為深入的理解。
全書(shū)共分5大章節(jié),第1章開(kāi)篇部分,講解分布式系統(tǒng)的演進(jìn)過(guò)程和Spring Cloud Alibaba概述及版本的選擇,以及單體架構(gòu)/微服務(wù)架構(gòu)的優(yōu)缺點(diǎn);
第2章講解如何使用Spring Cloud Alibaba實(shí)現(xiàn)RPC通訊;
第3章在介紹主流Nacos組件時(shí),介紹了三元的概念以及使用Nacos實(shí)現(xiàn)注冊(cè)中心和配置中心,包含環(huán)境的動(dòng)態(tài)切換、配置的動(dòng)態(tài)刷新、通用型配置、版本回滾等核心技術(shù),為微服務(wù)環(huán)境提供基礎(chǔ)的架構(gòu);
第4章介紹了負(fù)責(zé)限流和熔斷降級(jí)的Sentinel組件,包含收集系統(tǒng)運(yùn)行狀態(tài)、流量控制、熔斷降級(jí)、熱點(diǎn)、授權(quán)、系統(tǒng)規(guī)則、流控的異常處理、熔斷的異常處理、規(guī)則持久化等;
第5章介紹了網(wǎng)關(guān)常用案例,以及在軟件項(xiàng)目中常用的高頻使用技術(shù)點(diǎn),力求為開(kāi)發(fā)微服務(wù)項(xiàng)目的程序員提供一個(gè)快速學(xué)習(xí)的捷徑。
本書(shū)內(nèi)容由淺入深、結(jié)構(gòu)清晰、實(shí)例豐富、通俗易懂、實(shí)用性強(qiáng),適合需要全方位學(xué)習(xí)Spring Cloud Alibaba相關(guān)技術(shù)的人員,也適合培訓(xùn)學(xué)校作為培訓(xùn)教材,還可作為大、中專(zhuān)院校相關(guān)專(zhuān)業(yè)的教學(xué)參考書(shū)。
以RocketMQ為例
RocketMQ 是一款開(kāi)源的分布式消息系統(tǒng),基于高可用分布式集群技術(shù),提供低延時(shí)的、高可靠的消息發(fā)布與訂閱服務(wù)。
下載并啟動(dòng) RocketMQ
在接入 RocketMQ Binder 之前,首先需要啟動(dòng) RocketMQ 的 Name Server 和 Broker。
-
下載RocketMQ最新的二進(jìn)制文件,并解壓
-
啟動(dòng) Name Server
sh bin/mqnamesrv
- 啟動(dòng) Broker
sh bin/mqbroker -n localhost:9876
引入依賴
修改 pom.xml
文件,引入 RocketMQ Stream Starter。
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-stream-rocketmq</artifactId>
</dependency>
簡(jiǎn)單示例
創(chuàng)建Topic
sh bin/mqadmin updateTopic -n localhost:9876 -c DefaultCluster -t test-topic
示例代碼
配置 Input 和 Output 的 Binding 信息并配合 @EnableBinding
注解使其生效
@SpringBootApplication
@EnableBinding({ Source.class, Sink.class })
public class RocketMQApplication {
public static void main(String[] args) {
SpringApplication.run(RocketMQApplication.class, args);
}
}
配置 Binding 信息:
# 配置rocketmq的nameserver地址
spring.cloud.stream.rocketmq.binder.name-server=127.0.0.1:9876
# 定義name為output的binding
spring.cloud.stream.bindings.output.destination=test-topic
spring.cloud.stream.bindings.output.content-type=application/json
# 定義name為input的binding
spring.cloud.stream.bindings.input.destination=test-topic
spring.cloud.stream.bindings.input.content-type=application/json
spring.cloud.stream.bindings.input.group=test-group
應(yīng)用啟動(dòng)
- 增加配置,在應(yīng)用的 /src/main/resources/application.properties 中添加基本配置信息
spring.application.name=rocketmq-example
server.port=28081
-
啟動(dòng)應(yīng)用,支持 IDE 直接啟動(dòng)和編譯打包后啟動(dòng)。
- IDE 直接啟動(dòng):找到主類(lèi)
RocketMQApplication
,執(zhí)行 main 方法啟動(dòng)應(yīng)用。 - 打包編譯后啟動(dòng):首先執(zhí)行
mvn clean package
將工程編譯打包,然后執(zhí)行java -jar rocketmq-example.jar
啟動(dòng)應(yīng)用。
- IDE 直接啟動(dòng):找到主類(lèi)
消息處理
使用 name 為 output 對(duì)應(yīng)的 binding 發(fā)送消息到 test-topic 這個(gè) topic。
使用2個(gè) input binding 訂閱數(shù)據(jù)。
-
input1: 訂閱 topic 為 test-topic 的消息,順序消費(fèi)所有消息(順序消費(fèi)的前提是所有消息都在一個(gè) MessageQueue 中)
-
input2: 訂閱 topic 為 test-topic 的消息,異步消費(fèi) tags 為 tagStr 的消息,Consumer 端線程池個(gè)數(shù)為20
配置信息如下:
spring.cloud.stream.rocketmq.binder.name-server=127.0.0.1:9876
spring.cloud.stream.bindings.output.destination=test-topic
spring.cloud.stream.bindings.output.content-type=application/json
spring.cloud.stream.bindings.input1.destination=test-topic
spring.cloud.stream.bindings.input1.content-type=text/plain
spring.cloud.stream.bindings.input1.group=test-group1
spring.cloud.stream.rocketmq.bindings.input1.consumer.orderly=true
spring.cloud.stream.bindings.input2.destination=test-topic
spring.cloud.stream.bindings.input2.content-type=text/plain
spring.cloud.stream.bindings.input2.group=test-group2
spring.cloud.stream.rocketmq.bindings.input2.consumer.orderly=false
spring.cloud.stream.rocketmq.bindings.input2.consumer.tags=tagStr
spring.cloud.stream.bindings.input2.consumer.concurrency=20
消息發(fā)送
使用 MessageChannel 進(jìn)行消息發(fā)送:
public class ProducerRunner implements CommandLineRunner {
@Autowired
private MessageChannel output; // 獲取name為output的binding
@Override
public void run(String... args) throws Exception {
Map<String, Object> headers = new HashMap<>();
headers.put(MessageConst.PROPERTY_TAGS, "tagStr");
Message message = MessageBuilder.createMessage(msg, new MessageHeaders(headers));
output.send(message);
}
}
或者使用 RocketMQ 原生的 API 進(jìn)行消息發(fā)送:文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-595360.html
public class RocketMQProducer {
DefaultMQProducer producer = new DefaultMQProducer("producer_group");
producer.setNamesrvAddr("127.0.0.1:9876");
producer.start();
Message msg = new Message("test-topic", "tagStr", "message from rocketmq producer".getBytes());
producer.send(msg);
}
消息接收
使用 @StreamListener
注解接收消息:文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-595360.html
@Service
public class ReceiveService {
@StreamListener("input1")
public void receiveInput1(String receiveMsg) {
System.out.println("input1 receive: " + receiveMsg);
}
@StreamListener("input2")
public void receiveInput2(String receiveMsg) {
System.out.println("input2 receive: " + receiveMsg);
}
}
到了這里,關(guān)于快速讀懂什么是Spring Cloud 與 Spring Cloud Alibaba的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!