Dubbo的基本应用

  • 背景
  • Dubbo
  • dubbo是什么
  • dubbo能干什么
  • dubbo的架构
  • dubbo的基本应用
  • dubbo的启动
  • dubbo搭配zookeeper注册中心
  • 多协议支持
  • 集成webservice
  • 支持rest
  • 安装监控
  • 总结


背景

我们都知道,技术架构的发展是从单体到分布式,越来越复杂,也越来越必然。
和传统单体架构相比,分布式多了远程通信的过程,远程服务之间的调用才是实现分布式的关键。
远程调用主要实现
1、底层网络通信处理
2、序列化和反序列化
所以,基于这两点基础功能,一般使用RPC框架来实现
常用的有java 的RMI、webservice、Hessian、Dubbo、Thrift等
当业务越来越复杂,实现大规模服务化后,会出现一系列问题,如
1、服务链路变长,如何实现监控
2、服务的大规模集群,需要注册中心来管理
3、需要容错机制
4、需要负载均衡
传统的RPC框架在这些问题上线的力不从心,所以,才有了HSF,Dubbo、JSF、dubbox、motan、sofa等新的RPC框架。

Dubbo

dubbo是什么

dubbo是一个框架
dubbo是一个RPC框架
dubbo是一个高性能的,提供SOA服务治理的RPC框架

dubbo能干什么

主要是解决分布式的服务治理问题,是指大规模服务化后产生的,服务间路由、负载均衡、容错机制、服务降级等一些列问题

dubbo的架构

dubbo在项目中作用 dubbo在项目中怎么用_dubbo


一共10层架构,由地侧面往上分别是:

1、数据序列化层(Serialize)

2、传输层(Transport)

3、信息交换层(Exchange)

4、远程调用层(protocol)

5、监控层(monitor)

6、集群层(Cluster)

7、服务注册层(Registry)

8、服务代理层(Proxy)

9、配置层(Config)

10、服务接口层(Service)

dubbo的基本应用

实现一下dubbo的远程通信

1、创建服务端

dubbo在项目中作用 dubbo在项目中怎么用_dubbo_02


api作为对外暴露的模块,provider作为具体业务代码

dubbo依赖

<dependency>
      <groupId>org.apache.dubbo</groupId>
      <artifactId>dubbo</artifactId>
      <version>2.7.2</version>
    </dependency>

api中是用接口,provider实现类

配置application.xml

<!-- 应用-->
    <dubbo:application name="pay-service"/>
    
    <!--所用 协议-->
    <dubbo:protocol name="dubbo" port="20880"/>

    <!-- 具体的发布的服务-->
    <dubbo:service interface="com.gupao.dubbo.PayService" ref="payService" />

    <bean id="payService" class="com.gupao.dubbo.PayServiceImpl"/>

2、客户端
同理类似
配置 application.xml

<!-- 提供方应用信息,用于计算依赖关系 -->
    <dubbo:application name="order-service"/>
    <dubbo:reference interface="com.gupao.dubbo.PayService" id="payService" />

    <!--没有注册中心时,直接配置service的地址,这里是在本机启动的 -->
    <dubbo:reference interface="com.gupao.dubbo.PayService" id="payService" url="dubbo://localhost:20880/com.gupao.dubbo.PayService"/>

启动service,client

dubbo在项目中作用 dubbo在项目中怎么用_xml_03


dubbo在项目中作用 dubbo在项目中怎么用_xml_04

请求结果:

dubbo在项目中作用 dubbo在项目中怎么用_dubbo在项目中作用_05

dubbo的启动

上面演示的是spring启动的方式,其实还可以使用
Main.main(args)的方式启动,效果是一样的。
args可以是多个值"spring,log4j…等"。
不仅仅是spring,dubbo提供了三种容器供我们选择

容器类型
Spring Container
自动加载 META-INF/spring 目录下的所有 Spring 配置。
logback Container
自动装配 logback 日志
Log4j Container
自动配置 log4j 的配置
Dubbo 提供了一个 Main.main 快速启动相应的容器,默认情况下,只会启
动 spring 容器

通过三种容器去启动的,例如我们看下spring的启动代码

dubbo在项目中作用 dubbo在项目中怎么用_xml_06


就能理解application.xml放的位置了

dubbo搭配zookeeper注册中心

只需要修改application.xml

服务端加上

<!-- 注册中心 zookeeper -->
    <dubbo:registry address="zookeeper://192.168.116.137:2181" />

客户端去掉url链接,改用zookeeper

<!-- 提供方应用信息,用于计算依赖关系 -->
    <dubbo:application name="order-service"/>

    <!--zookeeper注册中心-->
    <dubbo:registry address="zookeeper://192.168.116.137:2181" />

    <dubbo:reference interface="com.gupao.dubbo.PayService" id="payService" />

