SpringCloud入门(二)服务间调用和案例

一、微服务拆分注意事项

微服务拆分注意事项:

1.单一职责:不同微服务,不要重复开发相同业务

2.数据独立:不要访问其它微服务的数据库

3.面向服务:将自己的业务暴露为接口,供其它微服务调用

1.微服务需要根据业务模块拆分,做到单一职责,不要重复开发相同业务

2.微服务可以将业务暴露为接口,供其它微服务使用

3.不同微服务都应该有自己独立的数据库

二、订单和用户服务调用案例

订单和用户两个独立服务;有两个单独的数据库,

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

不要重复开发业务,不能直接查数据库,服务是独立的看不见别人的数据库。

订单向用户发起远程调用;如何完成远程调用;远程调用方式分析: 发起http请求。如下图:

使用 spring提供的 RestTemplate http请求;通过bean注测为spring对象;

基于RestTemplate发起的http请求实现远程调用。http请求做远程调用是与语言无关的调用,只要知道对方的ip、端口、接口路径、请求参数即可。

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

使用步骤:

步骤是这样的:

步骤一、注册一个RestTemplate的实例到Spring容器

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

复制代码
@MapperScan("cn.it.order.mapper")
@SpringBootApplication
public class OrderApplication {
 
    public static void main(String[] args) {
        SpringApplication.run(OrderApplication.class, args);
    }
 
    @Bean
    public RestTemplate restTemplate() {
        return new RestTemplate();
    }
}

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

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

步骤三、将查询的User填充到Order对象,一起返回

复制代码
@Service
public class OrderService {
 
    @Autowired
    private OrderMapper orderMapper;
 
 
    @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;
    }
    
   
}

三、服务的提供者和消费者概念

-提供者与消费者

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

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

-服务调用关系:

服务提供者:暴露接口给其它微服务调用

服务消费者:调用其它微服务提供的接口

提供者与消费者角色其实是相对的

一个服务可以同时是服务提供者和服务消费者

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

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

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

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

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

相关推荐
ruleslol2 天前
Spring Cloud Gateway 断言完全讲解
springcloud
whltaoin2 天前
【 Java微服务 】Spring Cloud Alibaba :Nacos 注册中心与配置中心全攻略(含服务发现、负载均衡与动态配置)
java·微服务·nacos·springcloud·注册中心·配置中心
灰小猿7 天前
分布式项目集成TLog实现轻量级日志链路追踪
java·分布式·springcloud·tlog·日志链路追踪
最后1118 天前
lamp-cloud 5.7.0 发布,新增缓存清理 + 修复优化全覆盖
java·后端·spring·缓存·springboot·springcloud
漂流幻境8 天前
Spring cloud gateway 跨域配置与碰到的问题
java·gateway·springcloud·跨域
小坏讲微服务9 天前
Docker Compose搭建Git仓库私服上传微服务
分布式·git·docker·微服务·容器·springcloud·springalibaba
小坏讲微服务9 天前
Spring Cloud Alibaba整合SkyWalking的监控完整使用
java·微服务·架构·springcloud·监控·skywalking·java微服务
小坏讲微服务12 天前
Spring Cloud Alibaba 2025.0.0 与 Nacos 3.1.0 集群整合
分布式·nacos·架构·springcloud·nacos集群·springalibaba
没有bug.的程序员12 天前
Spring Cloud Gateway 性能优化与限流设计
java·spring boot·spring·nacos·性能优化·gateway·springcloud
serendipity_hky17 天前
【微服务 - easy视频 | day01】准备工具+gateway网关及路由至内部服务
java·微服务·架构·gateway·springcloud