<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

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

          共 7471字,需瀏覽 15分鐘

           ·

          2021-06-10 03:19

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

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


          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 standalone

          window系統(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 { @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ù)提供者用逗號(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 {

          @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測(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)真看完這篇文章


          END


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


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


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


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


          作者:SmileNicky

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


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

          手機(jī)掃一掃分享

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

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  色老板操逼 | 亚洲精品久久久久久久久久久久久久 | 91久久人澡人妻人人做人精品 | 欧美,日本,a片 | 操逼视频a片|