Spring Cloud Alibaba系列之分布式服務(wù)組件Dubbo
1、分布式理論
1.1、分布式基本定義
《分布式系統(tǒng)原理與范型》定義:
“分布式系統(tǒng)是若干獨(dú)立計(jì)算機(jī)的集合,這些計(jì)算機(jī)對(duì)于用戶來(lái)說(shuō)就像單個(gè)相關(guān)系統(tǒng)”
分布式系統(tǒng)(distributed system)是建立在網(wǎng)絡(luò)之上的軟件系統(tǒng)。
1.2、架構(gòu)發(fā)展演變
架構(gòu)的發(fā)展是由最初的單一應(yīng)用架構(gòu)構(gòu)建的,一般就是ORM框架方便數(shù)據(jù)庫(kù)操作。
不過(guò)隨著系統(tǒng)越來(lái)越復(fù)雜,單一應(yīng)用架構(gòu)會(huì)變得難以維護(hù),所以架構(gòu)逐漸演變出了垂直應(yīng)用架構(gòu),所謂垂直應(yīng)用架構(gòu)其實(shí)就是安裝業(yè)務(wù)模板進(jìn)行拆分,比如可以安裝業(yè)務(wù)將一個(gè)電商系統(tǒng)分為訂單模塊,用戶信息管理模塊,商品管理模塊等等,這時(shí)候MVC框架就派上用場(chǎng),MVC框架可以協(xié)助系統(tǒng)更好的按業(yè)務(wù)拆分,不過(guò)業(yè)務(wù)拆分后雖然是比單一應(yīng)用架構(gòu)更好維護(hù)了。
不過(guò)隨著系統(tǒng)越來(lái)約復(fù)雜,發(fā)現(xiàn)很多共用的模塊很難復(fù)用起來(lái),這時(shí)候分布式服務(wù)架構(gòu)登場(chǎng)了,分布式架構(gòu)是將一些核心業(yè)務(wù)抽取出來(lái),作為獨(dú)立的服務(wù),逐漸形成穩(wěn)定的服務(wù)中心,當(dāng)應(yīng)用需要時(shí),就去服務(wù)中心調(diào)服務(wù)就可以,而實(shí)現(xiàn)這種服務(wù)注冊(cè)的肯定是RPC框架了。
當(dāng)服務(wù)越來(lái)越多,容量的評(píng)估,小服務(wù)資源的浪費(fèi)等問(wèn)題逐漸顯現(xiàn),此時(shí)需增加一個(gè)調(diào)度中心基于訪問(wèn)壓力實(shí)時(shí)管理集群容量,提高集群利用率,這時(shí)候就需要流動(dòng)計(jì)算架構(gòu)(SOA)[ Service Oriented Architecture],用于提高機(jī)器利用率的資源調(diào)度,SOA是一個(gè)治理中心,綜上所述,到目前,軟件系統(tǒng)架構(gòu)演變經(jīng)歷了:?jiǎn)我粦?yīng)用架構(gòu)->垂直應(yīng)用架構(gòu)->分布式應(yīng)用架構(gòu)->流動(dòng)計(jì)算架構(gòu),下面Dubbo官網(wǎng)的圖片可以很好的描述
1.3、什么是RPC?
RPC概念
RPC【Remote Procedure Call】是指遠(yuǎn)程過(guò)程調(diào)用,是一種進(jìn)程間通信方式,他是一種技術(shù)的思想,而不是規(guī)范。它允許程序調(diào)用另一個(gè)地址空間(通常是共享網(wǎng)絡(luò)的另一臺(tái)機(jī)器上)的過(guò)程或函數(shù),而不用程序員顯式編碼這個(gè)遠(yuǎn)程調(diào)用的細(xì)節(jié)。
RPC核心模塊
RPC有兩個(gè)核心模塊:通信和序列化
2、什么是Dubbo框架?
2.1、Apache Dubbo 定義
Apache Dubbo (incubating) |?d?b??| 是一款高性能、輕量級(jí)的開源Java RPC框架,它提供了三大核心能力:面向接口的遠(yuǎn)程方法調(diào)用,智能容錯(cuò)和負(fù)載均衡,以及服務(wù)自動(dòng)注冊(cè)和發(fā)現(xiàn)。
官網(wǎng):
http://dubbo.apache.org/
2.2、Dubbo角色
Provider:暴露服務(wù)的服務(wù)提供者
Container:服務(wù)運(yùn)行的容器
Consumer:調(diào)用遠(yuǎn)程服務(wù)的消費(fèi)者
Registry:服務(wù)注冊(cè)和發(fā)現(xiàn)的注冊(cè)中心
Minitor:統(tǒng)計(jì)服務(wù)調(diào)用次數(shù)和時(shí)間的監(jiān)控中心
2.3、Apache Dubbo原理
Dubbo的服務(wù)治理:
Dubbo原理圖片,圖片來(lái)自Dubbo官網(wǎng):

