首页 > 其他分享 >服务拆分和远程调用

服务拆分和远程调用

时间:2022-12-04 21:47:13浏览次数:49  
标签:调用 服务 service RestTemplate order user 拆分 远程

任何分布式架构都离不开服务的拆分,微服务也是一样。

1.服务拆分原则

这里我总结了微服务拆分时的几个原则:

  • 不同微服务,不要重复开发相同业务

  • 微服务数据独立,不要访问其它微服务的数据库

  • 微服务可以将自己的业务暴露为接口,供其它微服务调用

 

2.服务拆分示例

cloud-demo:父工程,管理依赖

  • order-service:订单微服务,负责订单相关业务

  • user-service:用户微服务,负责用户相关业务

要求:

  • 订单微服务和用户微服务都必须有各自的数据库,相互独立

  • 订单服务和用户服务都对外暴露Restful的接口

  • 订单服务如果需要查询用户信息,只能调用用户服务的Restful接口,不能查询用户数据库

3.实现远程调用案例

3.1.案例需求:

修改order-service中的根据id查询订单业务,要求在查询订单的同时,根据订单中包含的userId查询出用户信息,一起返回。

 

因此,我们需要在order-service中 向user-service发起一个http的请求,调用http://localhost:8081/user/{userId}这个接口。

大概的步骤是这样的:

  • 注册一个RestTemplate的实例到Spring容器

  • 修改order-service服务中的OrderService类中的queryOrderById方法,根据Order对象中的userId查询User

  • 将查询的User填充到Order对象,一起返回

3.2.注册RestTemplate

首先,我们在order-service服务中的OrderApplication启动类中,注册RestTemplate实例:

@MapperScan("cn.itcast.order.mapper")
@SpringBootApplication
public class OrderApplication {

    public static void main(String[] args) {
        SpringApplication.run(OrderApplication.class, args);
    }

    @Bean
    public RestTemplate restTemplate() {
        return new RestTemplate();
    }
}

3.3.实现远程调用

修改order-service服务中的cn.itcast.order.service包下的OrderService类中的queryOrderById方法:

    @Autowired
    private RestTemplate restTemplate;

    public Order queryOrderById(Long orderId) {
        // 1.查询订单
        Order order = orderMapper.findById(orderId);
        // 2.利用RestTemplate发起http请求,查询用户
        // 2.1.url路径
        String url = "http://userservice/user/" + order.getUserId();
        // 2.2.发送http请求,实现远程调用
        User user = restTemplate.getForObject(url, User.class);
        // 3.封装user到Order
        order.setUser(user);
        // 4.返回
        return order;
    }

4.提供者与消费者

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

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

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

但是,服务提供者与服务消费者的角色并不是绝对的,而是相对于业务而言。

如果服务A调用了服务B,而服务B又调用了服务C,服务B的角色是什么?

  • 对于A调用B的业务而言:A是服务消费者,B是服务提供者

  • 对于B调用C的业务而言:B是服务消费者,C是服务提供者

 

因此,服务B既可以是服务提供者,也可以是服务消费者。

 

标签:调用,服务,service,RestTemplate,order,user,拆分,远程
From: https://www.cnblogs.com/kisshappyboy/p/16950876.html

相关文章

  • 10 虚拟机字节码执行引擎_方法调用
    目录1关于方法调用2方法解析3方法分派3.1静态分派3.1.1静态分派概述3.1.2方法重载分析3.1.3静态类型和动态类型3.2动态分派3.2.1invokevirtual指令详解3.2.2动态......
  • 动态规划_整数拆分
    '给定一个正整数n,将其拆分为至少两个正整数的和,并使这些整数的乘积最大化。返回你可以获得的最大乘积。'示例1:'输入:2'输出:1'解释:2=1+1,1×1=1。'......
  • web调用本地exe应用程序并传入参数
    1、exe创建注册表2、web启动exe,并传真userId3、exe取得服务器授权sig4、web取得推流地址:'http://v.ju918.com/live/26185_21639.m3u8'从网页中通过自定义URLProtocol......
  • 一个项目如何实现多源文件调用
    大家晚上好呀,今天要给大家分享的是如何在一个项目里实现两个源文件调用或多个源文件调用。首先还是由一个题目入手。这个题目有一定的难度,对于我来说,但是其实里面有个知识点......
  • Juyter连接远程服务器(本地通过SSH连接远程服务器并连接到jupyter)
       ......
  • Python调用接口鲁棒化处理防止阻塞
    如果是同其他团队或者系统协作开发,无法保证对方的接口不出问题,所以要考虑一种鲁棒的方法,保证自己的程序不管什么情况下都可以有合适的值返回。1.如果调用对方接口网络不同......
  • vscode免密连接远程服务器
    下载两个扩展  出现“远程资源管理器”选项:点击上图+号,输入ssh地址[ssh用户名@服务器地址]  点击上图设置(+号右边)  选择第一个选项,输入服务器信息,如下:......
  • 查看前端页面调用接口及参数方法
    查看前端页面调用接口及参数方法依该页面的查询按钮为例(浏览器为Goole)  第一步:摁一下键盘上的F12①会看到调试信息框出现在了右边,由于屏幕的原因,让这个信息框在右边......
  • Webcam.getWebcamByName(“XXX“)的用法/Webcam调用摄像头的方法
    Webcam.getWebcamByName(“XXX”)的用法网上的资料很多都是Webcam.getDefault(),但是调用此方法时只能调用系统默认摄像头,在我的笔记本上只能调用我笔记本上的摄像头,而我希......
  • ASP.NET中如何调用存储过程
     用ASP.NET与SQLSERVER可是缘份最好了,稍大的程序一般第一先考虑的是SQLSERVER,只是一些很考虑经济的才使用ACCESS等了。用SQLSERVER,为了使数据库的效率更好,一般都会才取......