Dubbo 快速入门教程
文章目錄
- 一、Apache Dubbo概述
- 1. Dubbo簡介
- 2. Dubbo架構(gòu)
- 二、Dubbo快速入門
- 1.創(chuàng)建兩個maven工程,添加web
- 2. 配置dubbodemo_provider
- 3. 配置dubbodemo_consumer
一、Apache Dubbo概述
1. Dubbo簡介
Apache Dubbo是一款高性能的Java RPC框架。
它是阿里巴巴公司開源的、輕量級的開源Java RPC框架,可以和Spring框架無縫集成,2018年阿里巴巴把這個框架捐獻給了apache基金會。
Dubbo提供了三大核心能力:面向接口的遠程方法調(diào)用,智能容錯和負載均衡,以及服務自動注冊和發(fā)現(xiàn)。
什么是RPC?
RPC全稱為remote procedure call,即遠程過程調(diào)用。它并不是一個具體的技術(shù),而是指整個網(wǎng)絡(luò)遠程調(diào)用過程。
RPC是一個泛化的概念,嚴格來說一切遠程過程調(diào)用手段都屬于RPC范疇。各種開發(fā)語言都有自己的RPC框架。Java中的RPC框架比較多,廣泛使用的有RMI、Hessian、Dubbo等。
比如:兩臺服務器A和B,A服務器上部署一個應用,B服務器上部署一個應用,A服務器上的應用想調(diào)用B服務器上的應用提供的方法,由于兩個應用不在一個內(nèi)存空間,不能直接調(diào)用,所以需要通過網(wǎng)絡(luò)來表達調(diào)用的語義和傳達調(diào)用的數(shù)據(jù)。
2. Dubbo架構(gòu)
Dubbo架構(gòu)圖如下:
虛線都是異步訪問,實線都是同步訪問
藍線: 在啟動時要完成的功能
紅線: 在程序運行過程中要執(zhí)行的功能
| Provider | 暴露服務的服務提供方 |
| Consumer | 調(diào)用遠程服務的服務消費方 |
| Registry | 服務注冊與發(fā)現(xiàn)的注冊中心 |
| Monitor | 統(tǒng)計服務的調(diào)用次調(diào)和調(diào)用時間的監(jiān)控中心 |
| Container | 服務運行容器 |
| 0 | 服務容器負責啟動,加載,運行服務提供者 |
| 1 | 服務提供者在啟動時,向注冊中心注冊自己提供的服務 |
| 2 | 服務消費者在啟動時,向注冊中心訂閱自己所需的服務 |
| 3 | 注冊中心將服務提供者地址列表提供給消費者。如果地址有變更,注冊中心將基于長連接推送變更數(shù)據(jù)給消費者 |
| 4 | 基于軟負載均衡算法,選一臺提供者給消費者進行調(diào)用。如果調(diào)用失敗了,則再選另一臺給消費者調(diào)用 |
| 5 | 服務消費者和提供者,在內(nèi)存中累計調(diào)用次數(shù)和調(diào)用時間,定時每分鐘發(fā)送一次統(tǒng)計數(shù)據(jù)到監(jiān)控中心 |
二、Dubbo快速入門
Dubbo作為一個RPC框架,其最核心的功能就是要實現(xiàn)跨網(wǎng)絡(luò)的遠程調(diào)用。
演示案例:一個作為服務的提供方,一個作為服務的消費方。通過Dubbo來實現(xiàn)服務消費方遠程調(diào)用服務提供方的方法。
前提:必須先安裝好Zookeper,并且啟動后才能演示案例
-Zookeper可以作為一個注冊中心,將消費者和提供者注冊到里面,并實現(xiàn)消費者使用提供者提供的業(yè)務。
1.創(chuàng)建兩個maven工程,添加web
提供者:dubbodemo_provider
消費者:dubbodemo_consumer
2. 配置dubbodemo_provider
2.1 在dubbodemo_provider的pom.xml文件導入坐標
<properties><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding><maven.compiler.source>1.8</maven.compiler.source><maven.compiler.target>1.8</maven.compiler.target><spring.version>5.0.5.RELEASE</spring.version> </properties><dependencies><dependency><groupId>org.springframework</groupId><artifactId>spring-context</artifactId><version>${spring.version}</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-beans</artifactId><version>${spring.version}</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-webmvc</artifactId><version>${spring.version}</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-jdbc</artifactId><version>${spring.version}</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-aspects</artifactId><version>${spring.version}</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-jms</artifactId><version>${spring.version}</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-context-support</artifactId><version>${spring.version}</version></dependency><dependency><groupId>com.alibaba</groupId><artifactId>dubbo</artifactId><version>2.6.0</version></dependency><dependency><groupId>org.apache.zookeeper</groupId><artifactId>zookeeper</artifactId><version>3.4.7</version></dependency><dependency><groupId>com.github.sgroschupf</groupId><artifactId>zkclient</artifactId><version>0.1</version></dependency><dependency><groupId>javassist</groupId><artifactId>javassist</artifactId><version>3.12.1.GA</version></dependency><dependency><groupId>com.alibaba</groupId><artifactId>fastjson</artifactId><version>1.2.47</version></dependency></dependencies><build><plugins><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-compiler-plugin</artifactId><version>3.8.0</version><configuration><source>1.8</source><target>1.8</target></configuration></plugin><!-- 配置tomcat插件 --><plugin><groupId>org.apache.tomcat.maven</groupId><artifactId>tomcat7-maven-plugin</artifactId><configuration> <!-- 指定端口 --><port>8081</port> <!-- 請求路徑 --><path>/</path></configuration></plugin></plugins></build>2.2 配置web.xml文件
<display-name>Archetype Created Web Application</display-name><context-param><param-name>contextConfigLocation</param-name><param-value>classpath:applicationContext*.xml</param-value></context-param><listener><listener-class>org.springframework.web.context.ContextLoaderListener</listener-class></listener>2.3 創(chuàng)建服務接口
public interface HelloService {public String hello(String name); }2.4 創(chuàng)建接口實現(xiàn)類
@Service //注解是用dubbo包中的 public class HelloServiceImpl implements HelloService {@Overridepublic String hello(String name) {return "hello:+"+name;} }2.5 在resource文件夾中創(chuàng)建spring配置文件:applicationContext-service.xml
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:p="http://www.springframework.org/schema/p"xmlns:context="http://www.springframework.org/schema/context"xmlns:dubbo="http://code.alibabatech.com/schema/dubbo"xmlns:mvc="http://www.springframework.org/schema/mvc"xsi:schemaLocation="http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/mvchttp://www.springframework.org/schema/mvc/spring-mvc.xsdhttp://code.alibabatech.com/schema/dubbohttp://code.alibabatech.com/schema/dubbo/dubbo.xsdhttp://www.springframework.org/schema/contexthttp://www.springframework.org/schema/context/spring-context.xsd"><!-- 當前應用名稱,用于注冊中心計算應用間依賴關(guān)系,注意:消費者和提供者應用名不要一樣 --><dubbo:application name="dubbodemo_provider"/><!-- 連接服務注冊中心zookeeper ip為zookeeper所在服務器的ip地址--><dubbo:registry address="zookeeper://192.168.215.128:2181"/><!-- 注冊 協(xié)議和port 端口默認20880 --><dubbo:protocol name="dubbo" port="20881"></dubbo:protocol><!-- 掃描指定包,加入@Service注解的類會被發(fā)布為服務 --><dubbo:annotation package="com.demo.service.impl"/> </beans>2.6 啟動服務
3. 配置dubbodemo_consumer
3.1 在dubbodemo_consumer的pom.xml文件導入坐標
<properties><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding><maven.compiler.source>1.8</maven.compiler.source><maven.compiler.target>1.8</maven.compiler.target><spring.version>5.0.5.RELEASE</spring.version> </properties> <dependencies><dependency><groupId>org.springframework</groupId><artifactId>spring-context</artifactId><version>${spring.version}</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-beans</artifactId><version>${spring.version}</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-webmvc</artifactId><version>${spring.version}</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-jdbc</artifactId><version>${spring.version}</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-aspects</artifactId><version>${spring.version}</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-jms</artifactId><version>${spring.version}</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-context-support</artifactId><version>${spring.version}</version></dependency><dependency><groupId>com.alibaba</groupId><artifactId>dubbo</artifactId><version>2.6.0</version></dependency><dependency><groupId>org.apache.zookeeper</groupId><artifactId>zookeeper</artifactId><version>3.4.7</version></dependency><dependency><groupId>com.github.sgroschupf</groupId><artifactId>zkclient</artifactId><version>0.1</version></dependency><dependency><groupId>javassist</groupId><artifactId>javassist</artifactId><version>3.12.1.GA</version></dependency><dependency><groupId>com.alibaba</groupId><artifactId>fastjson</artifactId><version>1.2.47</version></dependency></dependencies><build><plugins><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-compiler-plugin</artifactId><version>3.8.0</version><configuration><source>1.8</source><target>1.8</target></configuration></plugin><plugin><groupId>org.apache.tomcat.maven</groupId><artifactId>tomcat7-maven-plugin</artifactId><configuration><!-- 指定端口 --><port>8082</port> <!-- 請求路徑 --><path>/</path></configuration></plugin></plugins></build>3.2 配置web.xml文件
<display-name>Archetype Created Web Application</display-name><servlet><servlet-name>springmvc</servlet-name><servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class><!-- 指定加載的配置文件 ,通過參數(shù)contextConfigLocation加載 --><init-param><param-name>contextConfigLocation</param-name><param-value>classpath:applicationContext-web.xml</param-value></init-param><load-on-startup>1</load-on-startup></servlet><servlet-mapping><servlet-name>springmvc</servlet-name><url-pattern>*.do</url-pattern></servlet-mapping>3.3 創(chuàng)建服務接口
public interface HelloService {public String hello(String name); }3.4 創(chuàng)建Controller控制器
@RestController @RequestMapping("demo") public class HelloController {@Reference //引入dubbo的注入,spring的@Autowiredb不行private HelloService helloService;@RequestMapping("/hello")public String hello(String name){String hello = helloService.hello(name);return hello;} }3.5 在resource文件夾中創(chuàng)建spring配置文件:applicationContext-web.xml
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:p="http://www.springframework.org/schema/p"xmlns:context="http://www.springframework.org/schema/context"xmlns:dubbo="http://code.alibabatech.com/schema/dubbo"xmlns:mvc="http://www.springframework.org/schema/mvc"xsi:schemaLocation="http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/mvchttp://www.springframework.org/schema/mvc/spring-mvc.xsdhttp://code.alibabatech.com/schema/dubbohttp://code.alibabatech.com/schema/dubbo/dubbo.xsdhttp://www.springframework.org/schema/contexthttp://www.springframework.org/schema/context/spring-context.xsd"><!-- 當前應用名稱,用于注冊中心計算應用間依賴關(guān)系,注意:消費者和提供者應用名不要一樣 --><dubbo:application name="dubbodemo_consumer"/><!-- 連接服務注冊中心zookeeper ip為zookeeper所在服務器的ip地址--><dubbo:registry address="zookeeper://192.168.215.128:2181"/><!-- 掃描指定包,加入@Service注解的類會被發(fā)布為服務 --><dubbo:annotation package="com.demo.controller"/> </beans>3.6 啟動服務
在瀏覽器輸入http://localhost:8082/demo/hello.do?name=Jack
查看瀏覽器輸出結(jié)果:hello:Jack
總結(jié)
以上是生活随笔為你收集整理的Dubbo 快速入门教程的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: POJ 1308 Is It A Tr
- 下一篇: 为什么SimpleDateFormat不