調(diào)用過(guò)程:
下面根據(jù)我的理解說(shuō)明一下
0:服務(wù)器容器負(fù)責(zé)啟動(dòng)、加載、運(yùn)行服務(wù)提供者
1:服務(wù)提供者在啟動(dòng)后就可以向注冊(cè)中心暴露服務(wù)
2:服務(wù)消費(fèi)者在啟動(dòng)后就可以向注冊(cè)中心訂閱想要的服務(wù)
3:注冊(cè)中心向服務(wù)消費(fèi)者返回服務(wù)調(diào)用列表
4:服務(wù)消費(fèi)者基于軟負(fù)載均衡算法調(diào)用服務(wù)提供者的服務(wù),這個(gè)服務(wù)提供者有可能是一個(gè)服務(wù)提供者列表,調(diào)用那個(gè)服務(wù)提供者就是根據(jù)負(fù)載均衡來(lái)調(diào)用了
5:服務(wù)提供者和服務(wù)消費(fèi)者定時(shí)將保存在內(nèi)存中的服務(wù)調(diào)用次數(shù)和服務(wù)調(diào)用時(shí)間推送給監(jiān)控中心
3、Dubbo Spring Cloud
3.1 概念定義
Spring Cloud Alibaba Dubbo是Spring Cloud Alibaba項(xiàng)目中的一個(gè),擴(kuò)展了分布式服務(wù)調(diào)用能力,不僅能使 Apache Dubbo 和 OpenFeign 共存,還允許 Spring Cloud 標(biāo)準(zhǔn)調(diào)用底層通過(guò) Dubbo 支持的通訊協(xié)議傳輸
3.2、功能特性對(duì)比
功能特征直接引用官網(wǎng)的歸納:
4、實(shí)驗(yàn)環(huán)境準(zhǔn)備
環(huán)境準(zhǔn)備:
64bit JDK 1.8
SpringBoot2.3.7.RELEASE
SpringCloud(Hoxton.SR9)
SpringCloudAlibaba2.2.2.RELEASE
Maven 3.2+
開發(fā)工具
IntelliJ IDEA
smartGit
5、API工程創(chuàng)建
使用maven命令
mvn archetype:generate -DgroupId=com.example.springcloud -DartifactId=dubbo-sample-api -Dversion=0.0.1-SNAPSHOT -DinteractiveMode=false也可以自己創(chuàng)建一個(gè)maven項(xiàng)目
創(chuàng)建好的pom配置文件參考:
<?xml version="1.0" encoding="UTF-8"?><project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>com.example.springcloud</groupId><artifactId>artifact-dubbo-sample-api</artifactId><version>0.0.1-SNAPSHOT</version><name>artifact-dubbo-sample-api</name><description>Demo project for Spring Boot</description><packaging>jar</packaging><dependencies><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>3.8.1</version><scope>test</scope></dependency></dependencies></project>
寫個(gè)api接口:
package com.example.springcloud.api.service;/*** <pre>* ApiService* </pre>** <pre>* @author mazq* 修改記錄* 修改后版本: 修改人:修改日期: 2021/01/19 14:57 修改內(nèi)容:* </pre>*/public interface ApiService {String echo(String message);}
6、啟動(dòng)Nacos服務(wù)中心
詳情可以參考官網(wǎng):https://nacos.io/zh-cn/docs/quick-start.html,需要先下載nacos服務(wù)端源碼,下載源碼后編譯啟動(dòng)項(xiàng)目:
window+R啟動(dòng)cmd窗口,cd到nacos server的bin目錄,linux系統(tǒng)直接使用cd ${nacos_server_home}/bin
./startup.sh -m standalonewindow系統(tǒng)使用命令startup.cmd -m standalone
啟動(dòng)成功,訪問(wèn):http://127.0.0.1:8848/nacos,賬號(hào)密碼都是nacos
登錄成功,來(lái)到主頁(yè):
7、服務(wù)提供者工程創(chuàng)建
新建項(xiàng)目,使用阿里的service url:
選擇jdk版本,打包方式:
選擇組件:
自動(dòng)生成項(xiàng)目:加上@EnableDiscoveryClient支持服務(wù)注冊(cè)到nacos
package com.example.springcloud.provider.nacosdiscovery;import org.springframework.cloud.client.discovery.EnableDiscoveryClient;import org.springframework.context.annotation.Configuration;@EnableDiscoveryClient@Configurationpublic class NacosDiscoveryConfiguration {}
使用@DubboService提供dubbo服務(wù):
package com.example.springcloud.provider.service;import com.example.springcloud.api.service.ApiService;import org.apache.dubbo.config.annotation.DubboService;import org.apache.dubbo.config.annotation.Service;/*** <pre>* EchoServiceImpl* </pre>** <pre>* @author mazq* 修改記錄* 修改后版本: 修改人:修改日期: 2021/01/19 15:13 修改內(nèi)容:* </pre>*/@DubboServicepublic class EchoServiceImpl implements ApiService {@Overridepublic String echo(String message) {return String.format("echo:%s",message);}}
application.properties配置:
# 應(yīng)用名稱spring.application.name=dubbo-provider-sample# dubbo 協(xié)議dubbo.protocol.id=dubbodubbo.protocol.name=dubbo# dubbo 協(xié)議端口( -1 表示自增端口,從 20880 開始)dubbo.protocol.port=-1# Dubbo 消費(fèi)端訂閱服務(wù)端的應(yīng)用名,多個(gè)服務(wù)提供者用逗號(hào)分隔# 這里訂閱"自己",會(huì)被忽略掉,請(qǐng)根據(jù)實(shí)際情況添加dubbo.cloud.subscribed-services=dubbo-provider-sample# dubbo 服務(wù)掃描基準(zhǔn)包dubbo.scan.base-packages=com.example.springcloud.provider# Actuator Web 訪問(wèn)端口management.server.port=8082management.endpoints.jmx.exposure.include=*management.endpoints.web.exposure.include=*management.endpoint.health.show-details=always# 應(yīng)用服務(wù) WEB 訪問(wèn)端口server.port=8080# Nacos幫助文檔: https://nacos.io/zh-cn/docs/concepts.html# Nacos認(rèn)證信息spring.cloud.nacos.discovery.username=nacosspring.cloud.nacos.discovery.password=nacos# Nacos 服務(wù)發(fā)現(xiàn)與注冊(cè)配置,其中子屬性 server-addr 指定 Nacos 服務(wù)器主機(jī)和端口spring.cloud.nacos.discovery.server-addr=127.0.0.1:8848# 注冊(cè)到 nacos 的指定 namespace,默認(rèn)為 publicspring.cloud.nacos.discovery.namespace=public
啟動(dòng)項(xiàng)目,到nacos服務(wù)查看服務(wù)

