初识Dubbo 系列之1-Dubbo是什么

          Dubbo是阿里巴巴内部的SOA服务化治理方案的核心框架,每天为2000+ 个服务提供3,000,000,000+ 次访问量支持,并被广泛应用于阿里巴巴集团的各成员站点。Dubbo自2011年开源后,已被许多非阿里系公司使用。

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

其核心部分包含:

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

Dubbo能做什么?

  • 透明化的远程方法调用,就像调用本地方法一样调用远程方法,只需简单配置,没有任何API侵入。
  • 软负载均衡及容错机制,可在内网替代F5等硬件负载均衡器,降低成本,减少单点。
  • 服务自动注册与发现,不再需要写死服务提供方地址,注册中心基于接口名查询服务提供者的IP地址,并且能够平滑添加或删除服务提供者。

快速启动

 

Dubbo采用全Spring配置方式,透明化接入应用,对应用没有任何API侵入,只需用Spring加载Dubbo的配置即可,Dubbo基于Spring的Schema扩展进行加载。

1

如果不想使用Spring配置,而希望通过API的方式进行调用(不推荐),请参见:API配置 (+)

1

服务提供者

 

完整安装步骤,请参见:示例提供者安装 (+)

1

定义服务接口: (该接口需单独打包,在服务提供方和消费方共享)

DemoService.java

1package 2 com.alibaba.dubbo.demo; 3 4 5 6 7 8   9 10 11 12 13 14 public 15 interface 16 DemoService { 17 18 19 20 21 22   23 24 25 26 27 28      29 String sayHello(String name); 30 31 32 33 34 35   36 37 38 39 40 41 } 42

在服务提供方实现接口:(对服务消费方隐藏实现)

DemoServiceImpl.java

1package 2 com.alibaba.dubbo.demo.provider; 3 4 5 6 7 8   9 10 11 12 13 14 import 15 com.alibaba.dubbo.demo.DemoService; 16 17 18 19 20 21   22 23 24 25 26 27 public 28 class 29 DemoServiceImpl 30 implements 31 DemoService { 32 33 34 35 36 37   38 39 40 41 42 43      44 public 45 String sayHello(String name) { 46 47 48 49 50 51          52 return 53 "Hello " 54 + name; 55 56 57 58 59 60      61 } 62 63 64 65 66 67   68 69 70 71 72 73 } 74

用Spring配置声明暴露服务:

provider.xml

1<? 2 xml 3 version 4 = 5 "1.0" 6 encoding 7 = 8 "UTF-8" 9 ?> 10 11 12 13 14 15 < 16 beans 17 xmlns 18 = 19 "http://www.springframework.org/schema/beans" 20 21 22 23 24 25      26 xmlns:xsi 27 = 28 "http://www.w3.org/2001/XMLSchema-instance" 29 30 31 32 33 34      35 xmlns:dubbo 36 = 37 "http://code.alibabatech.com/schema/dubbo" 38 39 40 41 42 43      44 xsi:schemaLocation 45 = 46 "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" 47 > 48 49 50 51 52 53   54 55 56 57 58 59      60 <!-- 提供方应用信息,用于计算依赖关系 --> 61 62 63 64 65 66      67 < 68 dubbo:application 69 name 70 = 71 "hello-world-app"  72 /> 73 74 75 76 77 78   79 80 81 82 83 84      85 <!-- 使用multicast广播注册中心暴露服务地址 --> 86 87 88 89 90 91      92 < 93 dubbo:registry 94 address 95 = 96 "multicast://224.5.6.7:1234" 97 /> 98 99 100 101 102 103   104 105 106 107 108 109      110 <!-- 用dubbo协议在20880端口暴露服务 --> 111 112 113 114 115 116      117 < 118 dubbo:protocol 119 name 120 = 121 "dubbo" 122 port 123 = 124 "20880" 125 /> 126 127 128 129 130 131   132 133 134 135 136 137      138 <!-- 声明需要暴露的服务接口 --> 139 140 141 142 143 144      145 < 146 dubbo:service 147 interface 148 = 149 "com.alibaba.dubbo.demo.DemoService" 150 ref 151 = 152 "demoService" 153 /> 154 155 156 157 158 159   160 161 162 163 164 165      166 <!-- 和本地bean一样实现服务 --> 167 168 169 170 171 172      173 < 174 bean 175 id 176 = 177 "demoService" 178 class 179 = 180 "com.alibaba.dubbo.demo.provider.DemoServiceImpl" 181 /> 182 183 184 185 186 187   188 189 190 191 192 193 </ 194 beans 195 > 196

