微服务 服务拆分及远程调用2
1.服务拆分
1.1服务拆分注意事项
-
单一职责:不同微服务,不要重复开发相同业务 数据独立:不要访问其它微服务的数据库 面向服务:将自己的业务暴露为接口,供其它微服务调用
1.2服务拆分案例
代码
cloud-demo:父工程,管理依赖
-
order-service:订单微服务,负责订单相关业务 user-service:用户微服务,负责用户相关业务
要求:
-
订单微服务和用户微服务都必须有各自的数据库,相互独立 订单服务和用户服务都对外暴露 Restful 的接口 订单服务如果需要查询用户信息,只能调用用户服务的 Restful 接口,不能查询用户数据库
微服务项目下,打开 idea 中的 Service,可以很方便的启动。
启动完成后,访问
启动完成后,访问
总结: 微服务需要根据业务模块拆分,做到单一职责,不要重复开发相同业务 微服务可以将业务暴露为接口,供其它微服务使用 不同微服务都应该有自己独立的数据库
2.远程调用
2.1需求
根据订单id查询订单的同时,把订单所属的用户信息一起返回
订单服务如果需要查询用户信息,只能调用用户服务的 Restful 接口,不能查询用户数据库。
2.2调用分析
如果订单模块也能发送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访问
总结: 基于RestTemplate发起的http请求实现远程调用 http请求做远程调用是与语言无关的调用,只要知道对方的ip、端口、接口路径、请求参数即可。
3.提供者与消费者
-
服务提供者:一次业务中,被其它微服务调用的服务。(提供接口给其它微服务) 服务消费者:一次业务中,调用其它微服务的服务。(调用其它微服务提供的接口)
在上述案例中:
总结: 服务提供者:暴露接口给其它微服务调用 服务消费者:调用其它微服务提供的接口 提供者与消费者角色其实是相对的 一个服务可以同时是服务提供者和服务消费者
学自黑马程序员
下一篇:
微服务(二)服务拆分及远程调用