服务拆分及远程调用
一、微服务拆分注意事项:
1、不同微服务:不能重复相关业务
2、微服务数据独立:不要访问其它微服务的数据库,有自己独立的数据库
3、微服务可以将自己的业务暴露为接口,供其它微服务调用
二、微服务远程调用
案例:两个服务各自提供两个功能:根据订单id查询订单功能,根据用户id查询用户信息
需求:根据订单id查询订单的同时,把订单所属的用户信息一起返回。
远程调用方式:
基于RedisTemplate发起的http请求实现远程调用。
具体实现:根据user服务暴露的接口,发起http请求用户信息。
package cn.itcast.order; import org.mybatis.spring.annotation.MapperScan; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.context.annotation.Bean; import org.springframework.web.client.RestTemplate; @MapperScan("cn.itcast.order.mapper") @SpringBootApplication public class OrderApplication { public static void main(String[] args) { SpringApplication.run(OrderApplication.class, args); } /** * 创建RestTemplate并注入spring容器 * @return */ @Bean public RestTemplate restTemplate(){ return new RestTemplate(); } }
package cn.itcast.order.web; import cn.itcast.order.pojo.Order; import cn.itcast.order.pojo.User; import cn.itcast.order.service.OrderService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import org.springframework.web.client.RestTemplate; @RestController @RequestMapping("order") public class OrderController { @Autowired private OrderService orderService; @Autowired private RestTemplate restTemplate; @GetMapping("{orderId}") public Order queryOrderByUserId(@PathVariable("orderId") Long orderId) { //1、根据id查询订单并返回 Order order = orderService.queryOrderById(orderId); //2、利用RestTemplate发起http请求,查询用户 String url = "http://localhost:8081/user/" + order.getUserId(); User user = restTemplate.getForObject(url, User.class); //3、封装user到Order order.setUser(user); return order; } }
2、提供者与消费者
* 服务提供者:一次业务中,被其它微服务调用的服务。(提供接口给其它微服务)
* 服务消费者:一次业务中,调用其它微服务的服务。(调用其它微服务提供的接口)
一个服务既可以是提供者,又可以是消费者。