8、服務(wù)消費(fèi)者工程創(chuàng)建
新建一個(gè)dubbo-consumer-sample服務(wù)消費(fèi)者工程,創(chuàng)建過(guò)程和服務(wù)提供者工程一樣,不過(guò)配置需要進(jìn)行修改,避免端口沖突
# 應(yīng)用名稱spring.application.name=dubbo-consumer-sample# 應(yīng)用服務(wù) WEB 訪問(wèn)端口server.port=9090# Actuator Web 訪問(wèn)端口management.server.port=9091management.endpoints.jmx.exposure.include=*management.endpoints.web.exposure.include=*management.endpoint.health.show-details=always# Nacos幫助文檔: https://nacos.io/zh-cn/docs/concepts.html# Nacos認(rèn)證信息spring.cloud.nacos.discovery.username=nacosspring.cloud.nacos.discovery.password=nacos# Nacos 服務(wù)發(fā)現(xiàn)與注冊(cè)配置,其中子屬性 server-addr 指定 Nacos 服務(wù)器主機(jī)和端口spring.cloud.nacos.discovery.server-addr=127.0.0.1:8848# 注冊(cè)到 nacos 的指定 namespace,默認(rèn)為 publicspring.cloud.nacos.discovery.namespace=public# Dubbo服務(wù)配置# dubbo 協(xié)議dubbo.protocol.id=dubbodubbo.protocol.name=dubbo# dubbo 協(xié)議端口( -1 表示自增端口,從 20880 開始)dubbo.protocol.port=-1# Dubbo 消費(fèi)端訂閱服務(wù)端的應(yīng)用名,多個(gè)服務(wù)提供者用逗號(hào)分隔dubbo.cloud.subscribed-services=dubbo-provider-sample
使用@DubboReference訂閱服務(wù):
package com.example.springcloud.consumer;import com.example.springcloud.api.service.ApiService;import org.apache.dubbo.config.annotation.DubboReference;import org.apache.dubbo.config.annotation.Reference;import org.springframework.boot.SpringApplication;import org.springframework.boot.autoconfigure.SpringBootApplication;import org.springframework.web.bind.annotation.GetMapping;import org.springframework.web.bind.annotation.RestController;@SpringBootApplication@RestControllerpublic class DubboConsumerSampleApplication {@DubboReferenceprivate ApiService echoService;@GetMapping("/echo")public String echo(String message) {return echoService.echo(message);}public static void main(String[] args) {SpringApplication.run(DubboConsumerSampleApplication.class, args);}}

linux測(cè)試接口使用命令curl,window直接到瀏覽器或者postman測(cè)試:
curl http://127.0.0.1:9090/echo?message=nacosecho:nacos

騰訊、阿里、滴滴后臺(tái)面試題匯總總結(jié) — (含答案)
面試:史上最全多線程面試題 !
最新阿里內(nèi)推Java后端面試題
JVM難學(xué)?那是因?yàn)槟銢]認(rèn)真看完這篇文章

關(guān)注作者微信公眾號(hào) —《JAVA爛豬皮》
了解更多java后端架構(gòu)知識(shí)以及最新面試寶典


看完本文記得給作者點(diǎn)贊+在看哦~~~大家的支持,是作者源源不斷出文的動(dòng)力
作者:SmileNicky
出處:https://www.cnblogs.com/mzq123/p/14831158.html
