springboot下的dubbo探究
alibaba目前提供了两种针对springboot的dubbo服务:
1.
<dependency>
<groupId>com.alibaba.spring.boot</groupId>
<artifactId>dubbo-spring-boot-starter</artifactId>
<version>2.0.0</version>
</dependency>
<dependency>
<groupId>com.alibaba.boot</groupId>
<artifactId>dubbo-spring-boot-starter</artifactId>
<version>0.2.0</version>
</dependency>
对应的springboot版本都是1对应1,2对应2。
这里以com.alibaba.boot为例。
原理
写在之前:推荐阿里中间件团队博客:阿里中间件团队博客
服务注册
- 介绍
dubbo是一个轻量级微服务分布式服务框架,通过zookeeper(最优,其他:redis等)来实现注册,provider与consumer都会注册到RegistryFactory上。
相比于其他微服务框架而言,dubbo仅仅支持服务治理,但也更简洁,使用方便,拥有重试机制,可以实现服务的负载均衡配置。 - 原理
dubbo通过Rpc通讯,采用netty框架。
dubbo服务注册模式:
provider – registry factory – consumer
|---------------------------------------------->|
2.1provider服务在启动时,zk会初始化dubbo的注册节点,然后通过dubbo实现代理转换provider接口,同步注册到zk上。
2.2consumer服务启动时,同样会将消费接口代理注册到zk上,然后向dubbo注册中心订阅自己引用的接口,然后注册中心提供provider接口列表给consumer,consumer缓存到本地,接口请求时,依据负载均衡策略选择一个接口进行请求,失败则请求下一个。
2.3注册中心定时接收provider的接口注册信息,并定时向consumer反馈。 - Monitor监控接口使用情况
其他
- dubbo架构
dubbo架构分10层,大致上分为:
服务service–>配置config–>代理proxy–>注册中心registry–>集群cluster–>监控器Monitor
–>远程调用protocol–>信息交换exchange–>网络传输transport–>序列化serialize - 负载均衡
未配置使用默认随即。
可配置:轮询、权重、自定义等等。 - 容错
failover查询重试
failfast操作失败立即失败
…
开发
1.依赖
dubbo以zookeeper作为注册中心,故在父类pom中引入:
<!-- zookeeper -->
<dependency>
<groupId>org.apache.zookeeper</groupId>
<artifactId>zookeeper</artifactId>
<version>${zookeeper.version}</version>
</dependency>
<dependency>
<groupId>org.apache.curator</groupId>
<artifactId>curator-recipes</artifactId>
<version>${curator.version}</version>
</dependency>
<dependency>
<groupId>org.apache.curator</groupId>
<artifactId>curator-framework</artifactId>
<version>${curator.version}</version>
</dependency>
<!-- dubbo -->
<dependency>
<groupId>com.alibaba.boot</groupId>
<artifactId>dubbo-spring-boot-starter</artifactId>
<version>0.2.0</version>
</dependency>
2.服务
此处模拟多节点服务提供:
provider与provider-bak为同一个服务两个节点。
api为接口api组件jar包。
2.1provider
a. 在provider中实现该接口:
import com.shev.dubbo.provider.api.service.DubboProviderService;
import org.springframework.stereotype.Service;
@Service
@com.alibaba.dubbo.config.annotation.Service
public class DubboProviderServiceImpl implements DubboProviderService
{
@Override
public String getProviderInfo(String request)
{
return request + ":provider";
}
}
说明:该接口的实现必须在dubbo的service下,故这里引用了dubbo的service来暴露,同样bak服务也实现该接口(此处代码完全一致,只返回内容有区别,来区分节点):
@Override
public String getProviderInfo(String request)
{
return request + ":provider-bak";
}
b. 配置文件:
dubbo:
application:
name: dubbo-producer
registry:
address: 192.168.99.128:2181
protocol: zookeeper
timeout: 2000
protocol:
name: dubbo
port: 20880
monitor:
protocol: registry
provider:
timeout: 2000
此处一个provider的dubbo端口是20880,另一个provider是20881,此处每个服务所占dubbo端口是不同的,实际场景需要灵活配置。
c. 启动:
在application启动类上加上@EnableDubbo启动服务即可:
查询zookeeper可见dubbo的provider已经提供了两个节点的接口服务。
2.2consumer
a. 消费该接口:
在消费者这里可以直接使用该接口:
@Reference
private DubboProviderService dubboProviderService;
@GetMapping("/getPaperList")
public String getPaperList(String request)
{
System.out.printf("request:" + request);
String result = dubboProviderService.getProviderInfo(request);
System.out.println(result);
return result;
}
此处的@Reference为dubbo接口的注解,用来识别是远程接口。
b. 配置文件:
dubbo:
application:
name: dubbo-consumer
registry:
address: 192.168.99.128:2181
protocol: zookeeper
protocol:
name: dubbo
port: 20880
monitor:
protocol: registry
配置文件与provider一致。
c. 启动:
同样在application启动类上加上@EnableDubbo启动即可,如果多消费者,则zk中也会记录消费者节点,如下:
这里通过启动日志可见zk连接情况,provider与consumer同样可见:
然后请求我们的测试接口:
localhost:8083/consumer/getPaperList?request=hah
结果:
到此多节点模拟就实现了。
code源码-githup
微信公众号:像是风