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