单体架构的优缺点如下:
优点:
缺点:
分布式架构的优缺点:
优点:
缺点:
分布式架构虽然降低了服务耦合,但是服务拆分时也有很多问题需要思考:
人们需要制定一套行之有效的标准来约束分布式架构。
微服务的架构特征:
微服务的上述特性其实是在给分布式架构制定一个标准,进一步降低服务之间的耦合度,提供服务的独立性和灵活性。做到高内聚,低耦合。
因此,可以认为微服务是一种经过良好架构设计的分布式架构方案 。
但方案该怎么落地?选用什么样的技术栈?全球的互联网公司都在积极尝试自己的微服务落地方案。
其中在 Java 领域最引人注目的就是 SpringCloud 提供的方案了。
单体架构:简单方便,高度耦合,扩展性差,适合小型项目。例如:学生管理系统
分布式架构:松耦合,扩展性好,但架构复杂,难度大。适合大型互联网项目,例如:京东、淘宝
微服务:一种良好的分布式架构方案
① 优点:拆分粒度更小、服务更独立、耦合度更低
② 缺点:架构非常复杂,运维、监控、部署难度提高
SpringCloud 是微服务架构的一站式解决方案,集成了各种优秀微服务功能组件
微服务拆分时的几个原则:
cloud-demo:父工程,管理依赖
要求:
cloud-order.sql
和cloud-user.sql
导入到 mysql 中:其中的 user 为 null
在 user-service 中有一个根据 id 查询用户的接口:
查询的结果如图:
因此,我们需要在 order-service 中 向 user-service 发起一个 http 的请求,调用 http://localhost:8081/user/{userId}这个接口。
大概的步骤是这样的:
package com.alex.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("com.alex.order.mapper")
@SpringBootApplication
public class OrderApplication {
public static void main(String[] args) {
SpringApplication.run(OrderApplication.class, args);
}
@Bean
public RestTemplate restTemplate() {
return new RestTemplate();
}
}
在服务调用关系中,会有两个不同的角色:
服务提供者:一次业务中,被其它微服务调用的服务。(提供接口给其它微服务)
服务消费者:一次业务中,调用其它微服务的服务。(调用其它微服务提供的接口)
但是,服务提供者与服务消费者的角色并不是绝对的,而是相对于业务而言。
如果服务 A 调用了服务 B,而服务 B 又调用了服务 C,服务 B 的角色是什么?
因此,服务 B 既可以是服务提供者,也可以是服务消费者。