微服务与Spring Cloud

微服务

概念

微服务是一种小型的应用程序,并且使用轻量级的设计方法和轻量级的HTTP通信

定义

  • 微服务架构:将复杂的系统使用组件化的形式进行拆分,并使用轻量通信方式进行整合的一种设计方法
  • 微服务:通过这种架构设计方法拆分出来的一个独立的组件化的小应用

精髓:分而治之,合而用之

流程:微服务轻量级的HTTP通信,不同于传统的做法,使用实现设定好的IP和端口号进行访问,而是通过服务注册与发现的机制,使用服务的实例名称进行调用。在这个过程中,服务发现机制将协同路由代理服务和负载均衡器一起工作,当客户端使用服务实例名称发出请求时,将通过负载均衡器从服务注册列表中选择一个可用的服务实例,然后才通过实例注册的IP和端口路由到相关的服务中。所以提供API的微服务,可以发布在任意主机之中,并且可以随时更改主机和端口,也可以发布任意多个副本

特点:

  1. 小型化

    进行服务组件化设计,组件化的结果最显著的特点就是应用程序变小了

  2. 自治化

    每个微服务就是一个独立的应用,独立使用数据库,独立部署,独立运行

  3. 扁平化

    微服务在发挥个性优势的同时,处在一种杂而不乱的有序可控的状态之中

  4. 轻量级设计

    微服务的通信设计通常使用到两种方式,即使用API的同步同信和使用消息通道的异步通信,两者都是轻量级设计,分别使用简单的REST协议和轻量的消息总线来实现

  5. 渐近式设计

微服务架构与SOA的比较

  • SOA(Service-Oriented Architecture,面向服务架构),是一种粗力度、松耦合的面向服务架构设计方法。SOA是一种企业级的架构设计方法,使用企业服务总线(ESB)的方式来构建一个更高效、更可靠、更具重用性的企业信息系统,如Dubbo、Dubbox、CXF等
  • 两者最大的且别是,微服务的通信设计使用的是简单的HTTP协议,一般使用Restful实现。而SOA一般使用复杂的协议,如WebService或BPEL等,还需要使用服务描述性语言来定义标准接口
  • 微服务的自治性与SOA的集中式管理的区别:微服务架构使用去中心化的扁平化管理方式,每一个服务都是一个独立的应用程序,独立管理,使用独立的数据库,独立部署和独立运行。SOA是一种整体式的架构,使用集中式的管理方式和统一的数据中心。所以微服务的开发和部署更加灵活和快速,可以更快地响应需求的变化和业务的更新

使用微服务架构的优势

  1. 开发简单

    微服务架构将复杂的系统进行拆分之后,让每个微服务应用开发都变得非常简单

  2. 快速响应需求变化

    需求变化定位到微服务局部功能的更改

  3. 随时随更新

    一个微服务的部署和更新并不会影响到全局系统的正常运行

  4. 系统更加稳定可靠

    微服务运行在一个高可用的分布式环境之中,有配套的监控和调度机制,并且还可以提供自由伸缩和管理

  5. 规模可持续发展

Spring Cloud的使用

功能:

  • 分布式/版本化配置
  • 服务注册和发现
  • 路由
  • 服务之间的调用
  • 负载均衡
  • 断路器
  • 全局锁
  • 主机选举和集群状态
  • 分布式消息

Spring Cloud组件

  1. Spring Cloud Config

    配置管理工具包,可以将每个服务的配置放到远程服务器,实现集群化的集中管理,目前支持本地存储、Git以及SVN等

  2. Spring Cloud Netflix

    • Eureka:注册中心

      提供服务注册和发现的功能

      每个服务启动时,Eureka Client都会将服务注册到Eureka Server,并且Eureka Client还可以反过来从Eureka Server拉取注册表,从而知道其他服务在哪里

    • Zuul:服务网关

      提供网关服务和动态路由的功能

      如果前端、移动端要调用后端系统,统一从Zuul网关进入,由Zuul网关转发请求给对应的服务

    • Ribbon:负载均衡

      提供负载均衡调度管理的功能

      服务发起请求的时候,基于Ribbon做负载均衡,从一个服务的多台机器中选择一台

    • Feign:服务调用

      基于动态代理机制,根据注解和选择的机器、拼接请求url地址,发起请求

    • Hystrix:熔断器

      提供容错机制、服务降级、故障转移等功能

      发送请求是通过Hystrix的线程池来走的,不同的服务走不同的线程池,实现了不同服务调用的隔离,避免了服务雪崩的问题

    • Turbine:聚合服务事件流

      可用来监控集群中服务的运行情况

    • Sleuth:日志收集组件

      可通过日志收集提供对服务间调用进行跟踪管理功能

    • Config:配置服务

      提供统一的配置管理服务功能

  3. Spring Cloud Bus

    一个事件、消息总线,用于在集群中传播状态的变化,可与Spring Cloud Config联合使用,实现动态配置管理

  4. Spring Cloud for CloudFoundy

    通过配置协议绑定服务到CloudFoundry,CloudFoundry是VMware推出的开源Paas云平台

  5. Sping Cloud CloudFoundry Service Broker

    提供一个起点,为CloudFoundry建立托管服务代理

  6. Spring Cloud Cluster

    提供了Leadership选举,如Zookeeper、Redis、Hazelcast常见状态模式的抽象和实现

  7. Spring Cloud Consul

    封装了Consul操作,Consul是一个服务发现于配置工具,与Docker容器可以无缝集成

  8. Spring Cloud Security

    基于Spring Security的安全工具包,可以为应用添加安全控制

  9. Spring Cloud Stream

    数据流操作开发包,封装了与Redis、Rabbit、Kafka等发送消息和接收消息的方法

  10. Spring Cloud Zookeeper

    连接Zookeeper的工具包,用于使用Zookeeper方式的服务注册、发现与管理

  11. Spring Cloud Connectors

    便于云端应用程序在各种PaaS平台连接到后端,如数据库和代理服务等

  12. 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方式调用有两种方式:

  1. restTemplate+Ribbon
  2. feign(feign内部也使用了ribbon做负载均衡)

如何理解客户端Ribbon

  • zuul:针对外部请求做负载

  • ribbon:解决的是服务发起方对被调用的服务的负载

    eg:我们查询商品服务要调用显示库存和商品明细服务,通过商品服务的接口将两个服务组合,可以减少外部应用的请求

    eg:手机App发起一次请求即可,可以节省网络带宽,也更省电

ribbon是对服务之间调用做负载,是服务之间的负载均衡,zuul是可以对外部请求做负载均衡

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小马爱打代码

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值