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
-
将服务提供者注册到注册中心
-
导入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>
-
配置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>
-
启动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(); } }
-
-
让服务消费者去注册中心订阅服务提供者的服务地址
<?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负载均衡配置
-
Random LoadBalance
基于权重的随机负载均衡机制
每台机器有一定的权重比例,然后随机按概率分配
-
RoundRobin LoadBalance
基于权重的轮询负载均衡机制
-
LeastActive LoadBalance
最少活跃数负载均衡机制
-
ConsistentHash LoadBalance
一致性Hash负载均衡策略
3.3 服务降级
当服务器压力剧增的情况下,根据实际业务情况及流量,对一些服务和页面有策略的不处理或换种简单的方式处理,从而释放服务器资源以保证核心交易正常运作或高效运作。
可以通过服务降级功能临时屏蔽某个出错的非关键服务,并定义降级后的返回策略。
3.4 集群容错
四. dubbo原理
4.1 RPC原理
- 服务消费方(client)调用以本地调用方式调用服务
- client stub 接收到调用后负责将方法,参数等组装成能够进行网络传输的消息体
- client stub找到服务地址,并将消息发送到服务端
- server stub收到消息后进行解码
- server stub根据解码结果调用本地的服务
- 本地服务执行并将结果返回给server stub
- server stub将返回结果打包成消息并发送至消费方
- client stub接收到消息,并进行解码
- 服务消费方得到最终结果
RPC框架的目标就是降2~8这些步骤都封装起来,这些细节对于用户来说是不可见的。
4.2 netty通信原理
4.2.1 NIO
Non-Blocking IO 非阻塞IO