目录
前言
为什么使用Dubbo
Dubbo技术框架
编辑
调用关系流程
基础实现
A.提供统一业务Api
B.编辑服务提供者Product
B.a 添加依赖
B.b 添加Dubbo 配置(基于yaml配置文件)
B.c 编写并暴露服务
C.编辑服务消费者
C.a 添加依赖
C.b 添加Dubbo配置
C.c 引用服务
前言
Dubbo是基于Java的RPC分布式服务框架,主要用于提高性能和实现透明化的RPC远程服务调用以及SOA服务治理方案。简单来说,Dubbo就是一个用于分布式场景下实现远程调用的服务框架,当然Dubbo不只这个一个功能,这只是其中之一,它的核心模块还包括集群容错和自动发现等。
为什么使用Dubbo
- Dubbo可以讲核心的业务抽离出来,作为独立的服务,形成稳定的服务中心,以实现代码的灵活复用和拓展。
- Dubbo的配置方式对应用没有任何侵入,做到了透明化接入应用,只需要Spring加载Dubbo配置即可
- 再分布式架构下,可以承担更大规模的流量并发
Dubbo技术框架
节点说明
节点 | 说明 |
Provider | 服务提供者 |
Consumer | 服务消费者 |
Registry | 服务注册(发现)中心 |
Moniter | 服务监控中心(统计调用次数和调用时间) |
Container | 服务运行容器 |
调用关系流程
1、服务容器负责启动,加载,运行服务提供者;
2、服务提供者在启动时,向注册中心注册自己提供的服务;
3、服务消费者在启动时,向注册中心订阅自己所需的服务;
4、注册中心返回服务提供者地址列表给消费者;
5、服务消费者基于负载均衡算法,从提供者地址列表中,选择一位提供者进行调用,如果调用失败,再选另一位调用。
6、服务消费者和提供者,在内存中累计调用次数和调用时间,定时每分钟发送一次统计数据到监控中心。
基础实现
A.提供统一业务Api
/**
实战中,会将所有服务接口设计给一个叫做api的服务,单独维护,此处就在common服务设置*/
public interface IProductService {
Product findByPid(Integer pid);
}
B.编辑服务提供者Product
B.a 添加依赖
<!--dubbo-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-dubbo</artifactId>
</dependency>
B.b 添加Dubbo 配置(基于yaml配置文件)
dubbo:
scan:
base-packages: com.apesource.service.impl # 开启包扫描
protocols:
dubbo:
name: dubbo # 服务协议
port: -1 # 服务端口 使用随机端口
registry:
address: spring-cloud://localhost # 注册中心
B.c 编写并暴露服务
//暴露服务:注意这里使用的是dubbo提供的注解@Service,而不是Spring的
@Service
public class ProductServiceImpl implements ProductService {
@Autowired
private ProductDao productDao;
@Override
public Product findByPid(Integer pid) {
return productDao.findById(pid);
}
}
C.编辑服务消费者
C.a 添加依赖
<!--dubbo-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-dubbo</artifactId>
</dependency>
C.b 添加Dubbo配置
dubbo:
registry:
address: spring-cloud://localhost # 注册中心
cloud:
subscribed-services: service-product # 订阅的提供者名称
C.c 引用服务
@RestController
public class OrderController {
@Autowired
private OrderService orderService;
//引用服务
@Reference
private IProductService productService;
@RequestMapping("/order/prod/{pid}")
public Order order(@PathVariable Integer pid) {
System.out.println("接收到{}号商品的下单请求,接下来调用商品微服务查询此商品信息"+pid);
//调用商品微服务,查询商品信息
Product product = productService.findByPid(pid);
//下单(创建订单)
Order order = new Order();
order.setUid(1);
order.setUsername("测试用户");
order.setPid(pid);
order.setPname(product.getPname());
order.setPprice(product.getPprice());
order.setNumber(1);
orderService.createOrder(order);
System.out.println("创建订单成功,订单信息为{}"+JSON.toJSONString(order));
return order;
}
}