fegin

张开发
2026/4/29 19:04:00 15 分钟阅读

分享文章

fegin
我们讲一下fegin这个技术栈的全域理解首先还是要讲这个背景假如两个springboot分别是a和b都已经注册到nacos上我们不考虑使用dubbo这个rpc去进行处理两个springboot如何去进行交互就是接口互相调用1.使用resttemplate这个工具类调用http请求。但是这个太复杂了。于是有了这个fegin这个技术栈。封装了让springboot可以调用http请求的需要处理的技术点这里我讲一个点绕不开的。就是底层代码已经写好了我们作为开发者要去理解的事这个技术栈提供了哪些机制去处理这些问题。这些机制涉及哪些领域。去哪里配置这个是我们学习这个技术栈学习的内容1.fegin的对于springboot引入这个技术栈要做的配置是什么2.fegin底层是实现原理是什么需要配置哪些领域3.具体在代码中如何使用feginFeign的核心价值就是让开发者像调用本地方法一样调用远程服务从而屏蔽底层的HTTP通信复杂性。下面我来系统地梳理你提出的三个问题形成一个对Feign技术栈的全域理解。1. Feign的引入与基础配置要在项目中使用Feign有三个必不可少的步骤加依赖在Spring Boot项目的pom.xml中引入Spring Cloud OpenFeign的起步依赖。dependencygroupIdorg.springframework.cloud/groupIdartifactIdspring-cloud-starter-openfeign/artifactId/dependency启功能在Spring Boot的启动类上添加EnableFeignClients注解激活Feign的自动配置和扫描功能。SpringBootApplicationEnableFeignClients// 开启Feign客户端功能publicclassApplication{publicstaticvoidmain(String[]args){SpringApplication.run(Application.class,args);}}写客户端创建一个Java接口并用FeignClient注解标记在注解中指定你要调用的目标服务名例如在Nacos中注册的服务名。// “userservice” 是目标服务在Nacos中的服务名FeignClient(userservice)publicinterfaceUserClient{// 这个方法的声明精准地“翻译”了要调用的远端APIGetMapping(/user/{id})// 请求方式 路径UserfindById(PathVariable(id)Longid);// 请求参数 返回值}完成以上三步后你就可以在其他组件如Service或Controller中像使用普通Spring Bean一样注入并使用UserClient了。2. Feign的底层实现原理与核心机制Feign之所以能“凭空”调用接口魔法就在于动态代理和声明式注解解析。它的工作流程可以分为以下几个核心阶段启动阶段动态代理工厂的创建当应用启动时EnableFeignClients注解会触发一个包扫描器FeignClientsRegistrar。扫描器会找出所有被FeignClient标记的接口并为每一个接口动态地生成一个代理对象然后把这个代理对象注册到Spring容器中。这就解释了为什么接口没有实现类也能被Autowired注入。调用阶段代理对象的工作流程当你在代码中调用userClient.findById(1L)时实际调用的是那个由Feign生成的代理对象。注解解析Contract代理对象会解析该方法上的Spring MVC注解如GetMapping、PathVariable将这些注解“翻译”成一个标准的HTTP请求对象此时请求的路径是/user/1目标服务名是userservice。负载均衡Feign无缝集成了Ribbon或Spring Cloud LoadBalancer。它将服务名userservice交给负载均衡器负载均衡器会从服务发现中心如Nacos获取userservice的一个健康实例的IP和端口例如10.0.0.5:8080。编码与发起请求Encoder ClientFeign使用Encoder组件将方法参数如id1L编码成请求参数或请求体。然后通过内部的Client组件默认是URLConnection可优化为HttpClient或OKHttp将构建好的HTTP请求发送到http://10.0.0.5:8080/user/1。解码与返回Decoder收到远端服务的HTTP响应后Feign使用Decoder组件将返回的JSON字符串或其他格式解码成方法定义的User对象最终返回给调用方。3. Feign的可配置领域与调优要深入使用Feign需要掌握以下几个关键的配置领域你可以在application.yml文件中或通过Java配置类进行定制配置领域作用与机制配置方式示例 (application.yml)日志级别用于调试可查看请求和响应的详细信息。NONE,BASIC,HEADERS,FULL四个级别推荐开发环境用FULL。logging.level.com.example.feign.UserClient: DEBUG或针对服务的Feign配置feign.client.config.userservice.loggerLevel: full连接池默认使用URLConnection无连接池在高并发下性能较差。强烈建议替换为支持连接池的Apache HttpClient或OKHttp以提升性能。先引入feign-httpclient依赖再配置feign.httpclient.enabled: truefeign.httpclient.max-connections: 200超时控制防止调用远端时线程被长时间阻塞。分为connectTimeout建立连接的超时和readTimeout收到数据前的超时。feign.client.config.default.connectTimeout: 5000feign.client.config.default.readTimeout: 5000请求拦截器一个强大的扩展点。可以为所有Feign请求添加通用的请求头如认证Token、Trace ID等。需要实现RequestInterceptor接口并注册为一个Bean。熔断降级(可选) 集成Sentinel或Resilience4j后可以为Feign接口指定一个Fallback类当服务调用失败或超时时执行降级逻辑返回默认结果提高系统韧性。需要开启熔断支持并创建Component类实现UserClient接口作为Fallback。最后关于你提到的Nacos注册中心Feign可以无缝配合。你只需要在application.yml中正确配置Nacos服务发现地址即可。在你的FeignClient(name userservice)中Feign会拿着userservice这个名字去Nacos中查询该服务的所有可用实例列表再交给其内置的负载均衡器进行选择。这个过程中你无需编写任何代码去主动集成Nacos。

更多文章