283fac6fba507f97ee3446836cc46f41.png

编者按

有了前面Spring、SpringBoot的学习基础之后,再接触Spring Cloud分布式的架构时能够比较快速地理解一些概念。以下整理一些学习笔记,以备日后回顾。欢迎指正。


(一)微服务架构[1]

将传统web开发方式与微服务架构放在一起比较,会对这两个概念有更好的理解。注释中链接地址的博客文章,非常通俗易懂地解释了微服务框架,记录下来分享。

传统web开发方式采用单体式,将所有功能全部打包在一个包中。
优点是简单集中,没有分布式管理和调用的消耗。
缺点是不易维护和扩展,牵一发而动全身。

0beee84fac7ef4d4682910f265de311a.png
单体式架构

于是诞生了分布式的微服务框架,将各个功能模块拆分解耦,形成具有特定功能的服务。如果需要使用到某一服务的功能,则通过请求调用即可,降低模块间直接的代码依赖,使得各个服务更具有扩展性。

20f2ac089e8be23942610c3715934a71.png
分布式架构

(二)Spring Cloud[2]

注释链接中的教程,搭建了最简单的SpringCloud架构,通过搭建框架能够更好地理解。

1 注册中心Eureka

微服务各个模块之间需要的相互调用,使得形成了服务端与客户端的概念,而由于所有服务都有可能处于请求方,因此设立了一个端口作为各个服务查找请求地址的枢纽。Eureka使得注册中心成为这样一个管理者,作为server接收来自各个client的信息,注册中心本身也是一个client。

7514e4092a6386b718dea0024f889cc9.png
Eureka注册中心结构

从结构上看,各个client通过server相连;但在client的角度上,他们之间是直接调用的关系。

通过Eureka将各个分布式的服务关联起来,只要提供对应的接口,无需了解其具体实现,即可直接调用相应的服务。达到了功能分隔的效果,在对某个功能进行维护、扩展、更新时,不会影响其他服务的正常运行。

- 用@EnableEurekaServer标注是server
- 用@EnableEurekaClient标注是client

在application.yaml文件中,

1)设置name
指明spring.application.name很重要,服务与服务之间的调用需要依靠这个名字.

2)设置server
要配置eureka.client.registerWithEureka和fetchRegistry为 false表明是server.

3)设置client1和client2
要配置eureka.client.serviceUrl.defaultZone:自己的注册中心的地址。

# 设置server
server:
  port: 8761

eureka:
  instance:
    hostname: localhost
  client:
    registerWithEureka: false
    fetchRegistry: false
    serviceUrl:
      defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/

spring:
  application:
    name: eurka-server

# 设置client
server:
  port: 8762

spring:
  application:
    name: service-hi

eureka:
  client:
    serviceUrl:
      defaultZone: http://localhost:8761/eureka/

2 服务消费者

微服务框架中各服务之间的通讯基于Http请求,Spring Cloud中采用两种服务调用方式:一种是Ribbon+Template,一种是Feign。

2.1 Ribbon + restTemplate

Ribbon是一个负载均衡客户端,用来调解服务器请求的压力,将请求均衡地打出,防止出现崩溃。

假设开启一个注册中心Server,有两个服务器client1/2提供Service-hi功能。
现在client3不停发起Service-hi请求,则经过Ribbon会使得两个服务器轮流提供hi服务。

创建client3:

1)用@EnableEurekaClient标注启动类是client,向注册中心注册。

2)在启动类中注入一个Bean:restTemplate,并用@LoadBalanced注解标明开启负载均衡。

3)编写一个Service,通过注入的Template消费server-hi的接口。

4)编写一个Controller,调用Service的方法。

RestTemplate是Spring提供的用于访问Rest服务的客户端,是Spring用于同步client端的核心类,简化了与http服务的通信,满足RestFul原则,程序代码可以给它提供URL,并提取结果。

a0ec42177730b01f23b38b545c0ce6b5.png
Ribbon + restTemplate 结构

2.2 Feign

Feign是一个伪Http客户端,采用基于接口的注解,默认集成Ribbon。
整合了Ribbon均衡负载,整合了Hystrix(下一节内容)具有熔断能力。
因此使用Feign只要创建一个接口并注解即可,较前一种方式方便很多。

创建client3:

1)用@EnableEurekaClient标注启动类是client,向注册中心注册。

2)创建一个接口interface,用@FeignClient注解,其中指定调用的是哪个服务@RestMapping(value, method)。

3)Web层Controller对外暴露一个接口,通过Feign客户端消费Service-hi。

3 熔断器Hystrix

由于服务与服务之间的依赖性,一旦出现故障就会传播,进而导致整个微服务系统崩溃,此为"雪崩"效应。为了防止出现这样的情况,业界提出了熔断器/断路器的模型。

使用熔断器后,当对特定的服务的调用的不可用达到一个阀值时断路器将会被打开,使用fallback方法直接返回一个固定值,防止长时间等待无应答造成的系统崩溃。

3.1 Ribbon

在Ribbon中需要添加Hystrix的依赖,然后在启动类和Service类中添加注解打开其功能。

3.2 Feign

Feign中集成了Hystrix,因此直接在配置文件中添加开启选项,然后在接口的@FeignClient注解中设置fallback的内容即可。

4 路由网关Zuul

Zuul的主要功能是路由转发和过滤器,可以起到身份验证的作用。

参考

  1. ^微服务架构 https://www.cnblogs.com/skabyy/p/11396571.html
  2. ^SpringCloud教程 https://blog.csdn.net/forezp/article/details/70148833
Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