<kbd id="5sdj3"></kbd>
<th id="5sdj3"></th>

  • <dd id="5sdj3"><form id="5sdj3"></form></dd>
    <td id="5sdj3"><form id="5sdj3"><big id="5sdj3"></big></form></td><del id="5sdj3"></del>

  • <dd id="5sdj3"></dd>
    <dfn id="5sdj3"></dfn>
  • <th id="5sdj3"></th>
    <tfoot id="5sdj3"><menuitem id="5sdj3"></menuitem></tfoot>

  • <td id="5sdj3"><form id="5sdj3"><menu id="5sdj3"></menu></form></td>
  • <kbd id="5sdj3"><form id="5sdj3"></form></kbd>

    Spring Cloud Alibaba系列之分布式服務(wù)組件Dubbo

    共 7471字,需瀏覽 15分鐘

     ·

    2021-06-10 03:19

    走過路過不要錯(cuò)過

    點(diǎn)擊藍(lán)字關(guān)注我們


    1、分布式理論

    1.1、分布式基本定義

    《分布式系統(tǒng)原理與范型》定義:
    “分布式系統(tǒng)是若干獨(dú)立計(jì)算機(jī)的集合,這些計(jì)算機(jī)對于用戶來說就像單個(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ù)庫操作。

    不過隨著系統(tǒng)越來越復(fù)雜,單一應(yīng)用架構(gòu)會變得難以維護(hù),所以架構(gòu)逐漸演變出了垂直應(yīng)用架構(gòu),所謂垂直應(yīng)用架構(gòu)其實(shí)就是安裝業(yè)務(wù)模板進(jìn)行拆分,比如可以安裝業(yè)務(wù)將一個(gè)電商系統(tǒng)分為訂單模塊,用戶信息管理模塊,商品管理模塊等等,這時(shí)候MVC框架就派上用場,MVC框架可以協(xié)助系統(tǒng)更好的按業(yè)務(wù)拆分,不過業(yè)務(wù)拆分后雖然是比單一應(yīng)用架構(gòu)更好維護(hù)了。

    不過隨著系統(tǒng)越來約復(fù)雜,發(fā)現(xiàn)很多共用的模塊很難復(fù)用起來,這時(shí)候分布式服務(wù)架構(gòu)登場了,分布式架構(gòu)是將一些核心業(yè)務(wù)抽取出來,作為獨(dú)立的服務(wù),逐漸形成穩(wěn)定的服務(wù)中心,當(dāng)應(yīng)用需要時(shí),就去服務(wù)中心調(diào)服務(wù)就可以,而實(shí)現(xiàn)這種服務(wù)注冊的肯定是RPC框架了。

    當(dāng)服務(wù)越來越多,容量的評估,小服務(wù)資源的浪費(fèi)等問題逐漸顯現(xiàn),此時(shí)需增加一個(gè)調(diào)度中心基于訪問壓力實(shí)時(shí)管理集群容量,提高集群利用率,這時(shí)候就需要流動計(jì)算架構(gòu)(SOA)[ Service Oriented Architecture],用于提高機(jī)器利用率的資源調(diào)度,SOA是一個(gè)治理中心,綜上所述,到目前,軟件系統(tǒng)架構(gòu)演變經(jīng)歷了:單一應(yīng)用架構(gòu)->垂直應(yīng)用架構(gòu)->分布式應(yīng)用架構(gòu)->流動計(jì)算架構(gòu),下面Dubbo官網(wǎng)的圖片可以很好的描述

    1.3、什么是RPC?

    RPC概念
    RPC【Remote Procedure Call】是指遠(yuǎn)程過程調(diào)用,是一種進(jìn)程間通信方式,他是一種技術(shù)的思想,而不是規(guī)范。它允許程序調(diào)用另一個(gè)地址空間(通常是共享網(wǎng)絡(luò)的另一臺機(jī)器上)的過程或函數(shù),而不用程序員顯式編碼這個(gè)遠(yuǎn)程調(diào)用的細(xì)節(jié)。

    RPC核心模塊
    RPC有兩個(gè)核心模塊:通信和序列化

    2、什么是Dubbo框架?

    2.1、Apache Dubbo 定義

    Apache Dubbo (incubating) |?d?b??| 是一款高性能、輕量級的開源Java RPC框架,它提供了三大核心能力:面向接口的遠(yuǎn)程方法調(diào)用,智能容錯(cuò)和負(fù)載均衡,以及服務(wù)自動注冊和發(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ù)注冊和發(fā)現(xiàn)的注冊中心

    • Minitor:統(tǒng)計(jì)服務(wù)調(diào)用次數(shù)和時(shí)間的監(jiān)控中心

    2.3、Apache Dubbo原理

    Dubbo的服務(wù)治理:

    Dubbo原理圖片,圖片來自Dubbo官網(wǎng):

    調(diào)用過程:

    下面根據(jù)我的理解說明一下

    • 0:服務(wù)器容器負(fù)責(zé)啟動、加載、運(yùn)行服務(wù)提供者

    • 1:服務(wù)提供者在啟動后就可以向注冊中心暴露服務(wù)

    • 2:服務(wù)消費(fèi)者在啟動后就可以向注冊中心訂閱想要的服務(wù)

    • 3:注冊中心向服務(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ù)載均衡來調(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)用底層通過 Dubbo 支持的通訊協(xié)議傳輸

    3.2、功能特性對比

    功能特征直接引用官網(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、啟動Nacos服務(wù)中心

    詳情可以參考官網(wǎng):https://nacos.io/zh-cn/docs/quick-start.html,需要先下載nacos服務(wù)端源碼,下載源碼后編譯啟動項(xiàng)目:

    window+R啟動cmd窗口,cd到nacos server的bin目錄,linux系統(tǒng)直接使用cd ${nacos_server_home}/bin

    ./startup.sh -m standalone

    window系統(tǒng)使用命令startup.cmd -m standalone

    啟動成功,訪問:http://127.0.0.1:8848/nacos,賬號密碼都是nacos

    登錄成功,來到主頁:

    7、服務(wù)提供者工程創(chuàng)建

    新建項(xiàng)目,使用阿里的service url:

    選擇jdk版本,打包方式:

    選擇組件:

    自動生成項(xiàng)目:加上@EnableDiscoveryClient支持服務(wù)注冊到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 { @Override public 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ù)提供者用逗號分隔# 這里訂閱"自己",會被忽略掉,請根據(jù)實(shí)際情況添加dubbo.cloud.subscribed-services=dubbo-provider-sample# dubbo 服務(wù)掃描基準(zhǔn)包dubbo.scan.base-packages=com.example.springcloud.provider
    # Actuator Web 訪問端口management.server.port=8082management.endpoints.jmx.exposure.include=*management.endpoints.web.exposure.include=*management.endpoint.health.show-details=always
    # 應(yīng)用服務(wù) WEB 訪問端口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)與注冊配置,其中子屬性 server-addr 指定 Nacos 服務(wù)器主機(jī)和端口spring.cloud.nacos.discovery.server-addr=127.0.0.1:8848# 注冊到 nacos 的指定 namespace,默認(rèn)為 publicspring.cloud.nacos.discovery.namespace=public

    啟動項(xiàng)目,到nacos服務(wù)查看服務(wù)

    8、服務(wù)消費(fèi)者工程創(chuàng)建

    新建一個(gè)dubbo-consumer-sample服務(wù)消費(fèi)者工程,創(chuàng)建過程和服務(wù)提供者工程一樣,不過配置需要進(jìn)行修改,避免端口沖突

    # 應(yīng)用名稱spring.application.name=dubbo-consumer-sample
    # 應(yīng)用服務(wù) WEB 訪問端口server.port=9090
    # Actuator Web 訪問端口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)與注冊配置,其中子屬性 server-addr 指定 Nacos 服務(wù)器主機(jī)和端口spring.cloud.nacos.discovery.server-addr=127.0.0.1:8848# 注冊到 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ù)提供者用逗號分隔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 {

    @DubboReference private 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測試接口使用命令curl,window直接到瀏覽器或者postman測試:

    curl http://127.0.0.1:9090/echo?message=nacosecho:nacos




    往期精彩推薦



    騰訊、阿里、滴滴后臺面試題匯總總結(jié) — (含答案)

    面試:史上最全多線程面試題 !

    最新阿里內(nèi)推Java后端面試題

    JVM難學(xué)?那是因?yàn)槟銢]認(rèn)真看完這篇文章


    END


    關(guān)注作者微信公眾號 —《JAVA爛豬皮》


    了解更多java后端架構(gòu)知識以及最新面試寶典


    你點(diǎn)的每個(gè)好看,我都認(rèn)真當(dāng)成了


    看完本文記得給作者點(diǎn)贊+在看哦~~~大家的支持,是作者源源不斷出文的動力


    作者:SmileNicky

    出處:https://www.cnblogs.com/mzq123/p/14831158.html


    瀏覽 62
    點(diǎn)贊
    評論
    收藏
    分享

    手機(jī)掃一掃分享

    分享
    舉報(bào)
    評論
    圖片
    表情
    推薦
    點(diǎn)贊
    評論
    收藏
    分享

    手機(jī)掃一掃分享

    分享
    舉報(bào)

    <kbd id="5sdj3"></kbd>
    <th id="5sdj3"></th>

  • <dd id="5sdj3"><form id="5sdj3"></form></dd>
    <td id="5sdj3"><form id="5sdj3"><big id="5sdj3"></big></form></td><del id="5sdj3"></del>

  • <dd id="5sdj3"></dd>
    <dfn id="5sdj3"></dfn>
  • <th id="5sdj3"></th>
    <tfoot id="5sdj3"><menuitem id="5sdj3"></menuitem></tfoot>

  • <td id="5sdj3"><form id="5sdj3"><menu id="5sdj3"></menu></form></td>
  • <kbd id="5sdj3"><form id="5sdj3"></form></kbd>
    性爱AV网 | 国产麻豆传媒视频 | 五月综合色网 | 男插女视频网站 | 免费黄色视频日本 |