01-dubbo基础知识

2022-07-18

01-dubbo基础知识

dubbo基础知识

一. RPC

远程过程调用

A,B服务器建立连接,进行通讯,序列化和反序列化

RPC框架的效率取决于:

  • 通信效率
  • 序列化和反序列效率

二. dubbo核心概念

2.1 简介

Dubbo是一款高性能的,轻量级的开源java RPC框架,它提供了三大核心能力:面向接口的远程方法调用,智能容错和负载均衡,以及服务自动注册和发现。

2.2 环境搭建

先搭建zookeeper,然后搭建dubbo_admin监视管理项目

2.3 helloWorld

  1. 将服务提供者注册到注册中心

    1. 导入dubbo依赖, 操作zookeeper的客户端

      <!--引入dubbo-->
              <dependency>
                  <groupId>com.alibaba</groupId>
                  <artifactId>dubbo</artifactId>
                  <version>2.6.2</version>
              </dependency>
              <!--注册中心使用的是zookeeper,引入操作zookeeper的客户端-->
              <dependency>
                  <groupId>org.apache.curator</groupId>
                  <artifactId>curator-framework</artifactId>
                  <version>2.12.0</version>
              </dependency>
          </dependencies>
      
    2. 配置dubbo

      <?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://dubbo.apache.org/schema/dubbo"
             xsi:schemaLocation="http://www.springframework.org/schema/beans        http://www.springframework.org/schema/beans/spring-beans-4.3.xsd        http://dubbo.apache.org/schema/dubbo        http://dubbo.apache.org/schema/dubbo/dubbo.xsd">
      
          <!-- 提供方应用信息,用于计算依赖关系 -->
          <!--1. 指定当前服务/应用的名字-->
          <dubbo:application name="user_service_provider"/>
      
          <!-- 使用zookeeper注册中心暴露服务地址 -->
          <!--2. 指定注册中心的位置-->
          <!--<dubbo:registry address="zookeeper://mahaonan.com:2181" />-->
          <dubbo:registry protocol="zookeeper" address="mahaonan.com:2181"/>
      
          <!-- 用dubbo协议在20880端口暴露服务 -->
          <!--3. 指定通讯规则(通讯协议?通讯端口)-->
          <dubbo:protocol name="dubbo" port="20880"/>
      
          <!--4. 声明需要暴露的服务接口,和真正实现的实现类 -->
          <dubbo:service interface="com.mahaonan.common.service.UserService" ref="userServiceImpl"/>
          <bean id="userServiceImpl" class="com.mahaonan.user.service.impl.UserServiceImpl"></bean>
          <!-- 和本地bean一样实现服务 -->
      </beans>
      
    3. 启动spring

      public class MainApp {
      
          public static void main(String[] args) throws IOException {
              String configLocation;
              ApplicationContext app = new ClassPathXmlApplicationContext("provider.xml");
              ((ClassPathXmlApplicationContext) app).start();
              System.in.read();
          }
      }
      
  2. 让服务消费者去注册中心订阅服务提供者的服务地址

    <?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:context="http://www.springframework.org/schema/context" xmlns:dubbo="http://dubbo.apache.org/schema/dubbo"
           xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd http://dubbo.apache.org/schema/dubbo http://dubbo.apache.org/schema/dubbo/dubbo.xsd">
    
        <context:component-scan base-package="com.mahaonan.order.service.impl"/>
    
        <!-- 消费方应用名,用于计算依赖关系,不是匹配条件,不要与提供方一样 -->
        <dubbo:application name="order_service_consumer"/>
    
        <!-- 使用zookeeper广播注册中心暴露发现服务地址 -->
        <dubbo:registry address="zookeeper://mahaonan.com:2181" />
    
        <!-- 生成远程服务代理,声明要调用的远程服务接口 -->
        <dubbo:reference id="userService" interface="com.mahaonan.common.service.UserService"/>
    
    </beans>
    

三. 高可用

3.1 zookeeper宕机与dubbo直连

zookeeper注册中心宕机,还可以消费dubbo暴露的服务

健壮性

  • 监控中心宕掉不影响使用,只是丢失部分采样数据
  • 数据库宕掉后,注册中心仍能通过缓存提供服务列表查询,但是不能注册新服务
  • 注册中心对等集群,任意一台宕掉之后,将自动切换到另外一台
  • 注册中心全部宕掉后,服务提供者和服务消费者仍能通过本地缓存通讯
  • 服务提供者无状态,任意一台宕掉后,不影响使用
  • 服务提供者全部宕掉后,服务消费者应用将服务使用,并无限次重连等待服务提供者恢复s

3.2 集群下dubbo负载均衡配置

  1. Random LoadBalance

    基于权重的随机负载均衡机制

    每台机器有一定的权重比例,然后随机按概率分配

  2. RoundRobin LoadBalance

    基于权重的轮询负载均衡机制

  3. LeastActive LoadBalance

    最少活跃数负载均衡机制

  4. ConsistentHash LoadBalance

    一致性Hash负载均衡策略

3.3 服务降级

当服务器压力剧增的情况下,根据实际业务情况及流量,对一些服务和页面有策略的不处理或换种简单的方式处理,从而释放服务器资源以保证核心交易正常运作或高效运作。

可以通过服务降级功能临时屏蔽某个出错的非关键服务,并定义降级后的返回策略。

3.4 集群容错

四. dubbo原理

4.1 RPC原理

  1. 服务消费方(client)调用以本地调用方式调用服务
  2. client stub 接收到调用后负责将方法,参数等组装成能够进行网络传输的消息体
  3. client stub找到服务地址,并将消息发送到服务端
  4. server stub收到消息后进行解码
  5. server stub根据解码结果调用本地的服务
  6. 本地服务执行并将结果返回给server stub
  7. server stub将返回结果打包成消息并发送至消费方
  8. client stub接收到消息,并进行解码
  9. 服务消费方得到最终结果

RPC框架的目标就是降2~8这些步骤都封装起来,这些细节对于用户来说是不可见的。

4.2 netty通信原理

4.2.1 NIO

Non-Blocking IO 非阻塞IO


标题:01-dubbo基础知识
作者:mahaonan
地址:https://mahaonan.fun/articles/2022/07/18/1658147019949.html