一、何为微服务?
一种用于构建应用的架构方案,将应用进行拆分成多个核心功能,每个功能即服务,可以单独构建和部署,服务间不相互影响。
单一职责:每个服务对应唯一业务
自治:团队独立部署和交付
面向服务:提供统一标准接口
隔离性强:做好隔离避免出现级联问题
微服务架构如下
微服务实则就是在解决下面几个问题
- 客户端如何访问服务?
- 服务之间如何通信?
- 如何治理服务?
- 服务挂了如何解决?
常见的解决方案有SpringCloud Netflix、Dubbo+Zookeeper、SpringCloud Alibaba(很火)
二、微服务与其他架构的区别
1.单体架构
简单但可扩展性差,高度耦合,适合小型项目
2.分布式架构
复杂但可扩展性好,松耦合,适合大型互联网项目
3.微服务
一种良好的分布式架构方案
拆分粒度更小、服务更独立、耦合度更低,但是更复杂、运维监控部署难度更高
4.SpringCloud
微服务架构的一站式解决方案。
集成了很多优秀的微服务组件
三、服务拆分
1.服务拆分原则
- 不同微服务不出现重复业务
- 不访问其他微服务数据库
- 向外暴露自己的业务接口
下面以商城为例,对其进行拆分可以得到如下四个大模块(商品、用户、订单、支付)
2.服务拆分示例
- 订单微服务和用户微服务都必须有各自的数据库,相互独立
- 订单服务和用户服务都对外暴露Restful的接口
- 订单服务如果需要查询用户信息,只能调用用户服务的Restful接口,不能查询用户数据库
cloud-demo:父工程,管理依赖
- order-service:订单微服务,负责订单相关业务
- user-service: 用户微服务,负责用户相关业务
3.服务查询数据如下
订单服务
用户服务
四、服务调用
订单服务调用用户服务,把订单里的用户信息查询出来,思路如下
1.注册RestTemplate实例到Spring容器
2.在订单服务中调用用户服务接口
1.注册RestTemplate
在order-service服务中的OrderApplication启动类中,注册RestTemplate实例
2.远程服务调用
修改order-service服务中OrderService类中的queryOrderById方法:
public Order queryOrderById(Long orderId) {
// 1.查询订单
Order order = orderMapper.findById(orderId);
// 2.远程调用路径
String url = "http://localhost:8081/user/" + order.getUserId();
// 3.远程调用返回数据
User user = restTemplate.getForObject(url, User.class);
//存入order
order.setUser(user);
// 4.返回
return order;
}
3.服务调用成功
4.服务调用总结
基于RestTemplate发起的http请求实现远程调用
http请求做远程调用与语言无关,只需ip、端口、接口路径、请求参数即可
五、服务提供者和消费者
1.在服务调用关系中,会有两个不同的角色
服务提供者:一次业务中,被其它微服务调用的服务。(提供接口)
服务消费者:一次业务中,调用其它微服务的服务。(调用接口)
2.但是,服务提供者和服务消费者是相对业务而言的,例如:服务A调用服务B,服务B调用服务C
对于A调用B而言:A是服务消费者,B是服务提供者
对于B调用C而言:B是服务消费者,C是服务提供者