You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

123 lines
5.2 KiB
Markdown

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

# 微服务通信方案
## 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)
## 6. 微服务通信总结
- Rest、Ribbon、OpenFeign 一步步的演进过程
- Rest: 需要写死服务的 ip 和端口(可以通过注册中心手动获取),灵活性低
- Ribbon: 提供基于 RestTemplate 的 HTTP 客户端并且支持服务负载均衡功能
- OpenFeign: 基于 Ribbon只需要使用注解和接口的配置即可完成对服务提供方的接口绑定
## OpenFeign 核心源码解析
## OpenFeign 应用技巧
- 认识 FeignClientsConfiguration
- 修改 Feign 的默认配置
- 自定义 @FeignClient configuration
## OpenFeign 二次改造
- 认识 MicrometerCapability
- 基于 Capability 的扩展机制
## OpenFeign 造轮子
- 手动创建 FeignClient
## OpenFeign 面试题深度解析
- Feign 和 OpenFeign 的区别
- OpenFeign 的运行原理
- FeignClient 配置方式