Feign进行微服务转发的实现

1.导包,如果需要开启日志,还需要修改配置文件

java 复制代码
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-openfeign</artifactId>
        </dependency>
        <dependency>
            <groupId>io.github.openfeign</groupId>
            <artifactId>feign-okhttp</artifactId>
            <version>11.8</version>
        </dependency>

第一个包是feign的启动类

第二个包比较重要:主要就是打开http的池化功能,减少连接的消耗

  • 替换默认 HTTP 客户端

    • Feign 默认使用 JDK 的 HttpURLConnection 作为底层 HTTP 客户端。

    • 如果你引入了 feign-okhttp,Feign 会自动检测并切换到 OkHttp 作为 HTTP 实际调用器。

  • 性能和功能优势

    • 连接池 :OkHttp 内建高效的连接复用与长连接管理,比 HttpURLConnection 的连接复用更稳定。

    • 异步调用:支持同步和异步请求,便于在必要时进行非阻塞 I/O。

    • 更丰富的配置:可以灵活控制超时、重试、拦截器、拦截器链、请求缓存等高级功能。

    • 更好的日志与调试:通过 OkHttp 的拦截器,能够非常方便地对请求/响应进行统一加工、日志、签名、Mock 等操作。

2.配置client

在我学习的项目中,单独拆分一个api模块,该模块用于存放公用工具以及各种服用模块,client自然也放在其中,这算是横向拆分的一种。我的项目按照功能拆分,所以总体是纵向拆分,从这体现出纵向拆分与横向拆分是互补共存的。

配置client采取feign的类似于SpringMVC的形式来调用远程微服务接口,比如:

java 复制代码
@FeignClient(value = "cart-service")
public interface CartClient {
    @DeleteMapping("/carts")
    public void deleteCartItemByIds(@RequestParam("ids") Collection<Long> ids);
}

value需要填写调用的微服务名称,这个名称是在配置文件中定义的,片段配置文件如下:

javascript 复制代码
server:
  port: 8082
spring:
  application:
    name: cart-service
  profiles:
    active: dev
  cloud:
    nacos:
      server-addr: 127.0.0.1:8848
      config:
        import-check:
          enabled: false  # 暂时禁用导入检查
      discovery:
        enabled: true
        namespace: public
        cluster-name: DEFAULT
        group: DEFAULT_GROUP

3.重点,容易遗忘的一点:假设A模块调用B模块的内容,调用过程是A请求client,client通过网络连接请求B,B执行对应接口内容,返回A具体执行结果。

但是问题是,现在的client存放在单独的复用模块,在我的项目中命名为api模块,那么api模块是不需要去启动的,那么A模块如何去自动注入client代理的实例?显然需要让A模块找到需要的client对象。

所以,一定不要忘记去在A模块的启动项中添加扫描feign对应client的注解!!!!

java 复制代码
@SpringBootApplication
@MapperScan("com.hxy.cartservice.mapper")
@EnableDiscoveryClient
@EnableFeignClients(basePackages = "com.hxy.hmapi.client",defaultConfiguration = {DefaultFeignConfig.class})
public class CartServiceApplication {

    public static void main(String[] args) {
        SpringApplication.run(CartServiceApplication.class, args);
    }
}

这里的@EnableFeignClients(basePackages = "com.hxy.hmapi.client",defaultConfiguration = {DefaultFeignConfig.class})标红部分就是标记对应client包,而剩余部分就是开启日志功能

相关推荐
Leo July7 小时前
【Java】Spring Security 6.x 全解析:从基础认证到企业级权限架构
java·spring·架构
聆风吟º8 小时前
Oracle到KingbaseES数据库迁移:全流程实战指南与避坑总结
数据库·oracle·数据库迁移·kingbasees
哈__8 小时前
Oracle至KingbaseES数据库迁移全攻略:痛点拆解、配置实操与问题排查
数据库·oracle
星火开发设计8 小时前
C++ 数组:一维数组的定义、遍历与常见操作
java·开发语言·数据结构·c++·学习·数组·知识
码道功成8 小时前
Pycham及IntelliJ Idea常用插件
java·ide·intellij-idea
JZC_xiaozhong8 小时前
电商ERP如何同步订单数据到MySQL?集成方案解析
数据库·mysql·数据分析·etl工程师·嵌入式实时数据库·电商erp集成·数据集成与应用集成
消失的旧时光-19438 小时前
第四篇(实战): 订单表索引设计实战:从慢 SQL 到毫秒级
java·数据库·sql
知识分享小能手9 小时前
Oracle 19c入门学习教程,从入门到精通, Oracle 表空间与数据文件管理详解(9)
数据库·学习·oracle
それども9 小时前
@ModelAttribute vs @RequestBody
java
sichuanwuyi9 小时前
Wydevops工具的价值分析
linux·微服务·架构·kubernetes·jenkins