SpringCloud 微服务
我是跟着黑马程序员走的。
本文全程都是 qa 格式!
本文全程都是 qa 格式!
本文全程都是 qa 格式!
认识微服务
什么是单体架构
- 将所有的功能集中在一个项目开发,打成一个包部署
单体架构有什么优点
- 架构简单
- 部署成本低
单体架构有什么缺点
- 耦合度高
什么是分布式架构
- 根据业务功能对系统进行拆分,每个业务模块作为独立项目开发,称为一个服务
分布式架构有什么优点
- 耦合度低
- 有利于服务的升级拓展
分布式架构有什么缺点
- 架构复杂
- 运维、监控、部署难度提高
分布式架构需要考虑什么问题
- 服务拆分成什么粒度
- 服务集群地址如何维护
- 服务之间如何远程调用
- 服务健康状态如何感知
- 2022/05/16:目前最好的解决方法就是使用微服务架构
什么是微服务架构
- 微服务是一种经过良好架构设计的分布式架构方案
微服务有什么特点
- 单一职责:微服务拆分力度更小,每个服务对应一个唯一的业务能力,做到单一职责,避免重复业务开发
- 面向服务:微服务对外暴露业务接口
- 自治:团队独立、技术独立、数据独立、部署独立
- 隔离性强:服务调用做好隔离、容错、降级,避免出现级联问题
服务拆分及远程调用
服务拆分需要注意什么
- 不同的微服务,不能开发重复的业务
- 不同微服务应该有自己独立的数据库。微服务数据库相互独立,不能访问其他微服务的数据库
- 需要将自己的服务(提供的功能)暴露成接口,提供给其他微服务调用
什么是远程调用
- 微服务A向微服务B发送
http请求(类似于浏览器发送请求到微服务B)来获取自己所需要的服务。
如何实现远程调用
-
将
RestTemplate类注入 spring 容器当中,通过调用RestTemplate的getForObject方法发送get请求,在方法内传入被调用微服务的url和返回的数据类型来获取数据。 -
注入 spring 容器中
/** * 创建 RestTemplate 并注入 spring 容器。 * @return RestTemplate */ @Bean public RestTemplate restTemplate() { return new RestTemplate(); } -
调用
getForObject方法发送get请求public Order queryOrderById(Long orderId) { // 1.查询订单 Order order = orderMapper.findById(orderId); // 2. 利用 RestTemplate 发送 http 请求到对应的微服务,并定义返回的数据类型。 String url = "http://localhost:8081/user/" + order.getUserId(); User user = restTemplate.getForObject(url, User.class); // 3. 封装 User 到 Order 中。 order.setUser(user); // 4.返回 return order; }
什么是提供者和消费者
- 服务提供者:在一次业务中,被其他微服务调用的的服务(提供接口给其他服务)
- 服务消费者:在一次业务中,调用其他微服务的服务。(调用其他微服务提供的接口)
如何判别提供者和消费者
- 根据一次业务中的实际情况来判断提供者和消费者
- 提供者和消费者是相对的。抛开业务不谈,一个服务既可以是提供者也可以是消费者。
Eureka 注册中心
硬编码服务调用会出现什么问题
- 消费者不知如何获取服务提供者地址信息
- 多个提供者不知如何选择
- 无法了解提供者健康状态
Eureka 架构中微服务分为哪两类
- EurekaServer 服务端,注册中心
- EurekaClient 客户端
EurekaServer 和 EurekaClient 关系
EurakaServer 有什么作用
- 记录每个微服务的服务信息,如访问功能的接口路径。
- 心跳监控,监控提供者微服务的健康状态。
EurekaClient 微服务分类和作用是什么
- EurakeClient 微服务分为消费者和提供者。
- 提供者
- 提供者会注册自己的信息到 EurekaServer (将自己的服务信息给 EurekaServer )
- 提供者会每个30秒向 EurekaServer 发送心跳(想 EurekaServer 发送自己健康状态),不发送视为心跳不正常,信息会被剔除
- 消费者
- 消费者会根据服务名称从 EurekaServer 中拉去服务列表
- 获取服务列表后做负载均衡,选中一个微服务后发起远程调用。
消费者如何获取服务提供者的具体信息
- 服务提供者在启动时会像 Eureka 注册自己的信息。Eureka 保存这些信息。消费者根据服务名称像 Eureka 拉去提供者信息。
如果多个服务提供者,消费者如何选择
- 消费者利用负载均衡算法,从服务列表中挑选一个
消费者如何感知提供者的健康状态
- 提供者每隔30秒像 EurekaServer 发送心跳请求,报告健康状态。Eureka 会跟新服务列表信息,心跳不正常会被剔除。消费者就可以拉取到最新的信息。
如何搭建 Eureka 服务
-
导入依赖
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId> </dependency> -
配置 Eureka
端口、服务名称、地址信息可以根据自己的实际需求去进行修改
server: # 注册端口是因为 eureka 自己也是微服务 port: 10086 # 这里是作为 eureka 微服务的注册,为了以后多个 eureka 微服务能互相通信 spring: application: # 配置的是 eureka的服务名称 name: eureka-server eureka: client: service-url: # 配置的是 eureka 的地址信息 defaultZone: http://127.0.0.1:10086/eureka -
开启 Eureka 微服务
在引导类上添加注解
@EnableEurekaServer@SpringBootApplication @EnableEurekaServer public class EurekaServer { public static void main(String[] args) { SpringApplication.run(EnableEurekaServer.class, args); } } -
通过配置的地址跳转到对应的页面说明成功
Eureka 服务初始化会注册自己吗
-
会的,Eureka 会注册自己。
从下图可以看出,在初始话的时候会把自己注册到 Eureka 当中。
如何创建 Eureka 注册中心
- 持续更新