2019独角兽企业重金招聘Python工程师标准>>>

简介

首先要弄清楚dubbo是什么东西,看很多介绍说dubbo是一个分布式服务框架(RPC),其实准确的说dubbo不仅仅是分布式服务框架,它还包含了一些资源调度服务治理的工作。 dubbo中的几个重要角色:

Provider: 暴露服务的服务提供方。 Consumer: 调用远程服务的服务消费方。 Registry: 服务注册与发现的注册中心。 Monitor: 统计服务的调用次调和调用时间的监控中心。 Container: 服务运行容器。

Registry就是注册中心,注册中心只是作为服务的注册和发现,不转发调用。Provider在启动的时候就会把它能提供的服务都注册到Registry上。Consumer在启动的时候就会像Registry订阅它要消费的服务。如果一个服务有多个提供者就会根据负载均衡算法选择一个,默认的算法是随机算法。当服务变化的时候,Registry会向订阅了变化服务的Consumer。

简单例子

这里我们使用的注册中心是Zookeeper,Zookeeper的安装与配置可以参考Zookeeper初遇。在调试的过程中我们可能会使用到dubbo的admin,这个可以在网上下载一个安装了。最后自己在dubbo github下载下来自己打包。dubbo是使用maven来管理构建的,可以在父目录执行:

mvn package -Dmaven.skip.test=true

也可以在dubbo-admin这个目录下执行,只打包admin工程,打包完成之后在target目录下可以看到一个war包。

注意:执行mvn命令需要安装配置了maven

dubbo-admin是一个Java Web应用,需要Java容器,可以选择tomcat,把dubbo-admin的war包拷贝到tomcat的webapps目录下(可以修改名字,访问路径为war包的名字),然后启动服务器就可以了。

下面是我的访问页面链接,因为我配的tomcat的端口是7073:

dubbo-admin有2个默认的用户一个是root密码默认是root,另一个是guest,密码默认是guest,可以在web应用的根目录下的WEB-INF下的dubbo.properties中配置修改。

Provider

