微服务
概念
微服务是一种小型的应用程序,并且使用轻量级的设计方法和轻量级的HTTP通信
定义
- 微服务架构:将复杂的系统使用组件化的形式进行拆分,并使用轻量通信方式进行整合的一种设计方法
- 微服务:通过这种架构设计方法拆分出来的一个独立的组件化的小应用
精髓:分而治之,合而用之
流程:微服务轻量级的HTTP通信,不同于传统的做法,使用实现设定好的IP和端口号进行访问,而是通过服务注册与发现的机制,使用服务的实例名称进行调用。在这个过程中,服务发现机制将协同路由代理服务和负载均衡器一起工作,当客户端使用服务实例名称发出请求时,将通过负载均衡器从服务注册列表中选择一个可用的服务实例,然后才通过实例注册的IP和端口路由到相关的服务中。所以提供API的微服务,可以发布在任意主机之中,并且可以随时更改主机和端口,也可以发布任意多个副本
特点:
-
小型化
进行服务组件化设计,组件化的结果最显著的特点就是应用程序变小了
-
自治化
每个微服务就是一个独立的应用,独立使用数据库,独立部署,独立运行
-
扁平化
微服务在发挥个性优势的同时,处在一种杂而不乱的有序可控的状态之中
-
轻量级设计
微服务的通信设计通常使用到两种方式,即使用API的同步同信和使用消息通道的异步通信,两者都是轻量级设计,分别使用简单的REST协议和轻量的消息总线来实现
-
渐近式设计
微服务架构与SOA的比较
- SOA(Service-Oriented Architecture,面向服务架构),是一种粗力度、松耦合的面向服务架构设计方法。SOA是一种企业级的架构设计方法,使用企业服务总线(ESB)的方式来构建一个更高效、更可靠、更具重用性的企业信息系统,如Dubbo、Dubbox、CXF等
- 两者最大的且别是,微服务的通信设计使用的是简单的HTTP协议,一般使用Restful实现。而SOA一般使用复杂的协议,如WebService或BPEL等,还需要使用服务描述性语言来定义标准接口
- 微服务的自治性与SOA的集中式管理的区别:微服务架构使用去中心化的扁平化管理方式,每一个服务都是一个独立的应用程序,独立管理,使用独立的数据库,独立部署和独立运行。SOA是一种整体式的架构,使用集中式的管理方式和统一的数据中心。所以微服务的开发和部署更加灵活和快速,可以更快地响应需求的变化和业务的更新
使用微服务架构的优势
-
开发简单
微服务架构将复杂的系统进行拆分之后,让每个微服务应用开发都变得非常简单
-
快速响应需求变化
需求变化定位到微服务局部功能的更改
-
随时随更新
一个微服务的部署和更新并不会影响到全局系统的正常运行
-
系统更加稳定可靠
微服务运行在一个高可用的分布式环境之中,有配套的监控和调度机制,并且还可以提供自由伸缩和管理
-
规模可持续发展
Spring Cloud的使用
功能:
- 分布式/版本化配置
- 服务注册和发现
- 路由
- 服务之间的调用
- 负载均衡
- 断路器
- 全局锁
- 主机选举和集群状态
- 分布式消息
Spring Cloud组件
-
Spring Cloud Config
配置管理工具包,可以将每个服务的配置放到远程服务器,实现集群化的集中管理,目前支持本地存储、Git以及SVN等
-
Spring Cloud Netflix
-
Eureka:注册中心
提供服务注册和发现的功能
每个服务启动时,Eureka Client都会将服务注册到Eureka Server,并且Eureka Client还可以反过来从Eureka Server拉取注册表,从而知道其他服务在哪里
-
Zuul:服务网关
提供网关服务和动态路由的功能
如果前端、移动端要调用后端系统,统一从Zuul网关进入,由Zuul网关转发请求给对应的服务
-
Ribbon:负载均衡
提供负载均衡调度管理的功能
服务发起请求的时候,基于Ribbon做负载均衡,从一个服务的多台机器中选择一台
-
Feign:服务调用
基于动态代理机制,根据注解和选择的机器、拼接请求url地址,发起请求
-
Hystrix:熔断器
提供容错机制、服务降级、故障转移等功能
发送请求是通过Hystrix的线程池来走的,不同的服务走不同的线程池,实现了不同服务调用的隔离,避免了服务雪崩的问题
-
Turbine:聚合服务事件流
可用来监控集群中服务的运行情况
-
Sleuth:日志收集组件
可通过日志收集提供对服务间调用进行跟踪管理功能
-
Config:配置服务
提供统一的配置管理服务功能
-
-
Spring Cloud Bus
一个事件、消息总线,用于在集群中传播状态的变化,可与Spring Cloud Config联合使用,实现动态配置管理
-
Spring Cloud for CloudFoundy
通过配置协议绑定服务到CloudFoundry,CloudFoundry是VMware推出的开源Paas云平台
-
Sping Cloud CloudFoundry Service Broker
提供一个起点,为CloudFoundry建立托管服务代理
-
Spring Cloud Cluster
提供了Leadership选举,如Zookeeper、Redis、Hazelcast常见状态模式的抽象和实现
-
Spring Cloud Consul
封装了Consul操作,Consul是一个服务发现于配置工具,与Docker容器可以无缝集成
-
Spring Cloud Security
基于Spring Security的安全工具包,可以为应用添加安全控制
-
Spring Cloud Stream
数据流操作开发包,封装了与Redis、Rabbit、Kafka等发送消息和接收消息的方法
-
Spring Cloud Zookeeper
连接Zookeeper的工具包,用于使用Zookeeper方式的服务注册、发现与管理
-
Spring Cloud Connectors
便于云端应用程序在各种PaaS平台连接到后端,如数据库和代理服务等
-
Spring Cloud Starters
使用Spring Boot方式的启动显目工具包,为Spring Cloud提供开箱即用的依赖管理
Spring Cloud的版本说明
Spring Cloud的版本号为了与各个组件的版本号区分开来,使用了伦敦地铁站的名字来命名,并按字母顺序排列,如:Angel、Brixton、Camden、Dalston、Edeware、Finchley等
在一个工程中使用如下POM配置之后,在工程中引用Spring Cloud的其他组件就可以不用再指定版本号
<parent>
<groudId>org.springframework.boot</groudId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.5.9.RELEASE</version>
</parent>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>Edgware.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
Spring Cloud的基本工作原理
Eureka管理每个注册的微服务实例,并为其建立元数据列表,当一个服务消费者需要调用微服务时,Ribbon将依据微服务的实例列表实行负载均衡调度,这种调度默认使用了轮询算法,它将从实例列表中取出一个可用的实例,然后Zuul依据实例的元数据,对服务进行路由,在路由的过程中,Hystrix将检查这个微服务实例的断路器状态,如果断路器处于闭合状态,即提供正常的服务;当断路器打开时,说明服务已经出现故障,Hystrix将根据实例的配置情况实行故障转移、服务降级等使用机制
微服务之间的调用
目前在Spring cloud中服务之间通过restful方式调用有两种方式:
- restTemplate+Ribbon
- feign(feign内部也使用了ribbon做负载均衡)
如何理解客户端Ribbon
-
zuul:针对外部请求做负载
-
ribbon:解决的是服务发起方对被调用的服务的负载
eg:我们查询商品服务要调用显示库存和商品明细服务,通过商品服务的接口将两个服务组合,可以减少外部应用的请求
eg:手机App发起一次请求即可,可以节省网络带宽,也更省电
ribbon是对服务之间调用做负载,是服务之间的负载均衡,zuul是可以对外部请求做负载均衡