一分鐘入門Dubbo

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");
    }
}

如今配置基本完成,如今啓動看看效果

 

相關閱讀

Zookeeper 集羣搭建

爲何使用ActiveMQ集羣

玩轉ActiveMQ集羣

▼長按如下二維碼便可關注▼

 

相關文章
相關標籤/搜索