spring boot集成open feign笔记
1.open feign介绍
SSpring Cloud Open Feign是一个声明式的Web Service客户端,它使得编写Web Service客户端变得更加简单。Open Feign整合了Feign,Ribbon和Hystrix。
- Feign:是一个声明式的Web Service客户端,让HTTP请求更加简单。通过创建一个接口并用注解来配置,它具有可插拔的注解特性,使用Feign能让HTTP API调用更加简单。Feign能通过创建接口并注解来将HTTP请求映射为方法调用,而无需自己构建HTTP请求。
- Ribbon:是Netflix发布的开源项目,主要功能是提供客户侧的软件负载均衡算法。Ribbon可以与Eureka、Consul等组件集成,也可以自定义实现负载均衡算法。
- Hystrix:是Netflix发布的容错管理框架,主要用于隔离访问远程系统、服务和第三方库的点,防止级联故障和提高容错能力。
2.集成open feign
2.1 添加依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter</artifactId>
</dependency>
</dependencies>
注意:本次项目集成demo 使用到的 spring cloud版本为:3.1.6. spring boot 的版本为2.7.12
2.2添加配置
1.eureka 配置
因为open feign 依赖于注册中心(本次用eureka作为注册中心),需要从注册中心获取各个服务的实际地址,因此也要加入eureka 配置
eureka:
instance:
lease-renewal-interval-in-seconds: 10
# hostname: localhost
instance-id: ${spring.application.name}
ip-address: localhost
# ip-address: 111.201.151.126
server:
# eureka 服务的端口
port: 8613
#服务端30s 定时清除操作
eviction-interval-timer-in-ms: 30000
enable-self-preservation: true
sync-when-timestamp-differs: true
client:
service-url:
defaultZone: http://1.15.134.32:${eureka.server.port}/eureka
# defaultZone: http://localhost:${eureka.server.port}/eureka
#应用是否可以去拉取服务列表到本地
fetch-registry: true
# 自己是否注册服务到eureka
register-with-eureka: true
#间隔10秒去拉取,时间越短脏读越少,性能消耗大
registry-fetch-interval-seconds: 30
enabled: true
eureka-server-read-timeout-seconds: 10
2.open feign 配置
feign:
circuitbreaker:
# Feign启用断路器,默认为FALSE
enabled: true
client:
config:
# 针对所有的服务
default:
# Feign的连接建立超时时间,默认为10秒
connectTimeout: 5000
# Feign的请求处理超时时间,默认为60秒
readTimeout: 5000
# 日志级别
loggerLevel: full
# 是否对404错误码解码
# 处理逻辑详见feign.SynchronousMethodHandler#executeAndDecode
decode404: false
compression:
request:
# 开启Feign请求压缩,默认不开启
enabled: true
# 配置支持压缩的MIME TYPE,默认为:text/xml,application/xml,application/json
mime-types: text/xml,application/xml,application/json
# 触发请求数据压缩的最小Size,默认2048KB
min-request-size: 2048
response:
# 开启Feign响应压缩,默认不开启
enabled: true
# 使用GZip解码器,默认不使用
useGzipDecoder: false
注意:feign.circuitbreaker.enabled: true这个配置可能会因为用的版本不用有所差异
3.完整的配置文件
spring:
application:
name: auth
# 服务端口配置
# redis:
# host: 1.15.134.32
# port: 6379
# password: wz0515
# timeout: 5000
# jedis:
# pool:
# max-idle: 6 #最大空闲数
# max-active: 10 #最大连接数
# min-idle: 2
# max-wait: 1000
datasource:
driver-class-name: com.mysql.jdbc.Driver
url: jdbc:mysql://localhost:3060/数据库名?useSSL=false&serverTimezone=UTC&useUnicode=true&characterEncoding=utf-8
username: 账号
password: 密码
type: com.alibaba.druid.pool.DruidDataSource
druid:
# 连接池的配置信息
# 初始化大小,最小,最大
initial-size: 5
min-idle: 5
maxActive: 20
# 配置获取连接等待超时的时间
maxWait: 60000
# 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒
timeBetweenEvictionRunsMillis: 60000
# 配置一个连接在池中最小生存的时间,单位是毫秒
minEvictableIdleTimeMillis: 300000
validationQuery: SELECT 1 FROM DUAL
testWhileIdle: true
testOnBorrow: false
testOnReturn: false
poolPreparedStatements: true
maxPoolPreparedStatementPerConnectionSize: 20
web-stat-filter:
enabled: true
url-pattern: "/*" #监控哪些
exclusions: "*.js,*.gif,*.jpg,*.bmp,*.png,*.css,*.ico,/druid/*" #排除那些
stat-view-servlet:
url-pattern: "/druid/*"
reset-enable: false
# 登录名
login-username: druid账号
# 登录密码
login-password: druid密码
mvc:
pathmatch:
matching-strategy: ant_path_matcher
server:
port: 服务端口
servlet:
context-path: /auth
max-http-header-size: 2MB
# erueka 配置
eureka:
instance:
lease-renewal-interval-in-seconds: 10
# hostname: localhost
instance-id: ${spring.application.name}
ip-address: localhost
# ip-address: 111.201.151.126
server:
# eureka 服务的端口
port: 8613
#服务端30s 定时清除操作
eviction-interval-timer-in-ms: 30000
enable-self-preservation: true
sync-when-timestamp-differs: true
client:
service-url:
defaultZone: http://1.15.134.32:${eureka.server.port}/eureka
# defaultZone: http://localhost:${eureka.server.port}/eureka
#应用是否可以去拉取服务列表到本地
fetch-registry: true
# 自己是否注册服务到eureka
register-with-eureka: true
#间隔10秒去拉取,时间越短脏读越少,性能消耗大
registry-fetch-interval-seconds: 30
enabled: true
eureka-server-read-timeout-seconds: 10
# loback 日志配置文件位置
#logging:
# config: classpath:logback/logback.xml
swagger:
basePackage: com.wz
title: Swagger-${spring.application.name}接口
url: http://${eureka.instance.hostname}:${server.port}${server.servlet.context-path}/swagger-ui.html
email: 1270821038@qq.com
name: wz
swagger_version: 1.0
description: SpringCloud项目Swagger:${spring.application.name}模块接口
mybatis-plus:
mapper-locations: classpath:mapper/*.xml
type-aliases-package: com.wz.${spring.application.name}.entity
global-config:
db-config:
id-type: auto
#表名前缀为tb_,表名为前缀拼接类名(小写)
#table-prefix: tb_
configuration:
#类属性与表字段的驼峰映射,mybatiplus默认true开启,mybatis需要手动配置
map-underscore-to-camel-case: false
cache-enabled: false
feign:
circuitbreaker:
# Feign启用断路器,默认为FALSE
enabled: true
client:
config:
# 针对所有的服务
default:
# Feign的连接建立超时时间,默认为10秒
connectTimeout: 5000
# Feign的请求处理超时时间,默认为60秒
readTimeout: 5000
# 日志级别
loggerLevel: full
# 是否对404错误码解码
# 处理逻辑详见feign.SynchronousMethodHandler#executeAndDecode
decode404: false
compression:
request:
# 开启Feign请求压缩,默认不开启
enabled: true
# 配置支持压缩的MIME TYPE,默认为:text/xml,application/xml,application/json
mime-types: text/xml,application/xml,application/json
# 触发请求数据压缩的最小Size,默认2048KB
min-request-size: 2048
response:
# 开启Feign响应压缩,默认不开启
enabled: true
# 使用GZip解码器,默认不使用
useGzipDecoder: false
2.3启动类
启动类要在该服务java包下,因为集成了eureka 需要添加 @EnableEurekaClient @EnableDiscoveryClient 这两个注解,一遍服务能够被eureka 服务端发现并注册到上面
@EnableFeignClients // 集成open feign需要加这个注解
@SpringBootApplication // spring boot 启动类注解
@EnableDiscoveryClient // 服务被发现
@EnableEurekaClient //开启eureka 客户端
@ComponentScan("com.wz") //包扫描
public class authApplication {
public static void main(String[] args) {
SpringApplication.run(authApplication.class,args);
}
}
3.eureka 服务端配置
3.1添加依赖
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter</artifactId>
</dependency>
</dependencies>
注意:本次项目集成demo 使用到的 spring cloud版本为:3.1.6. spring boot 的版本为2.7.12 spring boot starter test 可以不加
3.2 添加eureka service配置文件
eureka:
instance:
lease-renewal-interval-in-seconds: 10
hostname: localhost
instance-id: ${spring.application.name}
server:
# eureka 服务的端口
port: ${server.port}
#服务端30s 定时清除操作
eviction-interval-timer-in-ms: 30000
enable-self-preservation: true
sync-when-timestamp-differs: true
client:
service-url:
defaultZone: http://${eureka.instance.hostname}:${eureka.server.port}/eureka
#应用是否可以去拉取服务列表到本地
fetch-registry: true
# 自己是否注册服务到eureka
register-with-eureka: false
#间隔10秒去拉取,时间越短脏读越少,性能消耗大
registry-fetch-interval-seconds: 30
enabled: true
eureka-server-read-timeout-seconds: 10
3.3完整eureka service 服务配置文件
spring:
application:
name: eureka
server:
port: 8613
eureka:
instance:
lease-renewal-interval-in-seconds: 10
hostname: localhost
instance-id: ${spring.application.name}
server:
# eureka 服务的端口
port: ${server.port}
#服务端30s 定时清除操作
eviction-interval-timer-in-ms: 30000
enable-self-preservation: true
sync-when-timestamp-differs: true
client:
service-url:
defaultZone: http://${eureka.instance.hostname}:${eureka.server.port}/eureka
#应用是否可以去拉取服务列表到本地
fetch-registry: true
# 自己是否注册服务到eureka
register-with-eureka: false
#间隔10秒去拉取,时间越短脏读越少,性能消耗大
registry-fetch-interval-seconds: 30
enabled: true
eureka-server-read-timeout-seconds: 10
3.4启动类
@EnableEurekaServer // eureka 服务端的注解是这个
@EnableDiscoveryClient
@SpringBootApplication
public class eurekaApplication {
public static void main(String[] args) {
SpringApplication.run(eurekaApplication.class, args);
}
}
eureka 服务的的web 界面 为 服务地址:端口 eg: localhost:8613 打开就能看的eureka web端的界面
上面是服务地址 , 左下红框为注册成功的服务。
4.使用open feign
4.1准备一个测试接口
本次demo 在query模块下 有一个查询接口
该接口完整的请求路径为:
http://localhost:8082/qury/user/query?id=10001&name= (为了方便就用了一个查询参数)
4.2准备接口
在服务调用方准备需要的接口
1.在该接口类使用 @FeignClient注解 @FeignClient(value = "qury", path = "/qury/user") value 为eureka注册中心 的服务名 path是该请求的路径,例如:该请求完整路径为: /qury/user/query 为了书写方便可以把前面相同的路径写在path上。
2.该接口的请求方式, 请求参数 ,返回对象的类型一定要和服务提供方相同
3.如果请求找不到(你感觉都对,没有什么问题的情况下) 有可能是服务名太长导致, eureka 注册中心超过4个字符找不到服务(不知道原因)这个可能是eureka有延迟,又可以请求成功了0.0 ,建议eureka刷新 调小点 例如10s刷新,或者服务刚启动不要太急进行请求.
4.如果服务名 太长 多个单词拼接的 建议使用 - 分割,不建议下划线(_)
4.3 controller调用服务
注入写的open feign 接口,调用方法
5测试
启动相关服务,本次服务的端口为8081如果我想通过open feign转发去请求query 模块的服务(http://localhost:8082/qury/user/query?id=10001&name= (为了方便就用了一个查询参数)) 则只需要调用上面controller层中的接口就好。
http://localhost:8081/auth/test/a?id=10001&name
服务经过open feign 寻找到正确的服务,请求成功!