rpc-dubbo简单入门

朴灿烈づ我的快乐病毒、 2022-05-30 01:55 338阅读 0赞

什么是dubbo?

Dubbo是一个分布式服务框架,致力于提供高性能和透明化的RPC远程服务调用方案,以及SOA服务治理方案。

简单的说,dubbo就是个服务框架,如果没有分布式的需求,其实是不需要用的,只有在分布式的时候,才有dubbo这样的分布式服务框架的需求,并且本质上是个服务调用的东东,说白了就是个远程服务调用的分布式框架(告别Web Service模式中的WSdl,以服务者与消费者的方式在dubbo上注册)

其核心部分包含

  1. 远程通讯: 提供对多种基于长连接的NIO框架抽象封装,包括多种线程模型,序列化,以及“请求-响应”模式的信息交换方式。
  2. 集群容错: 提供基于接口方法的透明远程过程调用,包括多协议支持,以及软负载均衡,失败容错,地址路由,动态配置等集群支持。
  3. 自动发现: 基于注册中心目录服务,使服务消费方能动态的查找服务提供方,使地址透明,使服务提供方可以平滑增加或减少机器。

什么是rpc?

RPC(Remote Procedure Call)—远程过程调用,它是一种通过网络从远程计算机程序上请求服务,而不需要了解底层网络技术的协议。RPC协议假定某些传输协议的存在,如TCP或UDP,为通信程序之间携带信息数据。在OSI网络通信模型中,RPC跨越了传输层和应用层。RPC使得开发包括网络分布式多程序在内的应用程序更加容易。

官方架构图

640_wx_fmt_png_tp_webp_wxfrom_5_wx_lazy_1

一个官方简单的例子

加入pom依赖

  1. <dependency>
  2. <groupId>com.alibaba</groupId>
  3. <artifactId>dubbo</artifactId>
  4. <version>${dubbo.version}</version>
  5. </dependency>

提供者接口

  1. package com.alibaba.dubbo.demo;
  2. public interface DemoService {
  3. String sayHello(String name);
  4. }

提供者实现类

  1. package com.alibaba.dubbo.demo.provider;
  2. import com.alibaba.dubbo.demo.DemoService;
  3. public class DemoServiceImpl implements DemoService {
  4. public String sayHello(String name) {
  5. return "Hello " + name;
  6. }
  7. }

xml配置

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:dubbo="http://code.alibabatech.com/schema/dubbo" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://code.alibabatech.com/schema/dubbo http://code.alibabatech.com/schema/dubbo/dubbo.xsd">
  3. <dubbo:application name="demo-provider"/>
  4. <dubbo:registry address="multicast://224.5.6.7:1234"/>
  5. <dubbo:protocol name="dubbo" port="20880"/>
  6. <dubbo:service interface="com.alibaba.dubbo.demo.DemoService" ref="demoService"/>
  7. <bean id="demoService" class="com.alibaba.dubbo.demo.provider.DemoServiceImpl"/>
  8. </beans>

测试:注意224.5.6.7:1234为注册中心,需要自行安装zookepeer

  1. import org.springframework.context.support.ClassPathXmlApplicationContext;
  2. public class Provider {
  3. public static void main(String[] args) throws Exception {
  4. ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext(new String[] {
  5. "META-INF/spring/dubbo-demo-provider.xml"});
  6. context.start(); // 按任意键退出
  7. System.in.read();
  8. }
  9. }

消费者xml配置224.5.6.7为zookepeer

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:dubbo="http://code.alibabatech.com/schema/dubbo" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://code.alibabatech.com/schema/dubbo http://code.alibabatech.com/schema/dubbo/dubbo.xsd">
  3. <dubbo:application name="demo-consumer"/>
  4. <dubbo:registry address="multicast://224.5.6.7:1234"/>
  5. <dubbo:reference id="demoService" interface="com.alibaba.dubbo.demo.DemoService"/>
  6. </beans>

测试消费者

  1. import com.alibaba.dubbo.demo.DemoService;
  2. import org.springframework.context.support.ClassPathXmlApplicationContext;
  3. public class Consumer {
  4. public static void main(String[] args) throws Exception {
  5. ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext(new String[]{
  6. "META-INF/spring/dubbo-demo-consumer.xml"});
  7. context.start(); // 获取远程调用的代理对象
  8. DemoService demoService = (DemoService) context.getBean("demoService"); // 执行远程调用
  9. String hello = demoService.sayHello("world"); // 显示结果
  10. System.out.println(hello);
  11. }
  12. }

dubbo调用服务的负载均衡

Random LoadBalance 随机

按权重设置随机概率。 在一个截面上碰撞的概率高,但调用量越大分布越均匀,而且按概率使用权重后也比较均匀,有利于动态调整提供者权重。

RoundRobin LoadBalance 轮循

按公约后的权重设置轮循比率。 存在慢的提供者累积请求问题,比如:第二台机器很慢,但没挂,当请求调到第二台时就卡在那,久而久之,所有请求都卡在调到第二台上。

LeastActive LoadBalance

最少活跃调用数,相同活跃数的随机,活跃数指调用前后计数差。 使慢的提供者收到更少请求,因为越慢的提供者的调用前后计数差会越大。

ConsistentHash LoadBalance

一致性Hash,相同参数的请求总是发到同一提供者,比较适合短时间内大量参数一样的请求

当某一台提供者挂时,原本发往该提供者的请求,基于虚拟节点,平摊到其它提供者,不会引起剧烈变动。

算法参见:http://en.wikipedia.org/wiki/Consistent\_hashing。

缺省只对第一个参数Hash,如果要修改,请配置

  1. <dubbo:parameter key="hash.arguments" value="0,1" />

缺省用160份虚拟节点,如果要修改,请配置

  1. <dubbo:parameter key="hash.nodes" value="320" />

配置如:

  1. <dubbo:service interface="..." loadbalance="roundrobin" />

或:

  1. <dubbo:reference interface="..." loadbalance="roundrobin" />

或:

  1. <dubbo:service interface="...">
  2. <dubbo:method name="..." loadbalance="roundrobin"/>
  3. </dubbo:service>

或:

  1. <dubbo:reference interface="...">
  2. <dubbo:method name="..." loadbalance="roundrobin"/>
  3. </dubbo:reference>

以上 一个简单的rpc就可以了

发表评论

表情:
评论列表 (有 0 条评论,338人围观)

还没有评论,来说两句吧...

相关阅读

    相关 Oracle简单入门

    NAT虚拟网络: 如果本机电脑能上网,就是虚拟机内的系统可以上网 1.oracle数据库特点:      支持多用户,大事务量的事务处理  

    相关 MongoDB简单入门

    前言 自己对mongoDB的认知一直停留在它是个nosql数据库(非关系型的数据库)存储的是key-value形式,连它的一些基本的CRUD都不会,也不知道它是怎么个"k

    相关 Vuex简单入门

    一.什么是Vuex Vuex 是一个专为 Vue.js 应用程序开发的状态管理架构。它借鉴了 Flux 和 Redux的设计思想,它采用集中式存储管理应用的所有组件的状态