dubbo是什么
Dubbo是阿里巴巴公司开源的一个高性能优秀的服务框架,使得应用可通过高性能的RPC实现服务的输出和输入功能,可以和Spring框架无缝集成。Dubbo框架,是基于容器运行的,容器是Spring。
Dubbo系统分为五个部分:远程服务运行容器(Container),远程服务提供方(Provider)、注册中心(Register)、远程服务调用者(Consumer)、监控中心(Monitor)。
这很像生产者-消费者模型。只是在这种模型上,加上了注册中心和监控中心,用于管理提供方提供的url,以及管理整个过程。
dubbo能做什么
- 透明化的远程方法调用,就像调用本地方法一样调用远程方法,只需简单配置,没有任何API侵入。
- 软负载均衡及容错机制,可在内网替代F5等硬件负载均衡器,降低成本,减少单点。
- 服务自动注册与发现,不再需要写死服务提供方地址,注册中心基于接口名查询服务提供者的IP地址,并且能够平滑添加或删除服务提供者。
dubbo实战
本文基于springboot项目,注册中心使用zookeeper,
关于zookeeper的搭建可以看zookeeper集群搭建篇
- 首先假设有两个项目
服务提供方 spring-boot-dubbo-provider
服务调用方 spring-boot-dubbo-consumer
给两个项目分别添加pom依赖:
<dependency>
<groupId>com.alibaba.spring.boot</groupId>
<artifactId>dubbo-spring-boot-starter</artifactId>
<version>2.0.0</version>
</dependency>
<!--zookeeper依赖 -->
<dependency>
<groupId>org.apache.zookeeper</groupId>
<artifactId>zookeeper</artifactId>
<version>3.4.8</version>
</dependency>
<dependency>
<groupId>com.101tec</groupId>
<artifactId>zkclient</artifactId>
<version>0.10</version>
</dependency>
- yml配置文件分别
单机:
spring:
dubbo:
application:
name: spring-boot-dubbo-consumer
registry: zookeeper://116.62.154.78:2181
spring:
dubbo:
application:
name: spring-boot-dubbo-provider
registry: zookeeper://116.62.154.78:2181
集群
dubbo:
application:
name: spring-boot-dubbo-consumer
registry:
address: 116.62.154.78:2181,118.31.227.22:2181,49.233.89.186:2181
check: false
dubbo:
application:
name: spring-boot-dubbo-provider
registry:
address: 116.62.154.78:2181,118.31.227.22:2181,49.233.89.186:2181
check: false
- 启动类上添加注解@EnableDubboConfiguration
- 使用
服务提供者provider
service注解使用的是dubbo提供的
import com.alibaba.dubbo.config.annotation.Service;
@Service(interfaceClass = RecordsManageService.class)
public class RecordsManageServiceImpl implements RecordsManageService {
//识别记录查询
@Override
public FaceResult findRecords(FindRecordsDto findRecordsDto){
String submitUrl = FaceConstant.HEADURL+findRecordsDto.getEquipmentIp()+":"+findRecordsDto.getEquipmentPort()+"/"+ FaceConstant.API_NEW_FIND_RECORDS;
String res = HttpUtil.getForString(submitUrl, BeanUtil.beanToMap(findRecordsDto));
FaceResult result = FaceResultUtil.isSuccess(new JSONObject(res));
return result;
}
}
RecordsManageService最好提取到common,省的每个项目都建一遍
服务消费者consumer
使用@Reference注解调用提供者接口
import com.alibaba.dubbo.config.annotation.Reference;
@RestController
@Slf4j
public class ConsumerTestController {
@Reference
private RecordsManageService service;
@PostMapping("/test")
public FaceResult findRecords(@RequestBody FindRecordsDto findRecordsDto) {
return service.findRecords(findRecordsDto);
}
}