1、认识微服务-微服务对比
微服务是一种架构,这种架构是将单个的整体应用程序分割成更小的项目关联的独立服务。各个微服务之间的关联通过暴露的api来实现。这些独立的微服务不需要部署在同一个虚拟机,系统,服务器中。
1.1、单体架构
单体架构:将业务集中在一个项目中开发,打成一个包处理。
单体架构优缺点:
优点:架构简单;部署成本低。
缺点:耦合度高(维护困难,升级困难)。
1.2、分布式架构
分布式架构:根据业务功能对系统进行业务的拆分,每个业务模块作为独立项目开发,称为一个服务。
分布式架构优缺点:
优点:降低系统耦合;有利于服务升级和拓展。
缺点:服务间调用关系复杂。
1.3、微服务
微服务架构特征:
单一职责:微服务拆分粒度更小,每一个服务都对应唯一的业务能力,做到单一职责。
自治:团队独立,技术独立,数据独立,独立部署和交付。
面向服务:服务提供统一标准接口,与技术语言无关。
隔离性强:服务调用做好隔离、容错、降级,避免出现级联错误。
微服务的上述特性其实是在给分布式架构制定一个标准,进一步降低服务之间的耦合度,提供服务的独立性和灵活性。做到高内聚,低耦合。微服务是一种经过良好架构设计的分布式架构方案 。
1.4、微服务之间的对比
1.4.1、微服务结构
微服务这种方案需要技术框架来落地,全球的互联网公司都在积极尝试自己的微服务落地技术。在国内最知名的就是SpringCloud和阿里巴巴的Dubbo。
1.4.2、微服务之间对比
1.4.3、使用方式
1.4、SpringCloud
SpringCloud是目前使用最广泛的微服务架构。SpringCloud集成了各种微服务功能组件,并基于SpringBoot实现了这些组件的自动装配,从而提供了良好的开箱即用体验。
其中常见的组件包括:
SpringCloud底层是依赖于SpringBoot的,并且有版本的兼容关系,如下:
1.5、总结
单体架构:简单方便,高度耦合,扩展性差,适合小型项目。例如:学生管理系统
分布式架构:松耦合,扩展性好,但架构复杂,难度大。适合大型互联网项目,例如:京东、淘宝
微服务:一种良好的分布式架构方案
①优点:拆分粒度更小、服务更独立、耦合度更低
②缺点:架构非常复杂,运维、监控、部署难度提高
SpringCloud是微服务架构的一站式解决方案,集成了各种优秀微服务功能组件
2、服务拆分与远程调用
任何分布式架构都离不开服务拆分。
2.1、服务拆分
微服务拆分几个原则:
①、不同微服务,不可以重复开发相同业务。
②、微服务数据独立,不能访问其他微服务数据库。
③、微服务可以将自己的业务暴露为接口,供其他微服务调用。
2.2、服务拆分示例
示例架构:
cloud-demo:父工程,管理依赖
order-service:订单微服务,负责订单相关业务
user-service:用户微服务,负责用户相关业务
要求:
订单微服务和用户微服务都必须有各自的数据库,相互独立
订单服务和用户服务都对外暴露Restful的接口
订单服务如果需要查询用户信息,只能调用用户服务的Restful接口,不能查询用户数据库、
2.2.1.导入Sql语句
首先,将提供的cloud-order.sql和cloud-user.sql导入到mysql中:
cloud-user表中初始数据如下:
cloud-order表中初始数据如下:
cloud-order表中持有cloud-user表中的id字段。
2.2.2.导入demo工程
用IDEA导入课前资料提供的Demo:
项目结构如下:
2.3、实现远程调用
(1)、在order-service服务中,有一个根据id查询订单的接口:
(2)、根据id查询订单,返回值是Order对象,其中的user为null,如图:
(3)、在user-service中有一个根据id查询用户的接口:
(4)、查询结果如下:
2.3.1.案例需求
修改order-service中的根据id查询订单业务,要求在查询订单的同时,根据订单中包含的userId查询出用户信息,一起返回。
所以,需要在order-service中向user-service发起一个http请求,调用http://localhost:8081/user/{userId}这个接口。
实现步骤:
①、注册一个RestTemplate实例到Spring容器中
②、修改order-service服务中的OrderService类中的queryOrderById方法,根据Order对象中的userId查询User。
③、将查询出的user封装进Order对象。
2.3.2、注册RestTemplate
首先,在order-service服务中的OrderApplication启动类中,注册RestTemplate实例:
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容器
* 可以发送http请求
* @return
*/
@Bean
public RestTemplate restTemplate() {
return new RestTemplate();
}
}
2.3.3、实现远程调用
修改order-service服务中的order.service包下的OrderService类中的queryOrderById方法: