日日操夜夜添-日日操影院-日日草夜夜操-日日干干-精品一区二区三区波多野结衣-精品一区二区三区高清免费不卡

公告:魔扣目錄網為廣大站長提供免費收錄網站服務,提交前請做好本站友鏈:【 網站目錄:http://www.ylptlb.cn 】, 免友鏈快審服務(50元/站),

點擊這里在線咨詢客服
新站提交
  • 網站:51998
  • 待審:31
  • 小程序:12
  • 文章:1030137
  • 會員:747

導讀:在分布式系統中,遠程調用是最基礎也是最重要的基石。歷史上,曾經先后出現過 CORBA、RMI、EJB、WebService 等技術和規范,在服務化以及微服務日趨流行的今天,更多的被廣泛使用的是包括 gRPC、Finagle、以及國內的 Dubbo 為代表的輕量級框架。

由于這些框架多半與服務注冊中心、配置中心等配套設施結合使用,用來作為系統分布式服務化的場景,因此這類框架又被統稱為服務框架。本文將以 Dubbo 為例,介紹如何快速開發一個 Dubbo 應用。

背景

本文將以 Dubbo 為例,介紹如何快速開發一個 Dubbo 應用。為了便于讀者理解:

首先會介紹一下傳統的 RMI 的基本概念

然后比較下現代的 RPC 框架與 RMI 的區別

再基于 Dubbo 提供的 API 展示最基本的 Dubbo 應用如何開發

最后介紹如何通過 start.dubbo.io 快速搭建 Dubbo 的腳手架工程

JAVA RMI 簡介

Java RMI (Remote Method Invocation) 遠程方法調用,能夠讓客戶端像使用本地調用一樣調用服務端 Java 虛擬機中的對象方法。RMI 是面向對象語言領域對 RPC (Remote Procedure Call)的完善,用戶無需依靠 IDL 的幫助來完成分布式調用,而是通過依賴接口這種更簡單自然的方式。

Java RMI 工作原理

一個典型的 RMI 調用如下圖所示:

服務端向 RMI 注冊服務綁定自己的地址;

客戶端通過 RMI 注冊服務獲取目標地址;

客戶端調用本地的 Stub 對象上的方法,和調用本地對象上的方法一致;

本地存根對象將調用信息打包,通過網絡發送到服務端;

服務端的 Skeleton 對象收到網絡請求之后,將調用信息解包;

然后找到真正的服務對象發起調用,并將返回結果打包通過網絡發送回客戶端。

教你如何快速開發一個Dubbo應用

 

Java RMI 基本概念

Java RMI 是 Java 領域創建分布式應用的技術基石。后續的 EJB 技術,以及現代的分布式服務框架,其中的基本理念依舊是 Java RMI 的延續。在 RMI 調用中,有以下幾個核心的概念:

通過接口進行遠程調用

通過客戶端的 Stub 對象和服務端的 Skeleton 對象的幫助將遠程調用偽裝成本地調用

通過 RMI 注冊服務完成服務的注冊和發現

對于第一點,客戶端需要依賴接口,而服務端需要提供該接口的實現。對于第二點,在 J2SE 1.5 版本之前需要通過 rmic 預先編譯好客戶端的 Stub 對象和服務端的 Skeleton 對象。在之后的版本中,不再需要事先生成 Stub 和 Skeleton 對象。

下面通過示例代碼簡單的展示 RMI 中的服務注冊和發現:

服務端的服務注冊

教你如何快速開發一個Dubbo應用

 

說明:

初始化服務對象實例;

通過 UnicastRemoteObject.exportObject 生成可以與服務端通訊的 Stub 對象;

創建一個本地的 RMI 注冊服務,監聽端口為 1099。該注冊服務運行在服務端,也可以單獨啟動一個注冊服務的進程;

將 Stub 對象綁定到注冊服務上,這樣,客戶端可以通過 Hello 這個名字查找到該遠程對象。

客戶端的服務發現

教你如何快速開發一個Dubbo應用

 

說明:

獲取注冊服務實例,在本例中,由于沒有傳入任何參數,假定要獲取的注冊服務實例部署在本機,并監聽在 1099 端口上;

從注冊服務中查找服務名為 Hello 的遠程對象;

通過獲取的 Stub 對象發起一次 RMI 調用并獲得結果。

理解 RMI 的工作原理和基本概念,對掌握現代分布式服務框架很有幫助,建議進一步的閱讀 RMI 官方教材 [1]。

Dubbo 基本概念

