• 基于Dubbo实现服务的远程调用


    目录

    前言

    RPC思想

    为什么使用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不只这个一个功能,这只是其中之一,它的核心模块还包括集群容错和自动发现等。

    RPC思想

    rpc全称Remote Procedure Call ,即远程过程调用,是一种进程间的通信方式,或者说是一种思想,用于解决不同服务器键的进程调用。

    上图是RPC的调用流程图,具体的过程在Dubbo框架时会再介绍。对于上图中的关键点有两个,一个是建立连接,另一个是序列化和反序列化。

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

    为什么使用Dubbo

    • Dubbo可以讲核心的业务抽离出来,作为独立的服务,形成稳定的服务中心,以实现代码的灵活复用和拓展。
    • Dubbo的配置方式对应用没有任何侵入,做到了透明化接入应用,只需要Spring加载Dubbo配置即可
    • 再分布式架构下,可以承担更大规模的流量并发

     Dubbo技术框架

     节点说明

    节点说明
    Provider服务提供者
    Consumer服务消费者
    Registry服务注册(发现)中心
    Moniter服务监控中心(统计调用次数和调用时间)
    Container服务运行容器

    调用关系流程

    1、服务容器负责启动,加载,运行服务提供者;
    2、服务提供者在启动时,向注册中心注册自己提供的服务;
    3、服务消费者在启动时,向注册中心订阅自己所需的服务;
    4、注册中心返回服务提供者地址列表给消费者;
    5、服务消费者基于负载均衡算法,从提供者地址列表中,选择一位提供者进行调用,如果调用失败,再选另一位调用。
    6、服务消费者和提供者,在内存中累计调用次数和调用时间,定时每分钟发送一次统计数据到监控中心。

    基础实现

    A.提供统一业务Api

    1. /**
    2. 实战中,会将所有服务接口设计给一个叫做api的服务,单独维护,此处就在common服务设置*/
    3. public interface IProductService {
    4. Product findByPid(Integer pid);
    5. }

     B.编辑服务提供者Product

    B.a 添加依赖
    1. <dependency>
    2. <groupId>com.alibaba.cloudgroupId>
    3. <artifactId>spring-cloud-starter-dubboartifactId>
    4. dependency>
    B.b 添加Dubbo 配置(基于yaml配置文件)
    1. dubbo:
    2. scan:
    3. base-packages: com.apesource.service.impl # 开启包扫描
    4. protocols:
    5. dubbo:
    6. name: dubbo # 服务协议
    7. port: -1 # 服务端口 使用随机端口
    8. registry:
    9. address: spring-cloud://localhost # 注册中心
    B.c 编写并暴露服务
    1. //暴露服务:注意这里使用的是dubbo提供的注解@Service,而不是Spring的
    2. @Service
    3. public class ProductServiceImpl implements ProductService {
    4. @Autowired
    5. private ProductDao productDao;
    6. @Override
    7. public Product findByPid(Integer pid) {
    8. return productDao.findById(pid);
    9. }
    10. }

    C.编辑服务消费者

    C.a 添加依赖
    1. <dependency>
    2. <groupId>com.alibaba.cloudgroupId>
    3. <artifactId>spring-cloud-starter-dubboartifactId>
    4. dependency>
    C.b 添加Dubbo配置
    1. dubbo:
    2. registry:
    3. address: spring-cloud://localhost # 注册中心
    4. cloud:
    5. subscribed-services: service-product # 订阅的提供者名称
    C.c 引用服务
    1. @RestController
    2. public class OrderController {
    3. @Autowired
    4. private OrderService orderService;
    5. //引用服务
    6. @Reference
    7. private IProductService productService;
    8. @RequestMapping("/order/prod/{pid}")
    9. public Order order(@PathVariable Integer pid) {
    10. System.out.println("接收到{}号商品的下单请求,接下来调用商品微服务查询此商品信息"+pid);
    11. //调用商品微服务,查询商品信息
    12. Product product = productService.findByPid(pid);
    13. //下单(创建订单)
    14. Order order = new Order();
    15. order.setUid(1);
    16. order.setUsername("测试用户");
    17. order.setPid(pid);
    18. order.setPname(product.getPname());
    19. order.setPprice(product.getPprice());
    20. order.setNumber(1);
    21. orderService.createOrder(order);
    22. System.out.println("创建订单成功,订单信息为{}"+JSON.toJSONString(order));
    23. return order;
    24. }
    25. }

  • 相关阅读:
    catkin_make编译系统
    微信商户平台转账到零钱功能接入实战
    识时务者常用语录
    uniapp实现可拖动悬浮按钮(最新版2024-7月)
    易车:互联网造车定位称王还是镜花水月
    Oracle SQL执行计划操作(3)——物化视图相关操作
    Bat笔记
    Django的网站项目开发好了,该用何种方案在Centos上部署【答:Gunicorn(uWSGI)+Nginx】
    MegEngine Inference 卷积优化之 Im2col 和 winograd 优化
    狂神说SSM之Spring5 从入门到脱发
  • 原文地址:https://blog.csdn.net/weixin_51450341/article/details/132759854