使用dubbo的步骤 (原始的spring mvc):
1, 导入依赖 : pom中引入jar包;
2, 配置服务提供者和服务消费者的配置文件;
在服务提供者这边的配置文件中需要操作:
1, 指定当前服务/应用的名称;
<dubbo:application name="" />
2, 指定注册中心的地址;
<dubbo:registry protocol="" />
3, 指定通信规则 ;
<dubbo:protocol name="dubbo" port="20880" />
4, 暴露服务 ref:指向服务的真正实现对象
<dubbo:service inteface="com.xxxxxxx" />
服务的实现
<bean id="xxxxxx" class="com....">
5, 如果有监控中心,连接监控中心;
<dubbo:monitor protocol="registry" />
在服务消费者这边需要配置:
1, 指定当前的服务/应用的名称;
<dubbo:application name="" />
2, 指定注册中心的地址;
<dubbo:registry address="zookeeper://127.0.0.1:2181" />
3, 声明需要调用的远程服务的接口,生成远程服务代理
<dubbo:reference interface="com.xxxxxx" />
4 , 如果有监控中心,连接监控中心;
<dubbo:monitor protocol="registry">
PS: spring需要扫描到服务消息者相应的包
dubbo中的个性配置设置 :
1 ,启动时服务提供者的检查 ;
2 ,远程调用时的超时时长设置 ,可以配置在全局,也可以配置到接口,也可以配置到方法上(方法级优先,全局最后),在消费方和提供方上,级别一样消息方优先,提供方次之;
3 , 重试次数(不包含首次)设置重连机制(幂等情况下,如数据库的查询,修改,删除可以设置得重试次数,非幂等情况下如数据库的新增是不能设置重试次数的);
4 , 设置接口的新老版本功能调用,通过接口配置指定版本的方式,也可以通配符随机调用,实现灰度发布;
5 , 本地存根的调用,实现远程接口数据的验证或数据缓存;
dubbo的配置文件覆盖策略: 级别 >>> 依次向下
1 , 启动时java虚拟机方式;
2 , application.xml文件(spring的主配置文件);
3 , 为dubbo新建的一个dubbo.perproice文件;
springboot与dubbo的整合方式:
1 , 导入dubbo-starter, 在application.properties配置属性,使用@enbledubbo开启使用基于注解的方式开始(也可以文件中指定包名),@service(暴露服务)和@reference(引用服务);
2 , 导入dubbo-starter , 启动类导入配置文件的方式来使用dubbo,@importresource("文件名");
3 , 使用注解API的方式 (代码的方式);
dubbo的高可用 :通过设计,减少系统不能提供服务的时间
依赖zookeeper, 如查zookeeper注册中心宕机,服务提供者和消费者仍能通过本地缓存通讯;zookeeper保存的是服务提供者的位置信息;可以通过dubbo直连的方式,使用注解@reference(url="指定地址");
dubbo的负载均衡策略 (默认:随机):通过控制台来设置权重
1 ,随机 (权重设置随机概率);2 , 轮循(权重设置轮循比例(先轮循再比权重比例)) ; 3 ,最少的活跃调用次数的随机(访问时的响应时间);4, 一致性hash(根据hash值的不同去到不同的机器);
服务降级 :服务器压力很大时,对一些非主业务服务停止使用,以释放服务器资源,给主业务使用; 服务直接返回为Null或者调用后返回为null(在dubbo管理中心进行设置,屏蔽服务/容错设置);
服务容错 : 导入hystrix 相应jar
启动类添加@enablehystrix开启,服务提供者添加@hystrixcommand产生异常,服务消费者指定fallbackmethod方法执行
RPC原理 :完成远程服务调用
调用流程 :
1, 服务消费方client调用以本地调用方式调用服务 ;
2, client stub接收到调用后负责将方法,参数等组装成能够进行网络传输的消息体;
3, client 代理找到服务地址,并将消息发送到服务端;
4, server 代理收到消息后进行解码(如对象序列化等操作);
5, server 代理根据解码结果调用本地的服务;
6, 本地服务执行并将结果返回给server代理 ;
7, server 代理将返回结果打包成消息并发送至消费方;
8, client代理接收到消息,并进行解码操作;
9, 服务消费方得到最终结果。
RPC框架的目标就是要将2~8这些步骤都封装起来,对使用者来说是透明的但不可见 ;
dubbo底层服务间通讯方式是使用的是netty(非阻塞IO的方式进行);
BIO(阻塞IO):每次都是开启相应线程去执行IO读写操作,而且每个线程要依次处理完才能返回,业务未完成相应的线程是无法得到释放的;服务器无法同时处理大量线程会产生线程阻塞等待;
NIO(非阻塞IO): 会产生多个通道注册到多路复用选择器selector上,通道中都是使用的buffer进行数据传输,selector监听所有通道,在监听的同时会有多个事件,如connect,accept,read,write,相应的事件会产生相应线程去处理相应的操作;
netty的执行过程 :
1, 初始化channel ; 2, channel注册到selector上面 ;3, 轮询accept事件;4,处理accept建立连接channel;5,注册channel到selector上面;6,轮询读写事件;7,处理读写事件 ;
dubbo的原理:
1, 通过spring去读取配置文件,将配置文件中的标签依次封装成相应对象的bean,如:application --->new DubboBeanDefinitionParse(ApplicationConfig.class,true);
2, 通过doExport()向外暴露服务,底层使用到netty方式去监听相应地址端口的服务进行操作 ,而相应的地址和服务被缓存起来使用;
3, 通过doRefer()进行服务引用操作生成相应的服务代理Invoker进行返回,主要是将服务的代理和相应的服务实现之间建立联系;
4, 服务引用返回的Invoker进行一系列的操作,包括服务容错,服务降级,负载均衡,dubbo中的超时配置等操作进行层层包装,得到处理的结果返回给服务消费者,完成服务调用;