spring cloud

核心组件

Zuul:网关管理,由 Zuul 网关转发请求给对应的服务
Eureka:服务注册于发现。
Feign:基于动态代理机制,根据注解和选择的机器,拼接请求 url 地址,发起请求。
Ribbon:实现负载均衡,从一个服务的多台机器中选择一台
Hystrix:提供线程池,不同的服务走不同的线程池,实现了不同服务调用的隔离,避免了服务雪崩的问题。

微服务选型考虑点

内部是否存在异构系统的集成;
框架功能特性是否满足需求;
通信协议是否会成为瓶颈点;
社区活跃度;

优势

image-20211021164949208

功能上是dubbo的一个超集,功能完整度、社区活跃度高;
基于springboot,减少项目迁移成本;

劣势

服务熔断

是对微服务雪崩效应的一种链路保护机制。
当某个微服务不可用或相应时间太长,会熔断调用,快速返回错误的消息,当检测到节点微服务相应正常后恢复调用链路。

Hystrix
是一个延迟和容错库,当故障不可避免时停止级联故障。使用舱壁模式实现线程隔离,每个服务有独立线程池,防雪崩

使用
功能开启方式:@EnableHystrix
方法熔断开启:@HystrixCommand(fallbackMethod=”XXX”),声明
一个失败回滚处理函数XXX,当被注解的方法执行超时(默认是1000毫秒),就会执行fallback函数,返回错误提示。

开启后
所有请求不会转发,一段时间后(默认5秒),进入半开状态,只转发一部分请求,成功则关闭,否则继续开启断路器

服务注册发现

eureka

区别
Zookeeper保证了CP,Eureka保证了AP。(A:高可用,C:一致性,P:分区容错性)

Zookeeper为了保证一致性作了很大牺牲,如果master节点down掉,重新选取leader需要30~120s,整个过程期间集群对外不可用,导致无法注册新服务。

eureka各节点是相等的,如果客户端连接的eureka发生故障会切到其它节点,只是不能保证数据是最新的。
默认情况下,如果90s内没有收到某个微服务实例心跳,eureka会移除该实例;但是有可能eureka网络发生了问题,这样可能会移除所有实例,所以引入了自我保护机制。

自我保护机制
如果在15分钟内超过85%的客户端节点都没有正常的心跳,那么Eureka就认为客户端与注册中心出现了网络故障,Eureka Server自动进入自我保护机制。

  1. Eureka Server不再从注册列表中移除因为长时间没收到心跳而应该过期的服务。
  2. Eureka Server仍然能够接受新服务的注册和查询请求,但是不会被同步到其它节点上,保证当前节点依然可用。
  3. 当网络稳定时,当前Eureka Server新的注册信息会被同步到其它节点中。

eureka.server.enable-self-preservation 来true打开/false禁用自我保护机制,默认打开状态,建议生产环境打开此配置

服务间节点同步
客户端注册到server节点a上后,会由a自动同步到其它server节点

集群配置
服务端:
eureka.instance.hostname=eureka2001.hmc.com
eureka.client.service-url.defaultZone=http://eureka2002.hmc.com:2002/eureka/,http://eureka2003.hmc.com:2003/eureka/
每一个server的defaultZone都要配置其它server节点地址。

消费端:eureka.client.service-url.defaultZone=http://localhost:2001/eureka

使用

<dependency>
  <groupId>org.springframework.cloud</groupId>
  <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
spring:
  application:
    name: microservice-provider-user
eureka:
  client:
    serviceUrl:
      defaultZone: http://localhost:8761/eureka/

启动类——
@EnableEurekaServer
@EnableEurekaClient 或 @EnableDiscoveryClient(不同点:@EnableEurekaClient只适用于Eureka作为注册中心,@EnableDiscoveryClient 可以是其他注册中心。)

服务调用RPC

微服务通讯方式
方式一:RPC
优点:简单,常见,因为没有中间件代理,系统更简单
缺点:只支持请求/响应的模式,不支持别的,比如通知、请求/异步响应、发布/订阅、发布/异步响
应,降低了可用性,因为客户端和服务端在请求过程中必须都是可用的。

方式二:MQ
优点:把客户端和服务端解耦,更松耦合,提高可用性,因为消息中间件缓存了消息,直到消费者
可以消费, 支持很多通信机制比如通知、请求/异步响应、发布/订阅、发布/异步响应。
缺点:消息中间件有额外的复杂。

feign
一个http接口请求库

特点
把请求封装成接口,类mybatis的思想;
整合了ribbon,能实现软负载均衡;
整合了hystrix,具有熔断能力;

使用
——消费者
启动类:@EnableFeignClients
接口:@FeignClient(name=”xxx”)

ribbon
配置
pom:

<dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-ribbon</artifactId>
    </dependency>


配置类上面@RibbonClient(name=”springCloud-ribbon-police”, configuration=LbConfig.class)
http://springCloud-ribbon-police/getPolice 调用”springCloud-ribbon-police”这个服务ID的时候,将会启用下面的配置

格式是:服务ID >>> 命名空间 >>> 配置属性

springCloud-ribbon-police:
  ribbon:
    NFLoadBalancerRuleClassName: com.lpx.pro.utils.MyRule

使用

/**
RestTemplate 是由 Spring Web 模块提供的工具类
,与 SpringCloud 无关,是独立存在的

因 SpringCloud 对 RestTemplate 进行了一定的扩展
,所以 RestTemplate 具备了负载均衡的功能
**/
    @Bean
    @LoadBalanced
    public RestTemplate getRestTemplate(){
        return new RestTemplate();
    }

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注