微服务常用组件
# 一、常见的API网关
# 1.1、Nginx
Nginx 是一个高性能的HTTP和反向代理服务器。Nginx一方面可以做反向代理,另外一方面可以做静态资源服务器,接口使用Lua动态语言可以完成灵活的定制功能。
Nginx 在启动后,会有一个 Master 进程和多个 Worker 进程,Master 进程和 Worker 进程之间是通过进程间通信进行交互的。Nginx 采用了异步非阻塞的方式来处理请求,也就是说,Nginx 是可以同时处理成千上万个请求的。
# 1.2、Zuul
Zuul 是 Netflix 开源的一个API网关组件,它可以和 Eureka、Ribbon、Hystrix 等组件配合使用。社区活跃,融合于 SpringCloud 完整生态,是构建微服务体系前置网关服务的最佳选型之一。
Zuul 目前有两个大的版本:Zuul1 和 Zuul2
Zuul1 是基于 Servlet 框架构建,它采用的是阻塞和多线程方式,即一个线程处理一次连接请求,这种方式在内部延迟严重、设备故障较多情况下会引起存活的连接增多和线程增加的情况发生。
Netflix 发布的 Zuul2 有重大的更新,它运行在异步和无阻塞框架上,每个 CPU 核一个线程,处理所有的请求和响应,请求和响应的生命周期是通过事件和回调来处理的,这种方式减少了线程数量,因此开销较小。
# 1.3、SpringCloud Gateway
Spring Cloud Gateway 是Spring Cloud 的一个全新的API网关项目,目的是为了替换掉Zuul1,它基于Spring5.0 + SpringBoot2.0 + WebFlux(基于⾼性能的Reactor模式响应式通信框架Netty,异步⾮阻塞模型)等技术开发,性能⾼于Zuul,官⽅测试,Spring Cloud GateWay是Zuul的1.6倍,旨在为微服务架构提供⼀种简单有效的统⼀的API路由管理⽅式。
Spring Cloud Gateway可以与Spring Cloud Discovery Client(如Eureka)、Ribbon、Hystrix等组件配合使用,实现路由转发、负载均衡、熔断、鉴权、路径重写、⽇志监控等,并且Gateway还内置了限流过滤器,实现了限流的功能。
# 1.4、Kong
Kong是一款基于OpenResty(Nginx + Lua模块)编写的高可用、易扩展的,由Mashape公司开源的API Gateway项目。Kong是基于NGINX和Apache Cassandra或PostgreSQL构建的,能提供易于使用的RESTful API来操作和配置API管理系统,所以它可以水平扩展多个Kong服务器,通过前置的负载均衡配置把请求均匀地分发到各个Server,来应对大批量的网络请求。
Kong主要有三个组件:
Kong Server :基于Nginx的服务器,用来接收API请求。 Apache Cassandra/PostgreSQL :用来存储操作数据。 Kong dashboard:官方推荐UI管理工具,也可以使用 restfull 方式管理admin api。 Kong采用插件机制进行功能定制,插件集(可以是0或N个)在API请求响应循环的生命周期中被执行。插件使用Lua编写,目前已有几个基础功能:HTTP基本认证、密钥认证、CORS(Cross-Origin Resource Sharing,跨域资源共享)、TCP、UDP、文件日志、API请求限流、请求转发以及Nginx监控。
# 1.5、Traefik
Træfɪk 是一个为了让部署微服务更加便捷而诞生的现代HTTP反向代理、负载均衡工具。它支持多种后台 (Docker, Swarm, Kubernetes, Marathon, Mesos, Consul, Etcd, Zookeeper, BoltDB, Rest API, file…) 来自动化、动态的应用它的配置文件设置。
# 1.6、OpenResty
OpenResty 是一个基于 Nginx 与 Lua 的高性能 Web 平台,其内部集成了大量精良的 Lua 库、第三方模块以及大多数的依赖项。用于方便地搭建能够处理超高并发、扩展性极高的动态 Web 应用、Web 服务和动态网关。
# 二、常见的注册中心
Spring Cloud支持的多种注册中心Eureka、Consul、Zookeeper、以及阿里巴巴推出Nacos。这些注册中心在本质上都是用来管理服务的注册和发现以及服务状态的检查的
# 2.1、Eureka
原生,2.0遇到性能瓶颈,停止维护。
Eureka 是 Netflix 出品的用于实现服务注册和发现的工具。 Spring Cloud 集成了 Eureka,并提供了开箱即用的支持。其中, Eureka 又可细分为 Eureka Server 和 Eureka Client。
# 2.2、Zookeeper
支持,专业的独立产品。例如:dubbo。
ZooKeeper是一种集中式服务,用于维护配置信息、命名、提供分布式同步和提供组服务。分布式应用程序以某种形式使用所有这些类型的服务。每次实现它们时,都需要做大量工作来修复不可避免的bug和竞争条件。由于实现这些类型的服务很困难,应用程序最初通常会忽略它们,这使得它们在发生变化时变得脆弱,难以管理。即使做得正确,这些服务的不同实现也会导致应用程序部署时的管理复杂性。
# 2.3、Consul
原生,GO语言开发。
Consul是一个服务网络解决方案,使团队能够管理服务之间以及跨多云环境和运行时的安全网络连接。Consul提供服务发现、基于身份的授权、L7流量管理和服务对服务加密。
# 2.4、Nacos
相对于 Spring Cloud Eureka 来说,Nacos 更强大。
Nacos /nɑ:kəʊs/ 是 Dynamic Naming and Configuration Service的首字母简称,一个更易于构建云原生应用的动态服务发现、配置管理和服务管理平台。
Nacos 致力于帮助您发现、配置和管理微服务。Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据及流量管理。
Nacos 帮助您更敏捷和容易地构建、交付和管理微服务平台。 Nacos 是构建以“服务”为中心的现代应用架构 (例如微服务范式、云原生范式) 的服务基础设施。
# 三、常见的RPC框架
# 3.1、Dubbo
国内最早开源的 RPC 框架,由阿里巴巴公司开发并于 2011 年末对外开源,仅支持 Java 语言。后来贡献给了Apache软件基金会。
Apache Dubbo 是一款微服务框架,为大规模微服务实践提供高性能 RPC 通信、流量治理、可观测性等解决方案,涵盖 Java、Golang 等多种语言 SDK 实现。最新版本升级到Dubbo3了。
# 3.2、Motan
微博内部使用的 RPC 框架,于 2016 年对外开源,仅支持 Java 语言。Motan是一个跨语言远程过程调用(RPC)框架,用于快速开发高性能分布式服务。
Motan生态系统相关项目:
Motan go是golang实现。 MotanPHP是PHP客户端可以直接或通过Motan go代理与Motan服务器交互。 Motan openresty是基于openresty的Lua(Luajit)实现。 Motan 源码托管
# 3.3、Tars
腾讯内部使用的 RPC 框架,于 2017 年对外开源,仅支持 C++ 语言。
TARS是一个Linux基金会项目。它是一个基于名称服务和Tars协议的高性能RPC框架,也是一个集成的管理平台,并通过灵活的调度实现了托管服务。
Tars,又名TAF(Total Application Framework),自2008年以来一直在腾讯使用。目前它支持C++、Java、Nodejs和PHP。该框架为开发、维护和测试提供了一套解决方案,使开发、部署和测试服务更加高效。它集成了可扩展的编码/解码协议、高性能RPC通信框架、名称服务、监视器、统计和配置。您可以使用它快速开发基于微服务的可靠分布式应用程序,并实现完全高效的服务管理。
Tars 源码托管
# 3.4、Spring Cloud
国外 Pivotal 公司 2014 年对外开源的 RPC 框架,仅支持 Java 语言。Spring Cloud 利用 Spring Boot 特性整合了开源行业中优秀的组件,整体对外提供了一套在微服务架构中服务治理的解决方案。
# 3.5、gRPC
Google 于 2015 年对外开源的跨语言 RPC 框架,支持多种语言。
gRPC是一个现代的开源高性能远程过程调用(RPC)框架,可以在任何环境中运行。它可以通过可插拔的负载平衡、跟踪、健康检查和身份验证支持,有效地连接数据中心内和数据中心之间的服务。它也适用于分布式计算的最后一英里,将设备、移动应用程序和浏览器连接到后端服务。
# 3.6、Thrift
最初是由 Facebook 开发的内部系统跨语言的 RPC 框架,2007 年贡献给了 Apache 基金,成为 Apache 开源项目之一,支持多种语言。
Thrift 是一个软件框架(远程过程调用框架),用来进行可扩展且跨语言的服务的开发。它结合了功能强大的软件堆栈和代码生成引 擎,以构建在 C++, Java, Python, PHP, Ruby, Erlang, Perl, Haskell, C#, Cocoa, JavaScript, Node.js, Smalltalk, and OCaml 这些编程语言间无缝结合的、高效的服务。
thrift 最初由 facebook 开发,07 年四月开放源码,08 年 5 月进入 apache 孵化器,现在是 Apache 基金会的顶级项目。
thrift 允许你定义一个简单的定义文件中的数据类型和服务接口,以作为输入文件,编译器生成代码用来方便地生成 RPC 客户端和服务器通信的无缝跨编程语言。。
著名的 Key-Value 存储服务器 Cassandra 就是使用 Thrift 作为其客户端 API 的。