rpc-dubbo简单入门

Knowledge Sharing

知识分享

现在是资源共享的时代,同样也是知识分享的时代,如果你觉得本文能学到知识,请把知识与别人分享。

什么是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使得开发包括网络分布式多程序在内的应用程序更加容易。

官方架构图

一个官方简单的例子

加入pom依赖

<dependency>    
    <groupId>com.alibaba</groupId>   
    <artifactId>dubbo</artifactId>    
    <version>${dubbo.version}</version>
</dependency>

提供者接口

package com.alibaba.dubbo.demo;

public interface DemoService {    
    String sayHello(String name);
}

提供者实现类

package com.alibaba.dubbo.demo.provider;
import com.alibaba.dubbo.demo.DemoService;

public class DemoServiceImpl implements DemoService {
    public String sayHello(String name) {
        return "Hello " + name;    
    }
}

xml配置

<?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://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">

    <dubbo:application name="demo-provider"/>   
    <dubbo:registry address="multicast://224.5.6.7:1234"/>    
    <dubbo:protocol name="dubbo" port="20880"/>    
    <dubbo:service interface="com.alibaba.dubbo.demo.DemoService" ref="demoService"/>    
    <bean id="demoService" class="com.alibaba.dubbo.demo.provider.DemoServiceImpl"/>
</beans>

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

import org.springframework.context.support.ClassPathXmlApplicationContext;

public class Provider {
    public static void main(String[] args) throws Exception {
        ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext(new String[] {"META-INF/spring/dubbo-demo-provider.xml"});
        context.start();        // 按任意键退出        
        System.in.read();    
    }
}

消费者xml配置224.5.6.7为zookepeer

<?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://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">    
    <dubbo:application name="demo-consumer"/>    
    <dubbo:registry address="multicast://224.5.6.7:1234"/>    
    <dubbo:reference id="demoService" interface="com.alibaba.dubbo.demo.DemoService"/>
</beans>

测试消费者

import com.alibaba.dubbo.demo.DemoService;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class Consumer {    
    public static void main(String[] args) throws Exception {        
        ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext(new String[]{"META-INF/spring/dubbo-demo-consumer.xml"});        
        context.start();        // 获取远程调用的代理对象      
        DemoService demoService = (DemoService) context.getBean("demoService"); // 执行远程调用        
        String hello = demoService.sayHello("world");        // 显示结果        
        System.out.println(hello);    
    }
}

dubbo调用服务的负载均衡

Random LoadBalance 随机

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

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

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

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

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

算法参见:http://en.wikipedia.org/wiki/Consistent_hashing。 缺省只对第一个参数Hash,如果要修改,请配置

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

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

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

配置如:

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

或:

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

或:

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

或:

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

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

原文发布于微信公众号 - 互扯程序(chat_routine)

原文发表时间:2018-03-01

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏Android先生

Android Studio3.0更新之路(遇坑必入)

如果你从Android Studio内部点击更新的话,会跳转到Android的官网,没有梯子的同学可以去这个网站下载更新:

11540
来自专栏樊华恒的专栏

海量之道系列文章之弱联网优化 (四)

我们需要有一条(相对)快速、(相对)顺畅、(相对)稳定的网络通道承载业务数据的传输,这条路的最好是传输快、不拥堵、带宽大、收费少。如何才能做到快链路,且听下面分...

93600
来自专栏逸鹏说道

bootstrap + requireJS+ director+ knockout + web API = 一个时髦的单页程序

bootstrap + requireJS+ director+ knockout + web API = 一个时髦的单页程序 也许单页程序(Single Pa...

39850
来自专栏程序猿DD

优雅处理你的Java异常

来源:https://my.oschina.net/c5ms/blog/1827907

31620
来自专栏决胜机器学习

设计模式专题(十三) ——备忘录模式

设计模式专题(十三)——备忘录模式 (原创内容,转载请注明来源,谢谢) 一、概述 备忘录模式(Memento)是在不破坏封装性的前提下,捕获一个对象的内部状态...

41290
来自专栏SeanCheney的专栏

《Python分布式计算》 第6章 超级计算机群使用Python (Distributed Computing with Python)典型的HPC群任务规划器使用HTCondor运行Python任务

本章,我们学习另一种部署分布式Python应用的的方法。即使用高性能计算机(HPC)群(也叫作超级计算机),它们通常价值数百万美元(或欧元),占地庞大。 真正的...

1.6K100
来自专栏葡萄城控件技术团队

Winform文件下载之WebClient

最近升级了公司内部使用的一个下载小工具,主要提升了下面几点: 1. 在一些分公司的局域网中,连接不上外网 2. 服务器上的文件更新后,下载到的还是更新前的文件 ...

21650
来自专栏菩提树下的杨过

thrift中的超时(timeout)坑

最近在项目中采用thrift作为后台服务rpc框架,总体用下来性能还不错,跨语言特性使用起来也还行,但是也遇到了一些坑,其中之一就是超时问题(timeout),...

75190
来自专栏SDNLAB

OpenDaylight VTN源码及架构分析

VTN是opendaylight中负责租户隔离的工程,最近对源码和架构研究了一段时间,现将总结如下。 从VTN架构图我们可以看出,VTN共分为两个模块:VTN ...

40550
来自专栏Java技术栈

十面阿里,菜鸟,天猫,蚂蚁金服题目总汇

虽然天猫,蚂蚁金,菜鸟都归属阿里旗下,但每个面试官问的问题都不一样,相同点主要在流程方面。

18620

扫码关注云+社区

领取腾讯云代金券