用指令查看zookeeper中注册的url地址

dubbo在项目中作用 dubbo在项目中怎么用_dubbo在项目中作用_07


zookeeper终端查看

dubbo在项目中作用 dubbo在项目中怎么用_dubbo在项目中作用_08


多注册中心

服务端

<!-- 应用-->
    <dubbo:application name="pay-service"/>

    <!-- 注册中心 zookeeper -->
    <dubbo:registry id="rg1" address="zookeeper://192.168.116.137:2181" />

    <dubbo:registry id="rg2" address="zookeeper://192.168.116.138:2181" />

    <!--所用 协议-->
    <dubbo:protocol name="dubbo" port="20880"/>

    <dubbo:service interface="com.gupao.dubbo.PayService" ref="payService" registry="rg1"/>

    <dubbo:service interface="com.gupao.dubbo.QueryService" ref="queryService" registry="rg2" />

    <bean id="payService" class="com.gupao.dubbo.PayServiceImpl"/>

    <bean id="queryService" class="com.gupao.dubbo.QueryServiceImpl" />

客户端

<!-- 提供方应用信息,用于计算依赖关系 -->
    <dubbo:application name="order-service"/>

    <!--zookeeper注册中心-->
    <dubbo:registry id ="rg1" address="zookeeper://192.168.116.137:2181" />

    <dubbo:registry id="rg2" address="zookeeper://192.168.116.138:2181" />

    <dubbo:reference interface="com.gupao.dubbo.PayService" id="payService" registry="rg1"/>

    <dubbo:reference interface="com.gupao.dubbo.QueryService" id="queryService" registry="rg2"/>

Dubbo 集成 Zookeeper 的实现原理

dubbo在项目中作用 dubbo在项目中怎么用_dubbo在项目中作用_09


dubbo 每次都要连 zookeeper?

是不是每次发起一个请求的时候,都需要访问注册中心呢?作为一个设计者,你会怎么去解决这个问题。

答案很显然是通过缓存实现

在消费端的配置文件中指定如下路径

<dubbo:registry id=“zookeeper”

address=“zookeeper://192.168.13.102:2181” file=“d:/dubboserver” />

其他注册中心的实现,核心本质是一样的,都是为了管理服务地址,后续会

讲到 nacos;

多协议支持

上面我们演示的是dubbo协议,还可以支持其他协议,比如RMI、webservice

集成webservice

服务端pom.xml引入依赖

<dependency>
      <groupId>org.apache.cxf</groupId>
      <artifactId>cxf-rt-frontend-simple</artifactId>
      <version>3.3.2</version>
    </dependency>

      <dependency>
          <groupId>org.apache.cxf</groupId>
          <artifactId>cxf-rt-transports-http</artifactId>
        <version>3.3.2</version>
      </dependency>

    <dependency>
      <groupId>org.eclipse.jetty</groupId>
      <artifactId>jetty-server</artifactId>
      <version>9.4.19.v20190610</version>
    </dependency>

    <dependency>
      <groupId>org.eclipse.jetty</groupId>
      <artifactId>jetty-servlet</artifactId>
        <version>9.4.19.v20190610</version>
    </dependency>

application.xml配置

dubbo在项目中作用 dubbo在项目中怎么用_spring_10


发布:

dubbo在项目中作用 dubbo在项目中怎么用_dubbo_11

支持rest

引入依赖

<dependency>
      <groupId>org.jboss.resteasy</groupId>
      <artifactId>resteasy-jaxrs</artifactId>
      <version>3.8.1.Final</version>
    </dependency>
    <dependency>
      <groupId>org.jboss.resteasy</groupId>
      <artifactId>resteasy-client</artifactId>
      <version>4.0.0.Final</version>
    </dependency>

修改application.xml

dubbo在项目中作用 dubbo在项目中怎么用_dubbo_12


稍微修改代码:

dubbo在项目中作用 dubbo在项目中怎么用_spring_13


测试:http://localhost:8888/pay/22

dubbo在项目中作用 dubbo在项目中怎么用_dubbo在项目中作用_14


获取上下文

HttpServletRequest
request=(HttpServletRequest)RpcContext.getContext().getRequest();
或者直接写在方法上
String pay(@PathParam(“info”) String info,@Context HttpServletRequest request);

安装监控

Dubbo 的监控平台也做了更新,不过目前的功能还没有完善,
在 这 个 网 站 上 下 载 Dubbo-Admin 的包:
https:///apache/dubbo-admin

  1. 修 改 dubbo-admin-server/src/main/resources/application.properties
    中的配置信息
  2. mvn clean package 进行构建
  3. mvn –projects dubbo-admin-server spring-boot:run
  4. 访问 localhost:8080

总结

DUbbo是一个很好的远程通信和服务治理的框架