加载Spring配置:

Provider.java

1import 2 org.springframework.context.support.ClassPathXmlApplicationContext; 3 4 5 6 7 8   9 10 11 12 13 14 public 15 class 16 Provider { 17 18 19 20 21 22   23 24 25 26 27 28      29 public 30 static 31 void 32 main(String[] args) 33 throws 34 Exception { 35 36 37 38 39 40          41 ClassPathXmlApplicationContext context = 42 new 43 ClassPathXmlApplicationContext( 44 new 45 String[] { 46 "http://10.20.160.198/wiki/display/dubbo/provider.xml" 47 }); 48 49 50 51 52 53          54 context.start(); 55 56 57 58 59 60   61 62 63 64 65 66          67 System.in.read(); 68 // 按任意键退出 69 70 71 72 73 74      75 } 76 77 78 79 80 81   82 83 84 85 86 87 } 88

服务消费者

 

完整安装步骤,请参见:示例消费者安装 (+)

1

通过Spring配置引用远程服务:

consumer.xml

1<? 2 xml 3 version 4 = 5 "1.0" 6 encoding 7 = 8 "UTF-8" 9 ?> 10 11 12 13 14 15 < 16 beans 17 xmlns 18 = 19 "http://www.springframework.org/schema/beans" 20 21 22 23 24 25      26 xmlns:xsi 27 = 28 "http://www.w3.org/2001/XMLSchema-instance" 29 30 31 32 33 34      35 xmlns:dubbo 36 = 37 "http://code.alibabatech.com/schema/dubbo" 38 39 40 41 42 43      44 xsi:schemaLocation 45 = 46 "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" 47 > 48 49 50 51 52 53   54 55 56 57 58 59      60 <!-- 消费方应用名,用于计算依赖关系,不是匹配条件,不要与提供方一样 --> 61 62 63 64 65 66      67 < 68 dubbo:application 69 name 70 = 71 "consumer-of-helloworld-app"  72 /> 73 74 75 76 77 78   79 80 81 82 83 84      85 <!-- 使用multicast广播注册中心暴露发现服务地址 --> 86 87 88 89 90 91      92 < 93 dubbo:registry 94 address 95 = 96 "multicast://224.5.6.7:1234" 97 /> 98 99 100 101 102 103   104 105 106 107 108 109      110 <!-- 生成远程服务代理,可以和本地bean一样使用demoService --> 111 112 113 114 115 116      117 < 118 dubbo:reference 119 id 120 = 121 "demoService" 122 interface 123 = 124 "com.alibaba.dubbo.demo.DemoService" 125 /> 126 127 128 129 130 131   132 133 134 135 136 137 </ 138 beans 139 > 140

加载Spring配置,并调用远程服务:(也可以使用IoC注入)

Consumer.java

1import 2 org.springframework.context.support.ClassPathXmlApplicationContext; 3 4 5 6 7 8 import 9 com.alibaba.dubbo.demo.DemoService; 10 11 12 13 14 15   16 17 18 19 20 21 public 22 class 23 Consumer { 24 25 26 27 28 29   30 31 32 33 34 35      36 public 37 static 38 void 39 main(String[] args) 40 throws 41 Exception { 42 43 44 45 46 47          48 ClassPathXmlApplicationContext context = 49 new 50 ClassPathXmlApplicationContext( 51 new 52 String[] { 53 "http://10.20.160.198/wiki/display/dubbo/consumer.xml" 54 }); 55 56 57 58 59 60          61 context.start(); 62 63 64 65 66 67   68 69 70 71 72 73          74 DemoService demoService = (DemoService)context.getBean( 75 "demoService" 76 ); 77 // 获取远程服务代理 78 79 80 81 82 83          84 String hello = demoService.sayHello( 85 "world" 86 ); 87 // 执行远程方法 88 89 90 91 92 93   94 95 96 97 98 99          100 System.out.println( hello ); 101 // 显示调用结果 102 103 104 105 106 107      108 } 109 110 111 112 113 114   115 116 117 118 119 120 } 121

代码交流 2021