What
-
分布式:就是指有多个系统,如A模块调用B模块的接口
-
微服务:一种软件架构风格,传统项目所有功能都写在一起,微服务就是把这些功能拆成若干个小项目,最后组装成一个大项目,比如支付功能就只实现支付,每个小项目都可以部署在不同的地方,互相调用
Why:在不同服务器上的A模块 调用 B模块
微服务常见框架如下
SpringCloud
提供了一套微服务实现标准,由很多公司实现(一个标准 / 接口,多个实现)

核心组件
没有什么问题是加了中间件解决不了的,如果有,那就多加
众所周知,服务之间的调用需要发网络请求(HTTP),而Spring自带的RestTemplate存在诸多问题
所以,springcloud带来了注册中心nacos,让各个服务知道彼此的信息
1. 注册中心:Nacos
类似Nginx,常见的还有Eureka,consul
告诉系统你这服务叫啥,想用你的时候直接叫你名儿
原理
-
负载均衡(规定 同一个服务被多实例部署(多个端口部署),到底该请求谁)
-
心跳机制:服务会和nacos定期发请求,看看你活着没
挂了:把该服务移除,并且推送变更消息
安装部署
通过doker,具备图形化界面,需绑定数据库,http://192.168.150.101:8848/nacos/
服务注册
引入依赖
Yaml配置nacos地址:服务名称,nacos地址
配置管理
服务发现与调用(白雪,nacos自带的十分变态,因此要用OpenFeign)
引入依赖
Yaml配置nacos地址
发现并调用服务:使用DiscoveryClient类,配置服务名称,请求方式和路径,返回值类型,请求参数,手写负载均衡
2. 服务调用:OpenFeign
让Java发起HTTP请求更加优雅
咋用
引入依赖
在启动类开启:@EnableFeignClients
编写OpenFeign客户端,标记类为Feign的客户端。这里只需要声明接口,无需实现方法。接口中的几个关键信息:
使用FeignClient,一行搞定
最佳实践
这个功能放在哪里好?我是耦合在原代码还是新建个模块?在实际的使用会有两种方案
-
单project,新建一个api模块即可
-
每个微服务就是一个project,新建一个service
日志输出
3. 负载均衡:loadbalancer
已被OpenFeign继承
现在B模块被部署在多个节点上,A到底请求哪一个节点
老版用Ribbon
4. 网关:Gateway
我的服务在不同的服务器,端口咋办?到底要请求谁?如果有身份认证怎么办?
叮叮叮,网关来了!同种类的还有zuul
网络关口,负责将前端的请求路由、转发、身份校验

5. 熔断:Hystrix / Sentinal
设定请求上限 -> B规定只接受100个,结果A发了105个,超过的会直接拒绝,类似保险丝
分布式事务
我每个微服务都有自己独立的数据库,还能保持数据的ACID吗?(原子性,一致性,隔离性,持久性)
W:一个业务的执行,还需要依赖别的业务,这些业务需要保持同时成功或失败。也就是单体事务的多体进化。
解决方案:Seata
部分信息可能已经过时






