• SpringCloud 服务的拆分及远程调用


    作者:大三的土狗
    专栏:SpringCloud
    在这里插入图片描述

    前言

      任何分布式架构都离不开服务的拆分,微服务也是一样,所以我们要先在遵守微服务拆分的原则下拆分服务,然后实现远程调用。本教程是基于RestTemplate的远程调用。


    1、服务拆分

      拆分后服务的复杂性降低,所需要的维护资源显著减少,或者对人员能力的要求大大降低,拆分不仅仅是架构上的调整,也意味着要在组织结构上做出相应的适应性调整,确保拆分后的服务由相对独立的团队负责维护,尽量不要出现在不同服务之间的交叉调用。
      任何分布式架构都离不开服务的拆分,微服务也是一样。

    1、微服务拆分的原则:
    • 单一职责原、高内聚低耦合
    • 微服务数据独立,不要访问其它微服务的数据库
    • 微服务可以将自己的业务暴露为接口,供其它微服务调用

    在这里插入图片描述

    2、服务拆分示例:
    1、新建一个工程

    父工程,管理依赖

    • order-service:订单微服务,负责订单相关业务
    • user-service:用户微服务,负责用户相关业务
    • 订单微服务用户微服务 都必须有各自的数据库
    • 订单服务 如果需要查询 用户信息,只能调用用户服务的Restful接口
    2、创建数据库
    • cloud-user

    在这里插入图片描述

    cloud-user数据库里有tb_user一张表

    在这里插入图片描述

    • cloud-order

    在这里插入图片描述

    cloud-order数据库里有tb_order一张表

    在这里插入图片描述

    3、项目模块目录

    在这里插入图片描述

     首先我们在创建工程时已经导入SpringCloud的坐标以及mysql、mybatis等等。

    
        
        
            org.springframework.cloud
            spring-cloud-dependencies
            ${spring-cloud.version}
            pom
            import
        
    
        
        
            mysql
            mysql-connector-java
            ${mysql.version}
        
    
        
        
            org.mybatis.spring.boot
            mybatis-spring-boot-starter
            ${mybatis.version}
        
    
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    4、核心功能描述

    在 order-service 服务中,有一个根据id查询订单的接口:

    @RestController
    @RequestMapping("order")
    public class OrderController {
    
       @Autowired
       private OrderService orderService;
    
        @GetMapping("{orderId}")
        public Order queryOrderByUserId(@PathVariable("orderId") Long orderId) {
            // 根据id查询订单并返回
            return orderService.queryOrderById(orderId);
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    启动服务,根据id查询订单,返回值是Order对象,其中的user为null如图:
    在这里插入图片描述

    在user-service中有一个根据id查询用户的接口:

    @Slf4j
    @RestController
    @RequestMapping("/user")
    public class UserController {
    
        @Autowired
        private UserService userService;
    
        /**
         * 路径: /user/110
         *
         * @param id 用户id
         * @return 用户
         */
        @GetMapping("/{id}")
        public User queryById(@PathVariable("id") Long id) {
            return userService.queryById(id);
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19

    查询的结果如图:

    在这里插入图片描述

    3、小结

    以上就是微服务的拆分,符合了微服务拆分的原则。

    2、远程调用

      order-service中的根据id查询订单业务,在查询订单的同时,根据订单中包含的userId查询出用户信息,一起返回,此时就需要远程调用user-service服务。

    1、注册RestTemplate

      我们在启动类上或者配置类中注册RestTemplate实例:

    @Bean
    public RestTemplate restTemplate() {
    		return new RestTemplate();
    }
    
    • 1
    • 2
    • 3
    • 4
    2、现远程调用

    修改order-service服务中OrderService类中的queryOrderById方法:

    @Service
    public class OrderService {
    
        @Autowired
        private OrderMapper orderMapper;
        
        @Autowired
        private RestTemplate restTemplate;
    
        public Order queryOrderById(Long orderId) {
            // 1.查询订单
            Order order = orderMapper.findById(orderId);
            //url
            String url = "http://localhost:8081/user/" + order.getUserId();
            //发起调用
            User user = restTemplate.getForObject(url,User.class);
            //3.存入order
            order.setUser(user);
            // 4.返回
            return order;
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    3、提供者与消费者

      在服务调用关系中,会有两个不同的角色:

    服务提供者:一次业务中,被其它微服务调用的服务。(提供接口给其它微服务)

    服务消费者:一次业务中,调用其它微服务的服务。(调用其它微服务提供的接口)

    在这里插入图片描述

    4、测试

      经过 ,注册RestTemplate和修改order-service服务中OrderService类中的queryOrderById方法现远程调用之后,重新启动两个服务,访问order-service,成功在order-service服务实现了远程调用user-service

    在这里插入图片描述


    总结

      RestTemplate是由Spring框架提供的一个可用于应用中调用rest服务的类它简化了与http服务的通信方式,统一了RESTFul的标准,封装了http连接,我们只需要传入url及其返回值类型即可,较为简单,不过也存在弊端。

  • 相关阅读:
    博途1200PLC编码器速度信号采集和滤波处理
    K8S资源对象:HPA扩缩容简介;仅适用于Deployment ReplicaSet
    小黑第一次参加主持活动,没有出错被得到了鼓励,周日完赛人生中第一次山道马拉松的leetcode之旅:167. 两数之和 II - 输入有序数组
    系统架构师论文总结【持续更新】
    男孩姓舒取什么名字好听
    C# 获取Json对象中指定属性的值
    拓端tecdat|R语言实现向量自回归VAR模型
    End-to-End Adversarial-Attention Network for Multi-Modal Clustering
    【Python学习】—Python基础语法(五)
    C++ list模拟实现
  • 原文地址:https://blog.csdn.net/qq_53463544/article/details/126483865