Dubbo之dubbo的基本应用

背景

我们都知道,技术架构的发展是从单体到分布式,越来越复杂,也越来越必然。
和传统单体架构相比,分布式多了远程通信的过程,远程服务之间的调用才是实现分布式的关键。
远程调用主要实现
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的架构

在这里插入图片描述
一共10层架构,由地侧面往上分别是:
1、数据序列化层(Serialize)
2、传输层(Transport)
3、信息交换层(Exchange)
4、远程调用层(protocol)
5、监控层(monitor)
6、集群层(Cluster)
7、服务注册层(Registry)
8、服务代理层(Proxy)
9、配置层(Config)
10、服务接口层(Service)

dubbo的基本应用

实现一下dubbo的远程通信

1、创建服务端
在这里插入图片描述
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的启动

上面演示的是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的启动代码
在这里插入图片描述
就能理解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地址
在这里插入图片描述
zookeeper终端查看
在这里插入图片描述
多注册中心
服务端

<!-- 应用-->
    <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 每次都要连 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配置
在这里插入图片描述
发布:
在这里插入图片描述

支持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
在这里插入图片描述
稍微修改代码:
在这里插入图片描述
测试:http://localhost:8888/pay/22
在这里插入图片描述
获取上下文

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

安装监控

Dubbo 的监控平台也做了更新,不过目前的功能还没有完善,
在 这 个 网 站 上 下 载 Dubbo-Admin 的包:
https://github.com/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是一个很好的远程通信和服务治理的框架

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值