-
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
-
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