微服务 服务拆分及远程调用2

目录

1.服务拆分

1.1服务拆分注意事项

 1.2服务拆分案例

2.远程调用

2.1需求

 2.2调用分析

2.3实现

2.3.1创建一个配置类,注册RestTemplate

2.3.2在Service层调用

2.1.3访问

 3.提供者与消费者


1.服务拆分

1.1服务拆分注意事项

  • 单一职责:不同微服务,不要重复开发相同业务
  • 数据独立:不要访问其它微服务的数据库
  • 面向服务:将自己的业务暴露为接口,供其它微服务调用

微服务 服务拆分及远程调用2_第1张图片

 1.2服务拆分案例

代码cloud_demo: 微服务demo

微服务 服务拆分及远程调用2_第2张图片

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

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

要求:

  • 订单微服务和用户微服务都必须有各自的数据库,相互独立
  • 订单服务和用户服务都对外暴露 Restful 的接口
  • 订单服务如果需要查询用户信息,只能调用用户服务的 Restful 接口,不能查询用户数据库

        微服务项目下,打开 idea 中的 Service,可以很方便的启动。 

微服务 服务拆分及远程调用2_第3张图片

 启动完成后,访问 http://localhost:8081/user/1

 微服务 服务拆分及远程调用2_第4张图片

 启动完成后,访问 http://localhost:8080/order/101

微服务 服务拆分及远程调用2_第5张图片

 总结:

  1. 微服务需要根据业务模块拆分,做到单一职责,不要重复开发相同业务
  2. 微服务可以将业务暴露为接口,供其它微服务使用
  3. 不同微服务都应该有自己独立的数据库

2.远程调用

2.1需求

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

微服务 服务拆分及远程调用2_第6张图片

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

 2.2调用分析

微服务 服务拆分及远程调用2_第7张图片

 如果订单模块也能发送http请求,那么就可以通过订单模块既可以获得订单信息又能获得用户信息,如何在Java代码发起http请求?

2.3实现

        Spring 提供了一个 RestTemplate 工具,注册(注入bean)后可以发送http请求。

2.3.1创建一个配置类,注册RestTemplate

@Configuration
public class OrderConfiguration {
    /**
     * 创建RestTemplate并注入spring容器
     * @return
     */
    @Bean
    public RestTemplate restTemplate(){
        return new RestTemplate();
    }
}

2.3.2在Service层调用

@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请求,查询用户,get请求使用getForObject(),post请求使用postForObject()
        String url = "http://localhost:8081/user/"+order.getUserId();
        User user = restTemplate.getForObject(url, User.class);
        //3.封装user到order
        order.setUser(user);
        // 4.返回
        return order;
    }
}

2.1.3访问

http://localhost:8080/order/102

微服务 服务拆分及远程调用2_第8张图片

总结:

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

 3.提供者与消费者

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

在上述案例中:

微服务 服务拆分及远程调用2_第9张图片

 总结:

  • 服务提供者:暴露接口给其它微服务调用
  • 服务消费者:调用其它微服务提供的接口
  • 提供者与消费者角色其实是相对的
  • 一个服务可以同时是服务提供者和服务消费者

学自黑马程序员

你可能感兴趣的:(spring,cloud,微服务,java)