Spring Cloud ☁️ 🔥

Netflix 不是一家正经的传媒公司

Eureka

服务注册与发现

Ribbon

  1. 客户端负载均衡, 通过@LoadBalanced 注解修饰的 resttemplate
  2. 负载均衡策略:IRule, 默认 Round 轮询方式. 文档
users:
  ribbon:
    NIWSServerListClassName: com.netflix.loadbalancer.ConfigurationBasedServerList
    NFLoadBalancerRuleClassName: com.netflix.loadbalancer.WeightedResponseTimeRule

Feign

  1. 客户端 http 调用, spring cloud 对 feign 增强了 ribbon 负载均衡与服务发现的能力
  2. 实现: 定义接口 @FeignClient(name="应用名") 方法上像 springMvc 一样@GetMapping("/...")使用

配置中心

  1. 服务端
spring:
cloud:
  config:
    server:
      git:
        uri: https://github.com/spring-cloud-samples/config-repo
        basedir: target/config
  1. 客户端 bootstrap
spring.cloud.config.discovery.enabled=true
spring.cloud.config.discovery.serviceId=xxx
spring.cloud.config.profile=xxx

Bus 消息总线

  1. config 客户端 配置类@RefreshScope
  2. config server 端 要暴露出刷新配置的 endpoint

Stream

  1. Barista 接口: 定义通道类型与名称 ==类型==: 接收 or 发送 消息 ==名称==: 配置用

  2. @output/input 注解

  3. @StreamListener 注解: 定义消息监听

生产者:

public interface Barista{
   String output_channel="demo_out";

   @Output(Barista.output_channel)
   MessageChannel output();
}

配置文件里要指定该通道 绑定的 exchange 和 queue, 发送消息类要@EnableBinding(Barista.class)

spring.cloud.stream.bindings.demo_out.destination=exchange_name
spring.cloud.stream.bindings.demo_out.group=queue_name
spring.cloud.stream.bindings.demo_out.binder=rabbit_cluster

spring.cloud.stream.binders.rabbit_cluster.type=rabbit
spring.cloud.stream.binders.rabbit_cluster.environment.spring.rabbitmq.address=127.0.0.1:5672
spring.cloud.stream.binders.rabbit_cluster.environment.spring.rabbitmq.username=guest
spring.cloud.stream.binders.rabbit_cluster.environment.spring.rabbitmq.password=guest
spring.cloud.stream.binders.rabbit_cluster.environment.spring.rabbitmq.virtual-host=/

消费者:

public interface Barista{
   String input_channel="demo_input";

   @Output(Barista.input_channel)
   SubscribableChannel input();
}

Zuul

  1. 过滤器: pre routing post error
  2. 网关路由转发 @EnbaleZuulProxy , http://zuul地址:9000/转发的服务名/路由
  3. 自定义路由: /myDmo/.... ->路由到 /demo/...
zuul:
  routes:
    myDemo:
      path: /myDemo/**
      serviceId: demo
      # 不过滤cookies等数据
      sensitiveHeaders:

或者, 简洁写法:

zuul:
  routes:
    demo: /myDemo/**
  # 排除路由
  ignored-patterns:
    - /demo/list/**
  1. 自定义过滤器: ZuulFilter

    • pre/post: 前置/后置过滤器
    • 限流: 令牌桶: RateLimiter, Google guava 或其它实现算法, 每个 request 请求从令牌桶获取令牌 RateLimiter.tryAcquire(), 能获取到放行
    • 鉴权
    • 跨域: CorsFilter
  2. zuul 依赖了 hystrix, 可以通过 hystrix 配置 zuul 网关转发服务的超时时间

Hystrix

  1. @HystrixCommand(...)

    • fallbackMethod: 目标服务异常自动转到此方法
    • commandProperties: {} @Hystrix(key,value) 指定触发熔断降级的一些配置
    • circuitBreaker: 断路器, requestVolumeThreshold:10,sleepWindowInMilliseconds:10000,errrorThresholdPercentage:60. 开启-->半开启-->断开
    • hystrix 的这些配置可以写到 yaml 配置文件中
    • feign-hystrix
    • hystrix-dashboard
  2. 类上@DefaultProperties(defaultFallback=....): 指定此类所有服务异常默认的 fallback

Sleuth

服务追踪

  1. 可视化分析页面: zipkin
上次更新: 4 个月前