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包,而剩余部分就是开启日志功能

相关推荐
恒悦sunsite30 分钟前
Ubuntu之apt安装ClickHouse数据库
数据库·clickhouse·ubuntu·列式存储·8123
奥尔特星云大使1 小时前
MySQL 慢查询日志slow query log
android·数据库·mysql·adb·慢日志·slow query log
来自宇宙的曹先生1 小时前
MySQL 存储引擎 API
数据库·mysql
间彧1 小时前
MySQL Performance Schema详解与实战应用
数据库
间彧1 小时前
MySQL Exporter采集的关键指标有哪些,如何解读这些指标?
数据库
weixin_446260852 小时前
Django - 让开发变得简单高效的Web框架
前端·数据库·django
mpHH2 小时前
babelfish for postgresql 分析--todo
数据库·postgresql
zizisuo2 小时前
解决在使用Lombok时maven install 找不到符号的问题
java·数据库·maven
笨蛋少年派2 小时前
JAVA基础语法
java·开发语言
Haooog3 小时前
654.最大二叉树(二叉树算法)
java·数据结构·算法·leetcode·二叉树