dubbo
dubbo背景
在如今设备配置已经到达极限的时候,则需要进行分布式进行处理,将一些应用功能分开管理,但是又必须得互相有沟通,可以通过简单的接口暴露和RPC引用远程服务,通过配置URL地址进行调用,通过F5等硬件进行负载均衡.但是当应用服务规模再进一步扩大的情况下,如果只是简单的通过RMI等方法暴露接口的话,服务的URL配置和管理将变得特别的困难,这个时候就需要实现一个注册中心,动态地注册和发现服务,使得服务的位置透明,并通过在消费方获取服务提供地址列表,实现软负载均衡
但是如果在进一步发展,服务器的依赖关系变得错综复杂,甚至分不清那个服务在那个服务之前启动,这个时候需要自动画出应用间的依赖图,来帮助架构师理清系统关系.
但是当应用规模扩大的时候还必须要确定多少台机器合适,也必须要有一个服务来进行调用统计,响应时间计算,通过这些来判断需要多少机器,来进行管理.
dubbo架构
这就是dubbo基本的架构图.
大致流程:
- 服务提供方应该向注册中心注册自己要发布的服务,
- 其次消费方去注册中心订阅自己所需要的服务
- 当注册中心发现有服务的话会通知消费方服务提供放暴露的接口地址,如果一个服务有多个提供者,则会返回一个服务接口列表,由消费方调用
- 消费方依靠这个地址列表去找到对应的服务提供者.这里如果有多台机器在代码中会可以实现软负载均衡,寻找合适的服务提供者去请求.
- 服务方和消费方也都会在内存中存储调用次数和时间,定时向监控中心发送数据.
API方式
API方式也是根据上述的流程.
首先必须得有一个注册中心: 一般来说注册中心使用zookeeper,zookeeper启动过程可以去网上搜索.挺简单的.
接着应该有一个服务提供者提供服务.
使用Dubbo的服务必须有几个参数得指明.一个是application,也就是提供服务的应用.一个是注册中心的配置,因为你要向注册中心注册一个服务.这也是必须的.来看一下提供方代码:
首先应该有一个接口,也就是提供的服务的接口:
1 | public interface Calculator { |
接着就可以提供服务了:
1 | public static void main(String[] args) throws IOException { |
消费方代码:
1 | public static void main(String[] args) { |
Spring集成 xml方式
provider.xml配置:
1 | <beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" |
consumer.xml配置:
1 | <beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" |
还有很多配置,详情请看dubbo官网http://dubbo.apache.org/zh-cn/docs/user/configuration/xml.html.
基于注解的配置:
provider
首先也必须要配置应用共享的一些属性,比如应用名称,注册地址,使用的协议和绑定的端口等.
1 | dubbo.application.name=annotation-provider |
指定包的扫描路径:
1 | "org.apache.dubbo.samples.simple.annotation.impl") (scanBasePackages = |
使用Service注解暴露服务
1 | "dubbo","rest"},version = "1.0", timeout=3000) (protocol = { |
consumer
配置应用基本属性:
1 | dubbo.application.name=annotation-consumer |
消费方使用服务
1 | "annotationAction") ( |
指定spring扫描路径
1 |
|