2026/4/18 4:27:07
网站建设
项目流程
上孩做网站,wordpress 效率,网站建设 技术团队,网页设计个人简介一 OpenFeign介绍 OpenFeign是一种基于Spring Cloud的声明式REST客户端#xff0c;它简化了与HTTP服务交互的过程。它将REST客户端的定义转化为Java接口#xff0c;并且可以通过注解的方式来声明请求参数、请求方式、请求头等信息#xff0c;从而使得客户端的使用更加方便和…一 OpenFeign介绍OpenFeign是一种基于Spring Cloud的声明式REST客户端它简化了与HTTP服务交互的过程。它将REST客户端的定义转化为Java接口并且可以通过注解的方式来声明请求参数、请求方式、请求头等信息从而使得客户端的使用更加方便和简洁。同时它还提供了负载均衡和服务发现等功能可以与Eureka、Consul等注册中心集成使用。参考文档官方文档二 调用组件Spring Cloud OpenFeign示例1. 引入OpenFeign依赖在父模块或服务模块引入依赖!-- OpenFeign服务调用--dependencygroupIdorg.springframework.cloud/groupIdartifactIdspring-cloud-starter-openfeign/artifactId/dependency!-- 负载均衡器--dependencygroupIdorg.springframework.cloud/groupIdartifactIdspring-cloud-starter-loadbalancer/artifactId/dependency2. 在启动类开启EnableFeignClients注解// 开启feign 功能EnableFeignClientsEnableDiscoveryClientSpringBootApplicationpublicclassOrderServiceApplication{publicstaticvoidmain(String[]args){SpringApplication.run(OrderServiceApplication.class,args);}}3.编写OpenFeign客户端// 调用自有服务FeignClient(valueuser-service)publicinterfaceUserFeignClient{GetMapping(/user/{id})UserEntitygetUserById(PathVariable(id)Longid);}//调用第三方应用服务可以设置调用接口urlFeignClient(valuexxxxx-service,urlhttps://xxxxx)publicinterfaceXxxxFeignClient{GetMapping(/xxxx/{id})XxxxEntitygetXxxxById(PathVariable(id)Longid);}4.像调用本地方式一样调用远程微服务提供者RequestMapping(/api/order)RestControllerpublicclassOrderController{AutowiredUserFeignClientuserFeignClient;GetMapping(/orderUser/{id})publicUserEntitygetUSerById(PathVariable(id)Longid){returnuserFeignClient.getUserById(id);}}5.OpenFeign调用流程三 OpenFeign其他功能支持1. 日志配置每个创建的 Feign 客户端都会创建一个logger。在调试程序时配置Feign的日志了打印出Feign的请求信息来。NONE, 没日志默认。BASIC, 只记录请求方法和URL以及响应状态代码和执行时间。HEADERS, 记录基本信息以及请求和响应头。FULL, 记录请求和响应的header、正文和元数据。配置javaBeanConfigurationpublicclassOrderConfig{BeanLogger.LevelfeignLoggerLevel(){returnLogger.Level.FULL;}}添加yml 配置spring:cloud:openfeign:client:config:#全局default:logger-level:full#对应feign服务名user-service:logger-level:full2. 超时时间设置open Feign使用两个超时参数connect Timeout 连接超时可以防止由于较长的服务器处理时间而阻塞调用者。readTimeout 请求处理超时从连接建立时开始应用当返回响应花费太长时间时触发。添加yml 配置spring:cloud:openfeign:client:config:#全局default:logger-level:fullconnect-timeout:3000read-timeout:3000#对应feign服务名user-service:logger-level:fullconnect-timeout:3000read-timeout:50003. 客户端组件配置Feign 中默认使用 JDK 原生的 URLConnection 发送 HTTP 请求没有连接池可以集成别的组件来替换掉 URLConnection比如 Apache HttpClient5OkHttp。父pom 引入依赖dependencygroupIdio.github.openfeign/groupIdartifactIdfeign-hc5/artifactId/dependency添加yml 配置spring:cloud:openfeign:#使用 Apache HttpClient 5httpclient:hc5:enable:trueclient:config:#全局default:logger-level:fullconnect-timeout:3000read-timeout:3000#对应feign服务名user-service:logger-level:fullconnect-timeout:3000read-timeout:50004.拦截器配置通常我们调用的接口都是有权限控制的很多时候可能认证的值是通过参数传递的还有就是通过请求头去传递认证信息。设置feign拦截器每次 feign 发起http调用之前会去执行拦截器中的逻辑。使用场景统一添加 header 信息对 body 中的信息做修改或替换packageorg.example.interceptor;importfeign.RequestInterceptor;importfeign.RequestTemplate;importjakarta.servlet.http.HttpServletRequest;importlombok.extern.slf4j.Slf4j;importorg.springframework.stereotype.Component;importorg.springframework.web.context.request.RequestContextHolder;importorg.springframework.web.context.request.ServletRequestAttributes;importjava.util.UUID;Slf4jComponentpublicclassXTokenRequestInterceptorimplementsRequestInterceptor{/** * feign请求拦截器将共享数据传到下游 * param template */Overridepublicvoidapply(RequestTemplatetemplate){// 业务逻辑 模拟认证逻辑ServletRequestAttributesattributes(ServletRequestAttributes)RequestContextHolder.getRequestAttributes();if(null!attributes){HttpServletRequestrequestattributes.getRequest();Stringaccess_tokenrequest.getHeader(Authorization);//设置tokentemplate.header(Authorization,access_token);}}/** * 自定义拦截器 * return */BeanpublicXTokenRequestInterceptorfeignAuthRequestInterceptor(){returnnewXTokenRequestInterceptor();}}