微服务包括两大部分:服务治理与服务实现。
微服务的优点
-
独立开发 – 所有微服务都可以根据各自的功能轻松开发
-
独立部署 – 基于其服务,可以在任何应用程序中单独部署它们
-
故障隔离 – 即使应用程序的一项服务不起作用,系统仍可继续运行
-
混合技术堆栈 – 可以使用不同的语言和技术来构建同一应用程序的不同服务
-
粒度缩放 – 单个组件可根据需要进行缩放,无需将所有组件缩放在一起
-
解耦 – 系统内的服务很大程度上是分离的。因此,整个应用程序可以轻松构建,更改和扩展
-
组件化 – 微服务被视为可以轻松更换和升级的独立组件
-
业务能力 – 微服务非常简单,专注于单一功能
-
自治 – 开发人员和团队可以彼此独立工作,从而提高速度
-
持续交付 – 通过软件创建,测试和批准的系统自动化,允许频繁发布软件
-
责任 – 微服务不关注应用程序作为项目。相反,他们将应用程序视为他们负责的产品
-
分散治理 – 重点是使用正确的工具来做正确的工作。这意味着没有标准化模式或任何技术模式。开发人员可以自由选择最有用的工具来解决他们的问题
-
敏捷 – 微服务支持敏捷开发。任何新功能都可以快速开发并再次丢弃
Spring Cloud和Dubbo是两大主流微服务框架,前者是Spring公司的产品,后者是阿里巴巴的产品。Spring Cloud基于HTTP调用,Dubbo基于RPC进行调用。
Spring Cloud是服务治理相关的一套体系,Spring Boot是实现单个服务的库,Spring Cloud包括Spring Boot。
熔断和降级
- 熔断机制:熔断机制应对雪崩效应的一种微服务链路保护机制,目的是防止单个服务挂掉影响大量的其它服务。当查出链路中的某个微服务不可用或者响应时间太长时,会进行服务降级,进而熔断该节点微服务的调用,快速返回“错误”的响应信息。当检测到该节点微服务调用响应正常时则恢复调用链路。在SpringCloud 框架里熔断机制通过 Hystrix 实现,Hystrix 会监控微服务间调用的状况,当失败的调用到一定阈值,缺省是5秒内调用20次,如果失败,就会启动熔断机制。
- 服务降级:一般是从整体负荷考虑。就是当某个服务熔断之后,服务器将不再被调用,此时客户端可以自己准备一个本地的fallback 回调,返回一个缺省值。这样做,虽然水平下降,但好歹可用,比直接挂掉强。
微服务的优点和缺点
优点:
【1】每个服务足够内聚,足够小,代码容易理解这样能聚焦一个指定的业务功能或业务需求。 【2】开发简单,开发效率提高,一个服务可能就是专一的只干一件事。 【3】微服务能够被小团队开发,这个团队可以是2到5个开发人员组成。 【4】微服务是松耦合的,是有功能意义的服务,无论是在开发阶段或部署阶段都是独立的。 【5】微服务能使用不同的语言开发。 【6】易于第三方集成,微服务允许使用容易且灵活的方式集成自动部署,通过持续集成集成工具,如Jenkins、Hudson等。 【7】微服务易于被一个开发人员理解,修改和维护,这样小团队能够更关注自己的工作成果。无需通过合作体现价值。 【8】微服务允许你融合最新技术。 【9】微服务知识业务逻辑代码,不会和 HTML 和 CSS 其他界面组件混合。 【10】每个微服务都有自己的存储能力,可以有自己的数据库,也可以有统一的数据库。
缺点:
【1】开发人员要处理分布式系统的复杂性。 【2】多服务运维难度,随着服务的增加,运维的压力也在增加。 【3】系统部署依赖。 【4】服务间通讯成本。 【5】数据一致性。 【6】系统集成测试。 【7】性能监控。
微服务包括的内容及其相关技术
- 服务开发 SpringBoot、Spring、SpringMVC
- 服务配置管理 Netfilx公司的Archaius、阿里的Diamond等
- 服务注册与发现 Eureka、Consul、Zookeeper
- 服务调用 RPC、Rest、gRPC、thrift
- 服务熔断器 Hystrix、Envoy等
- 负载均衡 Nginx、Ribbon
- 服务接口调用(客户端调用服务的简化工具) Feign等
- 消息队列 Kafka、RabbitMQ、ActiveMQ等
- 服务配置中心管理 SpringCloudConfig、Chef等
- 服务路由(API网关) Zuul等
- 服务监控 Zabbix、Naggios、Metrics、Spectator等
- 全链路追踪 Zipkin、Brave、Dapper等
- 服务部署 Docker、OpenStack、Kubernetes等
- 数据流操作开发包 SpringCloud Stream
- 事件消息总线 Spring Cloud Bus
常用的RPC框架有哪些
- gRPC:一开始由 google 开发,是一款语言中立、平台中立、开源的远程过程调用(RPC)系统。
- thrift:hrift是一个软件框架,用来进行可扩展且跨语言的服务的开发。它结合了功能强大的软件堆栈和代码生成引擎,以构建在 C++, Java, Python, PHP, Ruby, Erlang, Perl, Haskell, C#, Cocoa, JavaScript, Node.js, Smalltalk, and OCaml 这些编程语言间无缝结合的、高效的服务。
- dubbo:Dubbo是一个分布式服务框架,以及SOA治理方案。其功能主要包括:高性能NIO通讯及多协议集成,服务动态寻址与路由,软负载均衡与容错,依赖分析与降级等。Dubbo是阿里巴巴内部的SOA服务化治理方案的核心框架,Dubbo自2011年开源后,已被许多非阿里系公司使用。
- Spring Cloud:Spring Cloud由众多子项目组成,如Spring Cloud Config、Spring Cloud Netflix、Spring Cloud Consul 等,提供了搭建分布式系统及微服务常用的工具,如配置管理、服务发现、断路器、智能路由、微代理、控制总线、一次性token、全局锁、选主、分布式会话和集群状态等,满足了构建微服务所需的所有解决方案。Spring Cloud基于Spring Boot, 使得开发部署极其简单。
- CloudWeGo:字节基于thrift的封装。
gRpc的特点
语言中立,支持多种语言;
基于 IDL 文件定义服务,通过 proto3 工具生成指定语言的数据结构、服务端接口以及客户端 Stub;
通信协议基于标准的 HTTP/2 设计,支持双向流、消息头压缩、单 TCP 的多路复用、服务端推送等特性,这些特性使得 gRPC 在移动端设备上更加省电和节省网络流量;
序列化支持 PB(Protocol Buffer)和 JSON,PB 是一种语言无关的高性能序列化框架,基于 HTTP/2 + PB, 保障了 RPC 调用的高性能。