Dubbo是什麼?能作什麼?html
Dubbo是一個分佈式服務框架,以及SOA治理方案。其功能主要包括:高性能NIO通信及多協議集成,服務動態尋址與路由,軟負載均衡與容錯,依賴分析與降級等。java
Dubbo適用於哪些場景?git
當網站變大後,不可避免的須要拆分應用進行服務化,以提升開發效率,調優性能,節省關鍵競爭資源等。github
當服務愈來愈多時,服務的URL地址信息就會爆炸式增加,配置管理變得很是困難,硬件負載均衡器的單點壓力也愈來愈大。web
當進一步發展,服務間依賴關係變得錯綜複雜,甚至分不清哪一個應用要在哪一個應用以前啓動,架構師都不能完整的描述應用的架構關係。算法
接着,服務的調用量愈來愈大,服務的容量問題就暴露出來,這個服務須要多少機器支撐?何時該加機器?等等spring
在遇到這些問題時,均可以用Dubbo來解決。
可參見如下連接http://dubbo.apache.org/books/dubbo-user-book/preface/background.htmlapache
Dubbo性能如何?spring-mvc
Dubbo經過長鏈接減小握手,經過NIO及線程池在單鏈接上併發包處理消息,經過二進制流壓縮數據,比常規HTTP等短鏈接協議更快,在阿里巴巴內部,天天支撐2000多個服務,30多億訪問量,最大單機支撐天天近1億訪問量。tomcat
可參見如下連接http://dubbo.apache.org/books/dubbo-user-book/perf-test.html
Dubbo架構
節點角色說明
節點 | 角色說明 |
---|---|
Provider | 暴露服務的服務提供方 |
Consumer | 調用遠程服務的服務消費方 |
Registry | 服務註冊與發現的註冊中心 |
Monitor | 統計服務的調用次數和調用時間的監控中心 |
Container | 服務運行容器 |
調用關係說明
1.服務容器負責啓動、加載、運行服務提供者。
2.服務提供者在啓動時,向註冊中心註冊本身提供的服務
3.服務消費者在啓動時,向註冊中心訂閱本身所需的服務。
4.註冊中心返回服務提供者地址列表給消費者,若是有變動,註冊中心將基於長鏈接推送給消費者。
5.服務消費者,從提供者地址列表中,基於軟負載均衡算法,選一臺提供者進行調用,若是調用失敗,再選另外一臺調用。
6.服務消費者和提供者,在內存中累計調用次數和調用時間,定時每分鐘發送一次統計數據到監控中心。
快速入門案例
提供者(Provider)服務代碼
新建maven項目引入相關jar
pom.xml 引入spring 和dubbo相關jar
<properties> <spring.version>4.2.4.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> <!--dubbo相關--> <dependency> <groupId>com.alibaba</groupId> <artifactId>dubbo</artifactId> <version>2.5.7</version> </dependency> <dependency> <groupId>org.apache.zookeeper</groupId> <artifactId>zookeeper</artifactId> <version>3.4.10</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.11.0.GA</version> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <version>2.3.2</version> <configuration> <source>1.7</source> <target>1.7</target> </configuration> </plugin> <plugin> <groupId>org.apache.tomcat.maven</groupId> <artifactId>tomcat7-maven-plugin</artifactId> <configuration> <port>8081</port> <path>/</path> </configuration> </plugin> </plugins> </build>
配置web.xml
<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>
配置applicatinsContext.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:dubbo="http://code.alibabatech.com/schema/dubbo" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd http://code.alibabatech.com/schema/dubbo http://code.alibabatech.com/schema/dubbo/dubbo.xsd"> <!--dubbo應用中心 一般項目名--> <dubbo:application name="dubbo_service"/> <!--配置dubbo註冊中心 這裏zk註冊中心,須要提早啓動zk--> <dubbo:registry address="zookeeper://192.168.16.199:2181"/> <!--包掃描--> <dubbo:annotation package="com.muzidao.dubbo.service.impl"/> </beans>
配置服務接口,這個接口須要提供給消費者,能夠經過打成jar包或複製到消費者服務代碼中
public interface HelloService { public String sysHello(String name); }
配置實現接口類
import com.alibaba.dubbo.config.annotation.Service; import com.muzidao.dubbo.service.HelloService; /** * 服務實現類 * @author: astali */ //特別須要注意的地方,這個@Service再也不是Spring,而是dubbo @Service public class HelloServiceImpl implements HelloService { @Override public String sysHello(String name) { System.out.println("我是dubbo服務接口實現者。"); return "Hello 木子道 ,歡迎關注" + name; } }
配置消費者(Consumer)服務代碼
pom.xml跟提供者同樣
配置web.xml
<servlet> <servlet-name>springmvc</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <init-param> <param-name>contextConfigLocation</param-name> <param-value>classpath:springmvc.xml</param-value> </init-param> </servlet> <servlet-mapping> <servlet-name>springmvc</servlet-name> <url-pattern>*.action</url-pattern> </servlet-mapping>
配置springmvc.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:mvc="http://www.springframework.org/schema/mvc" xmlns:dubbo="http://code.alibabatech.com/schema/dubbo" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd http://code.alibabatech.com/schema/dubbo http://code.alibabatech.com/schema/dubbo/dubbo.xsd"> <mvc:annotation-driven> <mvc:message-converters register-defaults="false"> <bean class="org.springframework.http.converter.StringHttpMessageConverter"> <constructor-arg value="UTF-8"/> </bean> </mvc:message-converters> </mvc:annotation-driven> <!--dubbo應用中心 一般項目名--> <dubbo:application name="dubbo_consumer"/> <!--配置dubbo註冊中心 需提早啓動zk--> <dubbo:registry address="zookeeper://192.168.16.199:2181"/> <!--包掃描 --> <dubbo:annotation package="com.muzidao.dubbo.controller"/> </beans>
配置消費者消費代碼
package com.muzidao.dubbo.controller; import com.alibaba.dubbo.config.annotation.Reference; import com.muzidao.dubbo.service.HelloService; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; /** * @author: astali * Created by Administrator on 2018/5/3 17:25 */ @RestController @RequestMapping("/dubbo") public class HelloController { //須要注意這裏是引用dubbo引入註解 @Reference private HelloService helloService; //這個HelloService其實就是提供者的那個接口, 這裏我這是把接口複製到這個項目中,實際上是能夠打成jar引入進來。 @RequestMapping("/hello") public String hello(){ System.out.println("--木子道--正在說 -- Hello" ); return helloService.sysHello("dubbo"); } }
如今配置基本完成,如今啓動看看效果
相關閱讀
▼長按如下二維碼便可關注▼