|
|
|
|
# 微服务通信方案
|
|
|
|
|
|
|
|
|
|
## 1. 微服务通信方案解读
|
|
|
|
|
|
|
|
|
|
- 早期-第一种方案: 微服务通信方案: RPC
|
|
|
|
|
- RPC 实现微服务通信的核心思想
|
|
|
|
|
- 全局注册表: 将 RPC 支持的所有方法都注册进去
|
|
|
|
|
- 通过将 java 对象进行编码(IDL, json, xml 等) + 方法名传递(TCP/IP 协议)到目标服务器实现微服务通信
|
|
|
|
|
---
|
|
|
|
|
- RPC 的优缺点
|
|
|
|
|
- 目前市面上最流行的 RPC 框架有:gRPC、Thrift、Dubbo, 有较多的选择性
|
|
|
|
|
- 速度快、并发性能高 - (使用TCP作为传输协议)
|
|
|
|
|
- 实现复杂(相对 Rest 而言), 需要做的工作与维护上更多(例如:Server 的地址一般存储于 Zookeeper 上, 就需要引入和维护 ZK)
|
|
|
|
|
- Tip: 优缺点是相对的, 不需要拘泥于理论
|
|
|
|
|
---
|
|
|
|
|
- 第二种方案: 微服务通信方案: HTTP(Rest)
|
|
|
|
|
- 标准化的 HTTP 协议(GET、POST、PUT、DELETE 等), 前主流的微服务框架通信实现都是 HTTP
|
|
|
|
|
- 简单、标准,需要做的工作和维护工作少;几乎不需要做额外的工作即可与其他的微服务集成
|
|
|
|
|
---
|
|
|
|
|
- 第三种方案: 微服务通信方案: Message
|
|
|
|
|
- 通过 Kafka、RocketMQ 等消息队列实现消息的发布与订阅(消费)
|
|
|
|
|
- 可以实现"削峰填谷",缓冲机制实现数据、任务处理
|
|
|
|
|
- 最大的缺点是只能够做到最终一致性,而不能做到实时一致性;当然,这也是看业务需求
|
|
|
|
|
---
|
|
|
|
|
- 微服务通信该做何选择
|
|
|
|
|
- 结合微服务框架与业务的需要做出选择
|
|
|
|
|
- SpringCloud 建议的通信方案是 OpenFeign(Rest)
|
|
|
|
|
- 需要最终一致性且不要求快速响应的业务场景可以选择使用 Message(异步处理对系统性能有很大的提升)
|
|
|
|
|
- 问题来了: SpringCloud 可不可以使用 RPC 呢?(但是,要有足够强的理由说明你为什么要使用 RPC)
|
|
|
|
|
---
|
|
|
|
|
|
|
|
|
|
## 2. 使用 RestTemplate 实现微服务通信
|
|
|
|
|
|
|
|
|
|
- 使用 RestTemplate 的两种方式(思想)
|
|
|
|
|
- 在代码(或配置文件中)写死IP 和 端口号(需要知道,这并不是不可行!)
|
|
|
|
|
- 通过注册中心(推荐Nacos)获取服务地址,可以实现负载均衡的效果
|
|
|
|
|
---
|
|
|
|
|
|
|
|
|
|
## 3. Ribbon 实现微服务通信及其原理解读
|
|
|
|
|
|
|
|
|
|
- 如何使用
|
|
|
|
|
- 引入依赖: spring-cloud-starter-netflix-ribbon
|
|
|
|
|
- 增强 RestTemplate @LoadBalanced 注解.使其具备负载均衡的能力
|
|
|
|
|
|
|
|
|
|
- ps: 学习源码最好的方式就是对部分看懂的逻辑进行仿写
|
|
|
|
|
---
|
|
|
|
|
## 4. OpenFeign 的简单应用及配置
|
|
|
|
|
|
|
|
|
|
- OpenFeign 是实际企业中使用更为常见的一种使用
|
|
|
|
|
|
|
|
|
|
- 如何使用
|
|
|
|
|
- 引入依赖 spring-cloud-starter-openfeign
|
|
|
|
|
- 添加 @EnableFeignClients 注解, 启用 open-feign
|
|
|
|
|
|
|
|
|
|
- SpringCloud OpenFeign 最常用的配置
|
|
|
|
|
- OpenFeign 开启 gzip 压缩
|
|
|
|
|
- 统一 OpenFeign 使用配置: 日志、重试、请求连接和响应时间限制
|
|
|
|
|
- 使用 okhttp 替换 httpclient(别忘了引入 okhttp 依赖)
|
|
|
|
|
- feign-okhttp
|
|
|
|
|
- 补充: okhttp 和 httpclient 的区别和优缺点
|
|
|
|
|
|
|
|
|
|
- ps: 写框架或者工程加载时候的日志一般都用 debug 级别, 别总是打 info 级别的日志
|
|
|
|
|
---
|
|
|
|
|
- OkHttp和HttpClient都是Java语言中常用的HTTP客户端库,用于发送HTTP请求并处理响应。它们之间的区别如下:
|
|
|
|
|
- OkHttp是由Square公司开发的,而HttpClient是Apache软件基金会开发的。
|
|
|
|
|
- OkHttp的性能更快,更高效。因为它使用了连接池、请求压缩、缓存等技术,而HttpClient则需要手动进行配置和优化才能达到类似的效果。
|
|
|
|
|
- OkHttp支持SPDY(升级版的HTTP/1.1协议)和HTTP/2,而HttpClient只支持HTTP/1.1。
|
|
|
|
|
- OkHttp是基于异步请求的,而HttpClient只能使用同步请求。
|
|
|
|
|
- OkHttp的代码量更少,更加简洁易懂,而HttpClient的API更加复杂,使用起来需要更多的代码。
|
|
|
|
|
- OkHttp的优点:
|
|
|
|
|
- 高效,支持连接池、请求压缩、缓存等技术,性能更快。
|
|
|
|
|
- 支持SPDY和HTTP/2协议,可以更好地适应现代网络环境。
|
|
|
|
|
- 简单易用,代码量少,API清晰明了。
|
|
|
|
|
- HttpClient的优点:
|
|
|
|
|
- 稳定可靠,经过多年的发展和优化,被广泛使用和验证。
|
|
|
|
|
- 功能强大,支持重试、重定向、认证、代理、Cookie等功能,使用起来非常灵活。
|
|
|
|
|
- 综上所述,**OkHttp适用于对性能和效率要求比较高的场景,而HttpClient适用于功能比较复杂的场景。**
|
|
|
|
|
|
|
|
|
|
---
|
|
|
|
|
## 5. 通过 Feign 的原生 API 解析其实现原理
|
|
|
|
|
- ![Feign实现流程图.png](pic/Feign实现流程图.png)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
## OpenFeign 核心源码解析
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
## OpenFeign 应用技巧
|
|
|
|
|
|
|
|
|
|
- 认识 FeignClientsConfiguration
|
|
|
|
|
- 修改 Feign 的默认配置
|
|
|
|
|
- 自定义 @FeignClient configuration
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
## OpenFeign 二次改造
|
|
|
|
|
|
|
|
|
|
- 认识 MicrometerCapability
|
|
|
|
|
- 基于 Capability 的扩展机制
|
|
|
|
|
|
|
|
|
|
## OpenFeign 造轮子
|
|
|
|
|
|
|
|
|
|
- 手动创建 FeignClient
|
|
|
|
|
|
|
|
|
|
## OpenFeign 面试题深度解析
|
|
|
|
|
|
|
|
|
|
- Feign 和 OpenFeign 的区别
|
|
|
|
|
|
|
|
|
|
- OpenFeign 的运行原理
|
|
|
|
|
|
|
|
|
|
- FeignClient 配置方式
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|