目录
Dubbo是基于Java的RPC分布式服务框架,主要用于提高性能和实现透明化的RPC远程服务调用以及SOA服务治理方案。简单来说,Dubbo就是一个用于分布式场景下实现远程调用的服务框架,当然Dubbo不只这个一个功能,这只是其中之一,它的核心模块还包括集群容错和自动发现等。
rpc全称Remote Procedure Call ,即远程过程调用,是一种进程间的通信方式,或者说是一种思想,用于解决不同服务器键的进程调用。

上图是RPC的调用流程图,具体的过程在Dubbo框架时会再介绍。对于上图中的关键点有两个,一个是建立连接,另一个是序列化和反序列化。
为什么说这两个是关键的地方呢,这是由于在分布式服务架构中,服务的调用基于网络传递,这时数据就需要进行序列化和反序列化的操作,因此服务器的性能也就取决于我们选择的RPC框架是否能够迅速的建立连接和实现序列化、反序列化。

节点说明
| 节点 | 说明 |
| Provider | 服务提供者 |
| Consumer | 服务消费者 |
| Registry | 服务注册(发现)中心 |
| Moniter | 服务监控中心(统计调用次数和调用时间) |
| Container | 服务运行容器 |
1、服务容器负责启动,加载,运行服务提供者;
2、服务提供者在启动时,向注册中心注册自己提供的服务;
3、服务消费者在启动时,向注册中心订阅自己所需的服务;
4、注册中心返回服务提供者地址列表给消费者;
5、服务消费者基于负载均衡算法,从提供者地址列表中,选择一位提供者进行调用,如果调用失败,再选另一位调用。
6、服务消费者和提供者,在内存中累计调用次数和调用时间,定时每分钟发送一次统计数据到监控中心。
- /**
- 实战中,会将所有服务接口设计给一个叫做api的服务,单独维护,此处就在common服务设置*/
-
- public interface IProductService {
-
- Product findByPid(Integer pid);
-
- }
-
- <dependency>
- <groupId>com.alibaba.cloudgroupId>
- <artifactId>spring-cloud-starter-dubboartifactId>
- dependency>
- dubbo:
- scan:
- base-packages: com.apesource.service.impl # 开启包扫描
- protocols:
- dubbo:
- name: dubbo # 服务协议
- port: -1 # 服务端口 使用随机端口
- registry:
- address: spring-cloud://localhost # 注册中心
- //暴露服务:注意这里使用的是dubbo提供的注解@Service,而不是Spring的
- @Service
- public class ProductServiceImpl implements ProductService {
- @Autowired
- private ProductDao productDao;
- @Override
- public Product findByPid(Integer pid) {
- return productDao.findById(pid);
- }
- }
-
- <dependency>
- <groupId>com.alibaba.cloudgroupId>
- <artifactId>spring-cloud-starter-dubboartifactId>
- dependency>
- dubbo:
- registry:
- address: spring-cloud://localhost # 注册中心
- cloud:
- subscribed-services: service-product # 订阅的提供者名称
- @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;
- }
- }