package cn.freemethod.dubbo.service
public interface DemoService {String sayHello(String name);
}
package cn.freemethod.dubbo.service.impl;
import cn.freemethod.dubbo.service.DemoService;
public class DemoServiceImpl implements DemoService {@Overridepublic String sayHello(String name) {return "Hello " + name;}
}
import org.springframework.context.support.ClassPathXmlApplicationContext;public class Provider {public static void main(String[] args) throws Exception {@SuppressWarnings("resource")ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext(new String[] {"remote-provider.xml"});context.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:dubbo="http://code.alibabatech.com/schema/dubbo"xmlns:context="http://www.springframework.org/schema/context"xsi:schemaLocation="http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans.xsdhttp://code.alibabatech.com/schema/dubbohttp://code.alibabatech.com/schema/dubbo/dubbo.xsdhttp://www.springframework.org/schema/contexthttp://www.springframework.org/schema/context/spring-context.xsd"><context:property-placeholder location="remote-provider.properties" ignore-unresolvable="true"/><dubbo:application name="appNameProvider" owner="appOwnerName" organization="appOrganizationName"/><dubbo:registry id="registryId" protocol="zookeeper" address="127.0.0.1:2181" timeout="5000"/><dubbo:monitor protocol="registry"/><dubbo:protocol name="dubbo" port="25881" accesslog="/var/log/dubbo/access/freemethod.log"/><dubbo:service interface="cn.freemethod.dubbo.service.DemoService" ref="demoService" /><bean id="demoService" class="cn.freemethod.dubbo.service.impl.DemoServiceImpl" />
</beans>

dubbo的基本配置:

<dubbo:application name="appNameProvider" owner="appOwnerName" organization="appOrganizationName"/><dubbo:registry file="/var/chace" protocol="zookeeper" address="127.0.0.1:2181" timeout="5000"/><dubbo:monitor protocol="registry"/><dubbo:protocol name="dubbo" port="25881" accesslog="/var/log/dubbo/access/freemethod.log"/>

application:配置可以在admin上显示应用基本信息,主要是出了问题能够找到对应的负责人。 registry:是配置注册中心,常用的就是使用Zookeeper协议了,address就是注册中心的链接。file是配置缓存,缓存的是:注册中心的列表,服务提供者列表

monitor:配置监控中心使用的协议。

protocol:配置远程调用使用的协议,一般常用的是dubbo,也可以使用rmi,thrift等。accesslog是配置访问日志文件。

上面的Provider其实就是普通的接口和实现,最关键的是上面的配置中的:

<dubbo:service interface="cn.freemethod.dubbo.service.DemoService" ref="demoService" />

这个就是dubbo暴露的接口服务。在Provider启动的时候,dubbo会把这个服务注册到注册中心上。

注意:上面的配置为了更加了直观,所以没有使用占位符,remote-provider.properties文件的内容可以参考附录A

Consumer

package cn.freemethod.dubbo.service;public interface DemoService {String sayHello(String name);}
import org.springframework.context.support.ClassPathXmlApplicationContext;import cn.freemethod.dubbo.service.DemoService;public class Consumer {public static void main(String[] args) throws Exception {@SuppressWarnings("resource")ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext(new String[] {"remote-consumer.xml"});context.start();DemoService demoService = (DemoService)context.getBean("demoService"); // 获取远程服务代理String hello = demoService.sayHello("world"); // 执行远程方法System.out.println( hello ); // 显示调用结果}}
<?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"xmlns:context="http://www.springframework.org/schema/context"xsi:schemaLocation="http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans.xsdhttp://code.alibabatech.com/schema/dubbohttp://code.alibabatech.com/schema/dubbo/dubbo.xsdhttp://www.springframework.org/schema/contexthttp://www.springframework.org/schema/context/spring-context.xsd"><context:property-placeholder location="remote-consumer.properties" ignore-unresolvable="true"/><dubbo:application name="appNameConsumer" owner="appOwnerName" organization="appOrganizationName"/><dubbo:registry id="registryId" protocol="zookeeper" address="127.0.0.1:2181" timeout="5000"/><dubbo:monitor protocol="registry"/><dubbo:protocol name="dubbo" port="25881" accesslog="/var/log/dubbo/access/freemethod.log"/><dubbo:reference id="demoService" interface="cn.freemethod.dubbo.service.DemoService" />
</beans>

上面的Consumer和Provider一样都是简单的接口,Consumer一样远程服务的配置是:

<dubbo:reference id="demoService" interface="cn.freemethod.dubbo.service.DemoService" />

注意:这里的配置id可以和Provider的id不同但是interface必须相同,这个接口可以引用相同的接口,也可以是2个同名的接口

对于上面的Provider和Consumer可以放在一个工程中,但是最后放在2个工程中,对于接口可以单独一个工厂,Provider和Consumer都依赖这个接口工程。

dubbo的负载均衡算法

dubbo的负载均衡主要是在有多个服务提供者的时候,服务消费者怎样选择的算法,不同算法各有优缺点。

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

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

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

  4. ConsistentHash LoadBalance 一致性Hash,相同参数的请求总是发到同一提供者。当某一台提供者挂时,原本发往该提供者的请求,基于虚拟节点,平摊到其它提供者,不会引起剧烈变动。缺省只对第一个参数Hash。如果要修改,可以配置:

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

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

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

附录A

#这个主要用于配置注册中心缓存,缓存注册中心列表和服务提供在列表
cache.path=/usr/home/cache
app.owner.name = freemethod
app.organization.name = freemethod
app.name = freemethod
service.protocol = dubbo
service.port = 25881
service.log = /var/log/dubbo/access/freemethod.log
#registry.address=192.168.0.224:2181,192.168.0.225:2181,192.168.0.226:2181
registry.address=127.0.0.1:2181
registry.protocol=zookeeper
connect.service.max.thread.threads.size =20

参考

dubbo文档

dubbo github

Zookeeper初遇

一致性hash

转载于:https://my.oschina.net/u/2474629/blog/918808

dubbo入门级梳理相关推荐

  1. 人脸图像GAN,今如何?(附多篇论文下载)

    点击上方"机器学习与生成对抗网络",关注"星标" 获取有趣.好玩的前沿干货! 下述paper均属CVPR 2020,可在公众号后台回复 001 即可获取打包下载 ...

  2. c++gdal如何在大图像中截取小图像并获取其图像信息_盘点GAN在目标检测中的应用...

    本文首发于公众号[机器学习与生成对抗网络],欢迎关注.回复 GAN 获取分类好的论文集,后台会邀您加入CV&GAN交流群一起讨论) 戳我,查看GAN的系列专辑~! 1,2017-CVPR: A ...

  3. deepfake论文40篇汇总

    点击上方"机器学习与生成对抗网络",关注"星标" 获取有趣.好玩的前沿干货!  戳我,查看GAN的系列专辑~! Deepfake这个词是"深度学习&q ...

  4. GAN属于计算机视觉领域嘛_【图像上色小综述】生成对抗网络的GAN法

    本文首发于公众号[机器学习与生成对抗网络],欢迎关注.回复 GAN 获取分类好的论文集,后台会邀您加入CV&GAN交流群一起讨论) 戳我,查看GAN的系列专辑~! 0,图像上色及其分类 图像上 ...

  5. 大白话带你梳理一下Dubbo的那些事儿

    RPC服务的介绍 相信有过一些分布式开发经历的读者都有用过一些RPC框架,通过框架包装好之后提供的API接口调用远程服务,体验感觉起来就和调用本地服务一样轻松.这么方便好用的技术框架,在实际的开发过程 ...

  6. 一文梳理Dubbo常见面试问题

    文章目录 1.Dubbo是什么?能干嘛?RPC又是什么? 2.结合流程图,说下Dubbo的调用过程? 3.Dubbo 支持哪些协议?每种协议的应用场景及其优缺点? 4.Dubbo组件中用到的设计模式? ...

  7. 【SpringBoot】入门级学习dubbo

    文章目录 前言 1.Dubbo的前世今生 2.Dubbo的快速入门 2.0 介绍 2.1.Dubbo的基本架构 2.2.Nacos 2.3.管理后台 2.4.入门案例 2.4.0 准备 2.4.1.服 ...

  8. 资料搜集-JAVA系统的梳理知识

    <!-- TOC -->- [Java](#java)- [基础](#基础)- [并发](#并发)- [JVM](#jvm)- [Java8 新特性](#java8-新特性)- [代码优化 ...

  9. cstring只获取到第一个数_一文讲透 Dubbo 负载均衡之最小活跃数算法

    (给ImportNew加星标,提高Java技能) 作者:why技术(本文来自作者投稿) 本文是对于Dubbo负载均衡策略之一的最小活跃数算法的详细分析.文中所示源码,没有特别标注的地方均为2.6.0版 ...

  10. dubbo学习过程、使用经验分享及实现原理简单介绍

    一.前言 部门去年年中开始各种改造,第一步是模块服务化,这边初选dubbo试用在一些非重要模块上,慢慢引入到一些稍微重要的功能上,半年时间,学习过程及线上使用遇到的些问题在此总结下. 整理这篇文章差不 ...

最新文章

  1. Sharding-Jdbc 实现读写分离 + 分库分表,写得太好了!
  2. 无法解决 equal to 操作中 Chinese_PRC_CI_AS_WS 和 Chinese_PRC_CI_AS 之间的排序规则冲突...
  3. 验证字符串是否以指定字符开头
  4. 数据结构与算法—递归算法(从阶乘、斐波那契到汉诺塔的递归图解)
  5. UserCF,基于用户的协同过滤算法
  6. Asterisk使用数据库配置方法
  7. WebP 在减少图片体积和流量上的效果如何?MIP技术实践分享
  8. dj鲜生-16-这是危险的模块-isdangerous
  9. 【ROS学习笔记】(十一)launch启动文件的使用方法
  10. 三菱PLC-信捷人机通信(编程)
  11. matlab在电磁波中的应用,MATLAB在电磁波与电磁场课程教学中的应用
  12. WinRAR密码破解(精)
  13. iOS 斯坦福大学公开课地址
  14. 了解arXiv,及arXiv的注册详细操作。
  15. Vue项目中的Emitted value instead of an instance of Error问题
  16. 自行车内胎常识和选购注意事项
  17. K_A02_004 基于单片机驱动8位数码管模块(74HC595) 0-7滚动+ 时钟显示
  18. 球差透射电镜测试服务的收费标准和样品要求
  19. win10中搭建并配置ftp服务器的方法(实现多用户登录整合版
  20. “飞花令”APP(简单的收索软件)

热门文章

  1. 用C语言实现:打印100-200之间的素数。
  2. Django中QuerySet的结果是否为空的判断
  3. pj2--图书管理系统
  4. spring启动quartz定时器
  5. 图像下方出现几像素的空白间隙
  6. 【ARM】2410裸机系列-中断处理
  7. MySQL 中while loop repeat 的基本用法
  8. Vue:router的beforeEach与afterEach钩子函数
  9. opencv 显示图片失败,全灰
  10. $.ajax()在IE9下的兼容性问题