現代的分布式服務框架的基本概念與 RMI 是類似的,同樣是使用 Java 的 Interface 作為服務契約,通過注冊中心來完成服務的注冊和發現,遠程通訊的細節也是通過代理類來屏蔽。具體來說,Dubbo 在工作時有以下四個角色參與:

服務提供者:啟動時在指定端口上暴露服務,并將服務地址和端口注冊到注冊中心上。

服務消費者:啟動時向注冊中心訂閱自己感興趣的服務,以便獲得服務提供方的地址列表。

注冊中心 :負責服務的注冊和發現,負責保存服務提供方上報的地址信息,并向服務消費方推送。

監控中心:負責收集服務提供方和消費方的運行狀態,比如服務調用次數、延遲等,用于監控。

運行容器:負責服務提供方的初始化、加載以及運行的生命周期管理。

教你如何快速開發一個Dubbo應用

 

部署階段

服務提供者在指定端口暴露服務,并向注冊中心注冊服務信息。

服務消費者向注冊中心發起服務地址列表的訂閱。

運行階段

注冊中心向服務消費者推送地址列表信息。

服務消費者收到地址列表后,從其中選取一個向目標服務發起調用。

調用過程服務消費者和服務提供者的運行狀態上報給監控中心。

基于 API 的 Dubbo 應用

Dubbo 的應用一般都是通過 Spring 來組裝的。為了快速獲得一個可以工作的 Dubbo 應用,這里的示例摒棄了復雜的配置,而改用面向 Dubbo API 的方式來構建服務提供者和消費者,另外,注冊中心和監控中心在本示例中也不需要安裝和配置。

在生產環境,Dubbo 的服務需要一個分布式的服務注冊中心與之配合,比如,ZooKeeper。為了方便開發,Dubbo 提供了直連[2]以及組播[3]兩種方式,從而避免額外搭建注冊中心的工作。在本例中,將使用組播的方式來完成服務的注冊和發現。

定義服務契約

教你如何快速開發一個Dubbo應用

 

說明:

定義了一個簡單的服務契約 GreetingsService,其中只有一個方法 sayHi 可供調用,入參是 String 類型,返回值也是 String 類型。

提供契約的實現

教你如何快速開發一個Dubbo應用

 

說明:

服務提供者需要實現服務契約 GreetingsService 接口。

該實現簡單的返回一個歡迎信息,如果入參是 dubbo,則返回 hi, dubbo。

實現 Dubbo 服務提供方

教你如何快速開發一個Dubbo應用

 

說明:

創建一個 ServiceConfig 的實例,泛型參數信息是服務接口類型,即 GreetingsService。

生成一個 AplicatonConfig 的實例,并將其裝配進 ServiceConfig。

生成一個 RegistryConfig 實例,并將其裝配進 ServiceConfig,這里使用的是組播方式,參數是 multicast://224.5.6.7:1234。合法的組播地址范圍為:224.0.0.0 - 239.255.255.255

將服務契約 GreetingsService 裝配進 ServiceConfig。

將服務提供者提供的實現 GreetingsServiceImpl 的實例裝配進 ServiceConfig。

ServiceConfig 已經具備足夠的信息,開始對外暴露服務,默認監聽端口是 20880。

為了防止服務端退出,按任意鍵或者 ctrl-c 退出。

實現 Dubbo 服務調用方

教你如何快速開發一個Dubbo應用

 

說明:

創建一個 ReferenceConfig 的實例,同樣,泛型參數信息是服務接口類型,即 GreetingService。

生成一個 AplicatonConfig 的實例,并將其裝配進 ReferenceConfig。

生成一個 RegistryConfig 實例,并將其裝配進 ReferenceConfig,注意這里的組播地址信息需要與服務提供方的相同。

將服務契約 GreetingsService 裝配進 ReferenceConfig。

從 ReferenceConfig 中獲取到 GreetingService 的代理。

通過 GreetingService 的代理發起遠程調用,傳入的參數為 dubbo。

打印返回結果 hi, dubbo。

運行

由于配置了 exec-maven-plugin,可以很方便的在命令行下通過 maven 的方式執行。當然,您也可以在 IDE 里直接執行,但是需要注意的是,由于使用了組播的方式來發現服務,運行時需要指定:

-Djava.net.preferIPv4Stack=true。

★ 構建示例

通過以下的命令來同步示例代碼并完成構建:

同步代碼:git clone https://github.com/dubbo/dubbo-samples.git

構建:mvn clean package

教你如何快速開發一個Dubbo應用

 

當看到 BUILD SUCCESS 的時候表明構建完成,下面就可以開始進入運行階段了。

