一、何为微服务?

一种用于构建应用的架构方案,将应用进行拆分成多个核心功能,每个功能即服务,可以单独构建和部署,服务间不相互影响。

单一职责:每个服务对应唯一业务
自治:团队独立部署和交付
面向服务:提供统一标准接口
隔离性强:做好隔离避免出现级联问题

微服务架构如下

微服务如何平滑切换服务 微服务教程_微服务


微服务实则就是在解决下面几个问题

  1. 客户端如何访问服务?
  2. 服务之间如何通信?
  3. 如何治理服务?
  4. 服务挂了如何解决?
常见的解决方案有SpringCloud Netflix、Dubbo+Zookeeper、SpringCloud Alibaba(很火)

微服务如何平滑切换服务 微服务教程_服务提供者_02

二、微服务与其他架构的区别

1.单体架构

简单但可扩展性差,高度耦合,适合小型项目

2.分布式架构

复杂但可扩展性好,松耦合,适合大型互联网项目

3.微服务

一种良好的分布式架构方案
拆分粒度更小、服务更独立、耦合度更低,但是更复杂、运维监控部署难度更高

4.SpringCloud

微服务架构的一站式解决方案。
集成了很多优秀的微服务组件

三、服务拆分

1.服务拆分原则

  • 不同微服务不出现重复业务
  • 不访问其他微服务数据库
  • 向外暴露自己的业务接口
下面以商城为例,对其进行拆分可以得到如下四个大模块(商品、用户、订单、支付)

微服务如何平滑切换服务 微服务教程_服务提供者_03

2.服务拆分示例

  • 订单微服务和用户微服务都必须有各自的数据库,相互独立
  • 订单服务和用户服务都对外暴露Restful的接口
  • 订单服务如果需要查询用户信息,只能调用用户服务的Restful接口,不能查询用户数据库
cloud-demo:父工程,管理依赖

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

微服务如何平滑切换服务 微服务教程_微服务_04

3.服务查询数据如下

订单服务

微服务如何平滑切换服务 微服务教程_微服务_05

用户服务

微服务如何平滑切换服务 微服务教程_服务提供者_06

四、服务调用

订单服务调用用户服务,把订单里的用户信息查询出来,思路如下

微服务如何平滑切换服务 微服务教程_服务提供者_07

1.注册RestTemplate实例到Spring容器
2.在订单服务中调用用户服务接口

1.注册RestTemplate

在order-service服务中的OrderApplication启动类中,注册RestTemplate实例

微服务如何平滑切换服务 微服务教程_微服务_08


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.服务调用成功

微服务如何平滑切换服务 微服务教程_java_09


4.服务调用总结

基于RestTemplate发起的http请求实现远程调用
http请求做远程调用与语言无关,只需ip、端口、接口路径、请求参数即可

五、服务提供者和消费者

1.在服务调用关系中,会有两个不同的角色

微服务如何平滑切换服务 微服务教程_java_10

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

2.但是,服务提供者和服务消费者是相对业务而言的,例如:服务A调用服务B,服务B调用服务C

对于A调用B而言:A是服务消费者,B是服务提供者
对于B调用C而言:B是服务消费者,C是服务提供者