1、什么是 RPC?目前有哪些常见的 RPC 框架?实现 RPC 框架的核心原理是什么?
RPC(Remote Procedure Call)即远程过程调用,是一种分布式系统中的通信方式,它允许不同的进程在不同的机器之间相互调用,就像调用本地函数一样,从而实现分布式系统中的模块化和协作。
常见的 RPC 框架包括:
gRPC:由 Google 开发的高性能、开源的 RPC 框架,支持多种语言,包括 C++、Java、Python 等。
Apache Dubbo:由阿里巴巴开源的高性能 RPC 框架,支持多种协议和序列化方式,包括 HTTP、Hessian、JSON 等。
Apache Thrift:由 Facebook 开源的跨语言 RPC 框架,支持多种语言和多种传输方式,包括 TCP、UDP、HTTP 等。
Spring Cloud:基于 Spring Boot 开发的微服务框架,提供了包括 Feign、Ribbon、Hystrix 等组件在内的多个 RPC 解决方案。
实现 RPC 框架的核心原理是远程代理技术。在 RPC 中,远程调用的本质是通过网络传输序列化后的参数和方法名到远程主机上,并由远程主机上的代理对象接收请求,最终将结果序列化并通过网络返回给本地主机。远程代理对象需要封装网络通信、序列化和反序列化等细节,并提供与本地对象相同的接口,以便本地代码可以像调用本地对象一样调用远程对象。
具体来说,实现 RPC 框架的核心步骤包括:
定义接口:定义远程服务的接口和方法,并确定参数类型和返回值类型。
序列化参数:将方法调用的参数序列化成二进制数据,并将方法名和序列化后的参数一起传输到远程主机上。
网络传输:将序列化后的参数和方法名通过网络传输到远程主机上。
反序列化参数:远程主机接收到请求后,将序列化的参数和方法名反序列化为本地对象,并调用本地对象的方法。
序列化返回值:本地对象方法执行完毕后,将返回值序列化为二进制数据,并通过网络返回给本地主机。
反序列化返回值:本地主机接收到返回值后,将返回值反序列化为本地对象,并返回给本地代码。
通过以上步骤,实现了远程主机上的对象可以被本地代码调用,实现了分布式系统的协作。
2、设计模式可以分为哪几类?一共有多少种主流的设计模式?
设计模式按照目的和功能的不同,可以分为三大类:
创建型模式(Creational Patterns):这些模式专注于对象的创建,解决了如何创建对象的问题。通常,这些模式都有一个工厂对象,负责创建其他对象。
共五种设计模式:简单工厂模式、工厂方法模式、抽象工厂模式、单例模式和建造者模式。
结构型模式(Structural Patterns):模式专注于对象的组合和关联,解决了如何组成对象的问题,都涉及到类和对象之间的关系。
共七种设计模式,分别是适配器模式、装饰器模式、代理模式、外观模式、桥接模式、组合模式和享元模式。
行为型模式(Behavioral Patterns):这些模式专注于对象之间的通信,解决了如何让对象相互协作的问题,都涉及到算法和对象的职责分配。
共十一种设计模式:策略模式、模板方法模式、观察者模式、迭代器模式、责任链模式、命令模式、备忘录模式、状态模式、访问者模式、中介者模式和解释器模式。
主流的设计模式共有 23 种,它们是:
简单工厂模式(Simple Factory Pattern):一个工厂对象负责根据传入的参数创建不同的对象实例。
工厂方法模式(Factory Method Pattern):每个具体的类都有自己的工厂方法,负责创建对象实例。
抽象工厂模式(Abstract Factory Pattern):一组相关或相互依赖的对象,由一个抽象工厂对象负责创建。
单例模式(Singleton Pattern):确保类只有一个实例,并提供全局访问点。
建造者模式(Builder Pattern):将一个复杂对象的构建过程分解为多个简单对象的构建过程。
原型模式(Prototype Pattern):一种创建型设计模式,它通过克隆已有对象来创建新的对象,而不是通过实例化对象来创建。
适配器模式(Adapter Pattern):将一个类的接口转换成客户希望的另一个接口。
装饰器模式(Decorator Pattern):动态地为对象增加新的功能。
代理模式(Proxy Pattern):为其他对象提供一种代理以控制对这个对象的访问。
外观模式(Facade Pattern):为复杂的子系统提供一个简单的接口。
桥接模式(Bridge Pattern):将抽象部分与它的实现部分分离,使它们都可以独立地变化。
组合模式(Composite Pattern):将对象组合成树形结构以表示部分-整体的层次结构。
享元模式(Flyweight Pattern):通过共享技术来实现大量细粒度对象的复用。
策略模式(Strategy Pattern):定义一系列算法,将它们封装起来,并且使用他们可以相互替换。
模板方法模式(Template Method Pattern):定义一个算法的骨架,将一些步骤延迟到子类中实现。
观察者模式(Observer Pattern):定义对象间的一种一对多的依赖关系,当一个对象状态发生改变时,所有依赖于它的对象都得到通知并自动更新。
迭代器模式(Iterator Pattern):提供一种方法顺序访问一个聚合对象中各个元素,而且又不暴露该对象的内部表示。
责任链模式(Chain of Responsibility Pattern):为某个请求创建一个对象链,处理该请求的对象沿着该练依次处理,知道一个对象处理它为止。
命令模式(Command Pattern):将一个请求封装成一个对象,使发出请求的责任和执行请求的责任分割开。
备忘录模式(Memento Pattern):它允许在不暴露对象实现细节的情况下,保存和恢复对象之前的状态。
状态模式(State Pattern):允许对象在其内部状态改变时改变它的行为。
访问者模式(Visitor Pattern):封装一些作用于某种数据结构中的各元素的操作,它可以在不改变这个数据结构的前提下定义作用于这些元素的新操作。
中介者模式(Mediator Pattern):通过封装一系列对象之间的交互,来降低对象之间的耦合度。