★ 運行服務端

通過運行以下的 maven 命令來啟動服務提供者:

教你如何快速開發一個Dubbo應用

 

當 first-dubbo-provider is running. 出現時,代表服務提供者已經啟動就緒,等待客戶端的調用。

★ 運行客戶端

通過運行以下的 maven 命令來調用服務:

教你如何快速開發一個Dubbo應用

 

可以看到, hi, dubbo 是從服務提供者返回的執行結果。

快速生成 Dubbo 應用

Dubbo 還提供了一個公共服務快速搭建基于 Spring Boot 的 Dubbo 應用。訪問 http://start.dubbo.io 并按照下圖所示來生成示例工程:

教你如何快速開發一個Dubbo應用

 

說明:

在 Group 中提供 maven groupId,默認值是 com.example。

在 Artifact 中提供 maven artifactId,默認值是 demo。

在 DubboServiceName 中提供服務名,默認值是 com.example.HelloService。

在 DubboServiceVersion 中提供服務的版本,默認值是 1.0.0。

在 Client/Server 中選取本次構建的工程是服務提供者 (Server) 還是服務消費者 (Client),默認值是 server。

使用 embeddedZookeeper 作為服務注冊發現,默認為勾選。

是否激活 qos 端口,默認為不勾選,如果勾選可以通過 22222 端口訪問。

點擊 Generate Project 即可下載生成好的工程。

在本例中展示的是服務提供者,同樣的,通過在生成界面選取 client 來生成對應的服務消費者。

★ 運行

用 IDE 打開生成好的工程,可以發現應用是一個典型的 Spring Boot 應用。程序的入口如下所示:

教你如何快速開發一個Dubbo應用

 

說明:

在 2181 端口上啟動嵌入式 ZooKeeper。

啟動 Spring Boot 上下文。

可以直接在 IDE 中運行,輸出結果如下:

2018-05-28 16:59:38.072 INFO 59943 --- [ main] a.b.d.c.e.WelcomeLogoApplicationListener :

:: Dubbo Spring Boot (v0.1.0) : https://github.com/dubbo/dubbo-spring-boot-project

:: Dubbo (v2.0.1) : https://github.com/alibaba/dubbo

:: google group : http://groups.google.com/group/dubbo

...

2018-05-28 16:59:39.624 INFO 59943 --- [ main] com.example.demo.DemoApplication : Started DemoApplication in 1.746 seconds (JVM running for 2.963)

說明:

輸出中打印的以 dubbo. 開頭的配置信息,定義在 main/resources/application.properties 中。

★ 通過 Telnet 管理服務

生成工程的時候如果選擇了激活 qos 的話,就可以通過 telnet 或者 nc 來管理服務、查看服務狀態。

教你如何快速開發一個Dubbo應用

 

目前 qos 支持以下幾個命令,更詳細的信息請查閱官方文檔[4]:

ls:列出消費者、提供者信息

online:上線服務

offline:下線服務

help:聯機幫助

總結

在本文中,從 RMI 開始,介紹了 Java 領域分布式調用的基本概念,也就是基于接口編程、通過代理將遠程調用偽裝成本地、通過注冊中心完成服務的注冊和發現。

然后為了簡單起見,使用簡單的組播注冊方式和直接面向 Dubbo API 編程的方式介紹了如何開發一個 Dubbo 的完整應用。深入的了解 ServiceConfig 和 ReferenceConfig 的用法,對于進一步的使用 Spring XML 配置、乃至 Spring Boot 的編程方式有這很大的幫助。

最后,簡單的介紹了如何通過 Dubbo 團隊提供的公共服務 start.dubbo.io 快速搭建基于 Spring Boot 的 Dubbo 應用,并通過 qos 來做 Dubbo 服務的簡單運維。

分享到:
標簽:Dubbo
用戶無頭像

網友整理

注冊時間:

網站:5 個   小程序:0 個  文章:12 篇

  • 51998

    網站

  • 12

    小程序

  • 1030137

    文章

  • 747

    會員

趕快注冊賬號,推廣您的網站吧!
最新入駐小程序

數獨大挑戰2018-06-03

數獨一種數學游戲,玩家需要根據9

答題星2018-06-03

您可以通過答題星輕松地創建試卷

全階人生考試2018-06-03

各種考試題,題庫,初中,高中,大學四六

運動步數有氧達人2018-06-03

記錄運動步數,積累氧氣值。還可偷

每日養生app2018-06-03

每日養生,天天健康

體育訓練成績評定2018-06-03

通用課目體育訓練成績評定