dubbo入门简单学习

Dubbo简介

  • Apache Dubbo是一款高性能的java RPC框架,其前身是阿里巴巴公司开源的一个高性能,轻量级的开源java RPC框架,可以和Spring框架无缝集成。
RPC简介
  • RPC全称为remote procedure call,即远程过程调用,比如两台服务器A和B,A服务器上部署一个应用,B服务器上部署一个应用,A服务器上的应用想要调用B服务器上的应用提供的方法,由于两个应用不在一个内存空间,不能直接调用,所以需要通过网络来表达调用的语义和传达调用的数据。需要注意的是RPC并不是一个具体的技术,而是指整个网络远程调用的过程。各种开发语言都有自己的RPC框架,java中的RPC框架等比较多,广泛使用的有RMI、Hessian、Dubbo等。Dubbo提供了三大核心能力:面向接口的远程方法调用,智能容错和负载均衡,以及服务自动注册和发现。
Dubbo组成
  • 主要由一下几部分构成。暴露服务的服务提供方(Provider),调用远程服务的服务消费方(Consumer),服务注册与发现的注册中心(Registry),统计服务的调用次数和调用时间的监控中心(Monitor),服务运行容器(Container),服务提供方需要运行在容器中,提供方到注册中心注册,消费方到服务中心订阅,调用提供方提供的内容。下图中的虚线都是异步访问,实线都是同步访问,蓝色虚线表示在启动时完成的功能,红色线都是程序运行过程中执行的功能。

服务注册中心zookeeper在windows下的安装

  • zookeeper是apache hadoop的子项目,是一个树形的目录服务,支持变更推送,适合作为dubbo服务的注册中心,工业强度较高,可用于生产环境。
  • https://zookeeper.apache.org/releases.html 下载安装包
  • 解压到安装目录,进入解压的文件夹,新建一个data目录和log目录。进入conf目录找到zoo_sample.cfg文件,复制一份,重命名为zoo.cfg。将dataDir设置为新建的data目录的路径,新增一个dataLogDir设置为新建的log目录。


  • 进入bin目录,点击zkServer.cmd运行,点击zkCli.cmd运行,出现如下界面即算成功
我在开始安装时,安装的是最新的3.6版本,无法运行窗口一闪而过,于是重新下载的3.5.8-bin就可以正常运行。

入门实操

  • 需要导入spring及web框架的jar包,然后就是dubbo和zookeeper(服务注册中心)相关jar包
<dependency>
      <groupId>com.alibaba</groupId>
      <artifactId>dubbo</artifactId>
      <version>2.5.3</version>
    </dependency>
    <dependency>
      <groupId>org.apache.zookeeper</groupId>
      <artifactId>zookeeper</artifactId>
      <version>3.4.6</version>
      <type>pom</type>
    </dependency>
    <dependency>
      <groupId>com.github.sgroschupf</groupId>
      <artifactId>zkclient</artifactId>
      <version>0.1</version>
    </dependency>
  • 导入tomcat插件
<plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-compiler-plugin</artifactId>
        <version>2.3.2</version>
        <configuration>
          <source>1.8</source>
          <target>1.8</target>
        </configuration>
      </plugin>
      <plugin>
        <groupId>org.apache.tomcat.maven</groupId>
        <artifactId>tomcat7-maven-plugin</artifactId>
        <version>2.2</version>
        <configuration>
          <!--            指定端口-->
          <port>8082</port>
          <!--            请求路径-->
          <path>/</path>
        </configuration>
      </plugin>
  • 注意:千万不要把该插件放在pluginManagement标签中,该标签负责管理插件,不会下载,只需要放在下的下就可以了
  • 编辑配置,为每个模块配置tomcat


服务提供方编写
  • 在建好的项目中编写一个service的接口与实现类,注意注解是dubbo的而不是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:dubbo="http://code.alibabatech.com/schema/dubbo"
       xsi:schemaLocation="
       http://www.springframework.org/schema/beans
       http://www.springframework.org/schema/beans/spring-beans.xsd
       http://code.alibabatech.com/schema/dubbo
       http://code.alibabatech.com/schema/dubbo/dubbo.xsd">

<!--    当前应用名称,用于注册中心计算应用间依赖关系,消费者与提供者应用名不要一样-->
    <dubbo:application name="dubbodemo_provider"/>
<!--    连接服务注册中心zookeeper,ip为zookeeper服务器所在ip地址-->
    <dubbo:registry address="zookeeper://192.168.1.107:2181"/>
<!--    注册协议和port 端口默认是20880-->
    <dubbo:protocol name="dubbo" port="20880"/>
<!--    扫描指定包,加入@Service注解的类会被发布为服务-->
    <dubbo:annotation package="com.cdut.service.impl"/>

</beans>
  • 配置web.xml文件,设置监听器,当服务器启动就读取配置文件并生成容器
<web-app>
  <display-name>Archetype Created Web Application</display-name>
  
  <context-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>classpath:applicationContext-service.xml</param-value>
  </context-param>
  
  <listener>
    <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
  </listener>
</web-app>
import com.alibaba.dubbo.config.annotation.Service;
import com.cdut.service.HelloService;
![](https://img2020.cnblogs.com/blog/2186030/202011/2186030-20201122003432665-819060899.png)

//发布为服务,必须使用dubbo的注解
@Service
public class HelloServiceImpl implements HelloService {
    @Override
    public String sayHello(String s) {
        return "hello" + s;
    }
}
消费方编写
  • 在该项目下新建另一个模块,注意,新的模块路径应在该项目下,与前一个模块同级,创建时注意。
  • 新建一个配置文件applicationContext-web.xml,配置消费方相关信息
<!--    当前应用名称,用于注册中心计算应用间依赖关系,消费者与提供者应用名不要一样-->
    <dubbo:application name="dubbodemo_consumer"/>
<!--    连接服务注册中心zookeeper,ip为zookeeper服务器所在ip地址-->
    <dubbo:registry address="zookeeper://192.168.1.107:2181"/>
<!--    扫描指定包,加入@Service注解的类会被发布为服务-->
    <dubbo:annotation package="com.cdut.controller"/>

  • 配置web.xml文件,配置前端控制器,拦截web请求
<servlet>
    <servlet-name>dispatcherServlet</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <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>dispatcherServlet</servlet-name>
    <url-pattern>/</url-pattern>
  </servlet-mapping>
  • 编写一个controller设置映射路径,设置注入注解,该注解也是dubbo提供的Reference。把提供方的service接口也复制到本模块下。
@Controller
@RequestMapping("/hello")
public class HelloController {

    //该注解是com.alibaba.dubbo.config.annotation.Reference
    @Reference
    private HelloService helloService;

    @RequestMapping("sayHello")
    @ResponseBody
    public String sayHello(String name){
        return helloService.sayHello(name);
    }
}

测试结果

posted @ 2020-11-22 01:01  一只代码狗  阅读(355)  评论(0)    收藏  举报