SpringCloudGateway + resilience4j + consul

  • Consul 安装

  • 官网下载 consul,这里使用window_consul_1.14.1版本 , 单实例
  • 新建configs目录,并在目录内新建basic.json并保存以下内容
  • {
      "ports": {
        "server": 9200,
        "serf_lan": 9201,
        "serf_wan": 9202,
        "http": 9000,
        "dns": 9100
      }
    }
  • Consul最多需要6个不同的端口才能正常工作,有些使用TCP,UDP或两种协议。
    服务器RPC(默认8300)。这由服务器用来处理来自其他代理的传入请求。仅限TCP。
    Serf LAN(默认8301)。这是用来处理局域网中的八卦。所有代理都需要。TCP和UDP。
    Serf WAN(默认8302)。这被服务器用来在WAN上闲聊到其他服务器。TCP和UDP。从Consul 0.8开始,建议通过端口8302在LAN接口上为TCP和UDP启用服务器之间的连接,以及WAN加入泛滥功能。另见: Consul 0.8.0 CHANGELOG和GH-3058
    HTTP API(默认8500)。这被客户用来与HTTP API交谈。仅限TCP。
    DNS接口(默认8600)。用于解析DNS查询。TCP和UDP。
  • 启动命令

  • consul agent -server -ui -bootstrap-expect=1 -data-dir=./tmp -node=consul-1 -client=0.0.0.0 -bind=127.0.0.1 -datacenter=dc1 -config-dir ./configs

  • 浏览器访问 http://127.0.0.1:9000/ui/dc1/services

  •  

Gateway 网关项目

pom.xml配置
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-gateway</artifactId>
    <version>3.1.4</version>
</dependency>
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-circuitbreaker-reactor-resilience4j</artifactId>
    <version>2.1.5</version>
</dependency>
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-consul-discovery</artifactId>
    <version>3.1.2</version>
</dependency>
<dependency><!-- 健康检查 -->
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-actuator</artifactId>
    <version>2.7.6</version>
</dependency>

application.yml 关键配置

server:
  port: 80
# 启用服务健康检测,consul将通过http://host:port/actuator/health 检测服务的存活,默认10s/次
management:
  health:
    refresh:
      enabled: true
spring:
  application:
    name: my-gateway
  cloud:
    # consul注册中心
    consul:
      # 注册中心host
      host: 127.0.0.1
      # 注册中心端口
      port: 9000
      # 服务配置
      discovery:
        # 注册到consul的服务名称
        service-name: ${spring.application.name}
        # 注册到consul的hostname(主机名称,consul是通过hostname提供给客户端连接的)
        hostname: 127.0.0.1
        # 注册到consul的标识
        tags: module=user,version=1.0.0
    gateway:
      discovery:
        locator:
          enabled: true
          # 将服务名转换为小写
          lower-case-service-id: true
      routes:
        - id: my-server
          #此处的lb://后的my-server需要与生产者服务的服务名一致
          uri: lb://my-server
          predicates:
            - Path=/**
          filters:
            - name: CircuitBreaker #使用resilience4j断路器
              args:
                name: customizer1
resilience4j:
  circuitbreaker:
    configs: #通用配置
      default: # 断路器系统默认配置
        #失败率,错误率达到或高于该值则进入open状态
        failureRateThreshold: 50
        #慢调用阀值,请求执行的时间大于该值时会标记为慢调用
        slowCallDurationThreshold: 30s
        #慢调用熔断阀值,当慢调用率达到或高于该值时,进入open状态
        slowCallRateThreshold: 100
        #状态滚动收集器大小,close状态时收集多少请求状态,用于计算失败率。
        slidingWindowSize: 100
        #状态收集器类型
        #COUNT_BASED:根据数量计算,slidingWindowSize为次数
        #TIME_BASED:根据时间计算,slidingWindowSize为秒数
        slidingWindowType: COUNT_BASED
        #计算错误率的最小请求数,不足最小调用次数不会触发任何变化。
        minimumNumberOfCalls: 10
        #是否自动进入halfOpen状态,默认false-一定时间后进入halfopen,ture-需要通过接口执行。
        automaticTransitionFromOpenToHalfOpenEnabled: false
        #进入halfOpen状态时,可以被调用次数,就算这些请求的失败率,低于设置的失败率变为close状态,否则变为open。
        permittedNumberOfCallsInHalfOpenState: 10
        #open状态变为half状态需要等待的时间,即熔断多久后开始尝试访问被熔断的服务。
        waitDurationInOpenState: 30s
        #事件缓冲区大小??
        eventConsumerBufferSize: 10
        #被计为失败的异常集合,默认情况下所有异常都为失败。
        recordExceptions:
          - java.lang.Exception
        #不会被计为失败的异常集合,优先级高于recordExceptions。
        ignoreExceptions:
          - java.lang.IllegalStateException
    instances: #熔断器类型
      customizer1: #自定义配置
        baseConfig: default
        slowCallDurationThreshold: 5s
  timelimiter:
    configs:
      default:
        timeout-duration: 30s
    instances:
      customizer1:
        base-config: default
        timeout-duration: 3s

server 项目 生产者服务

  • pom.xml配置
  • <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
        <version>2.7.6</version>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-actuator</artifactId>
        <version>2.7.6</version>
    </dependency>
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-consul-discovery</artifactId>
        <version>3.1.2</version>
    </dependency>

  • application.yml 关键配置
  • spring:
        application:
            name: my-server
        cloud:
            consul :
                host: 127.0.0.1
                port: 9000
                discovery:
                    hostname: 127.0.0.1
                    #配置实例地址
                    register: true # 自动注册
                    service-name: ${spring.application.name} #实例名称
                    tags: module=user,version=1.0.0
    
    # 启用服务健康检测,consul将通过http://host:port/actuator/health 检测服务的存活,默认10s一次
    management:
        health:
            refresh:
                enabled: true
    server:
        port: 8080
        http2:
            enabled: true
        servlet:
            application-display-name: ${spring.application.name}

  • 注册的服务名my-server与网关路由处配置的lb://my-server保持一致
  • 启动多个server生产服务的话会自动注册到注册中心
  • 当然,consul可以集群
  • 另外如果要使用nacos注册中心的话需要检查spring-boot的版本与nacos版本,因为在2.4.x版本的springboot之后去掉了ConfigurationBeanFactoryMetadata , 以至于会抱错:时启动提示ClassNotFount:ConfigurationBeanFactoryMetadata
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值