• 实用篇-服务拆分及远程调用


    一、服务拆分

    服务拆分(也叫项目拆分)

    注意事项:

    • 不同的微服务,不要重复开发相同的业务
    • 要求微服务之间数据独立,不要访问其他微服务的数据库
    • 微服务可用将自己的业务暴漏为接口,供其他服务调用

    1. Cloud-Demo拆分

    首先有一个已经写好的项目工程,为cloud-demo.zip,需要把这个压缩包解压并导入进idea,然后就是根据功能来拆分这个项目。这个项目的原有结构如下:

    cloud-demo是父工程,里面有两个模块是order-service、user-service,这俩模块分别的作用是根据id查询订单、根据id查询用户。这俩模块就是所谓的微服务,分是订单服务和用户服务

    项目下载地址:https://download.csdn.net/download/m0_63732435/88475934

    2. SQL导入

    项目SQL文件下载地址:https://download.csdn.net/download/m0_63732435/88475940

    3. IEDA导入项目

    IDEA打开文件夹,然后连接数据库

    启动服务,分别启动OrderApplication和UserApplication服务

    然后访问接口

     

    如果上述操作都成功,那么项目的准备工作就做好了。

    可以看到,我们的项目有两个服务,分别是用户服务和订单服务,两个服务都遵循了微服务拆分的原则:单一职责,并且数据库也做了分离,每个服务的数据库都是分隔开的

    下面将在这个Demo进行练习,如何正确使用微服务项目

    二、服务远程调用

    案例: 根据订单id查询订单功能

    需求: 根据订单id查询订单的同时,把订单所属的用户信息一起返回

    难点: 订单表、用户表在两个数据库,不是同一个数据库。订单业务、用户业务在两个项目,不是同一个项目

    解决: 服务远程调用

    1. 接口暴露

    用户项目对外暴露了一个Restful接口,如下

    @GetMapping("/{id}")

    2. 发送请求

    使用Spring提供的RestTemplate工具,作用是发送http请求

    可以在订单项目使用Spring提供的RestTemplate工具,作用是发送http请求,也就是在订单项目向用户项目发送http请求,用户项目就会返回数据给订单项目

    具体操作:

    第一步: 在订单项目的OrderApplication引导类,添加如下

    1. package cn.itcast.order;
    2. import org.mybatis.spring.annotation.MapperScan;
    3. import org.springframework.boot.SpringApplication;
    4. import org.springframework.boot.autoconfigure.SpringBootApplication;
    5. import org.springframework.context.annotation.Bean;
    6. import org.springframework.web.client.RestTemplate;
    7. @MapperScan("cn.itcast.order.mapper")
    8. @SpringBootApplication
    9. public class OrderApplication {
    10. public static void main(String[] args) {
    11. SpringApplication.run(OrderApplication.class, args);
    12. }
    13. /**
    14. * 创建RestTemplate并注入Spring容器
    15. * @return
    16. */
    17. @Bean
    18. public RestTemplate restTemplate(){
    19. return new RestTemplate();
    20. }
    21. }

    第二步: 在订单项目的OrderService类,添加如下

    1. package cn.itcast.order.service;
    2. import cn.itcast.order.mapper.OrderMapper;
    3. import cn.itcast.order.pojo.Order;
    4. import cn.itcast.order.pojo.User;
    5. import org.springframework.beans.factory.annotation.Autowired;
    6. import org.springframework.stereotype.Service;
    7. import org.springframework.web.client.RestTemplate;
    8. import java.sql.PreparedStatement;
    9. @Service
    10. public class OrderService {
    11. @Autowired
    12. private OrderMapper orderMapper;
    13. @Autowired
    14. private RestTemplate restTemplate;
    15. public Order queryOrderById(Long orderId) {
    16. // 1.查询订单
    17. Order order = orderMapper.findById(orderId);
    18. //2.利用RestTemplate发起http请求,查询用户
    19. //2.1 url路径
    20. String url = "http://localhost:8081/user/" + order.getUserId();
    21. //这个方法第一个参数是访问路径,第二个参数是把响应得到的Json数据封装成实体类对象
    22. User user = restTemplate.getForObject(url, User.class);
    23. //3.封装user到Order
    24. order.setUser(user);
    25. // 4.返回
    26. return order;
    27. }
    28. }

    3. 测试

    启动OrderApplication服务

    访问刚才访问过的接口

    可以看到响应回来的订单数据里面有对应关联的用户的相关信息 

    三、总结

    跨服务的远程调用其实就是发送一次http请求,首先是在Spring容器里面注入RestTemplate对象,然后在你发送请求的类里面自动装配这个RestTemplate对象,并且在方法里面调用这个RestTemplate对象,第一个参数是路径,第二个参数是你想拿到什么类型的数据

  • 相关阅读:
    GBase 8c 数据库内置角色
    java/获取路径user.dir和获取资源getResourceAsStream()
    数字时代的探索与革新:Socks5代理的引领作用
    Vite3.0都发布了,你还能卷得动吗(新特性一览)
    Java入门教程(11) ——基本数据类型
    Socks5代理与代理IP技术:网络工程师的全能武器
    单机服务器docker搭建mysql5.7主从同步
    flask实现python方法转换服务
    Linux+MCSM9+Docker 搭建Minecraft基岩版BDS私服,我的世界基岩版开服教程
    Bigder:40/100 怎么组织一次用例评审
  • 原文地址:https://blog.csdn.net/m0_63732435/article/details/134059571