HTTP客户端Feign

2023-12-29 18:16:58

HTTP客户端Feign;Feign远程调用

如果想了解前置知识,或者是nacos等可以看下这篇文章

https://blog.csdn.net/weixin_46533577/article/details/135289155

Feign使用

踩坑注意!!!

这里面会有一个坑,如果在调用接口时会出现以下错误。

12-29 15:41:17:362 ERROR 26604 --- [           main] c.a.n.c.config.http.ServerHttpAgent      : [NACOS SocketTimeoutException httpGet] currentServerAddr:http://localhost:8848, err : connect timed out
12-29 15:41:18:377 ERROR 26604 --- [           main] c.a.n.c.config.http.ServerHttpAgent      : [NACOS SocketTimeoutException httpGet] currentServerAddr:http://localhost:8848, err : connect timed out

最后超时了

java.net.ConnectException: no available server
	at com.alibaba.nacos.client.config.http.ServerHttpAgent.httpGet(ServerHttpAgent.java:134) ~[nacos-client-1.4.1.jar:na]
	at com.alibaba.nacos.client.config.http.MetricsHttpAgent.httpGet(MetricsHttpAgent.java:51) ~[nacos-client-1.4.1.jar:na]
	at com.alibaba.nacos.client.config.impl.ClientWorker.getServerConfig(ClientWorker.java:274) ~[nacos-client-1.4.1.jar:na]
	at com.alibaba.nacos.client.config.NacosConfigService.getConfigInner(NacosConfigService.java:155) [nacos-client-1.4.1.jar:na]
	at com.alibaba.nacos.client.config.NacosConfigService.getConfig(NacosConfigService.java:98) [nacos-client-1.4.1.jar:na]
	at com.alibaba.cloud.nacos.client.NacosPropertySourceBuilder.loadNacosData(NacosPropertySourceBuilder.java:85) [spring-cloud-starter-alibaba-nacos-config-2.2.5.RELEASE.jar:2.2.5.RELEASE]
	at com.alibaba.cloud.nacos.client.NacosPropertySourceBuilder.build(NacosPropertySourceBuilder.java:73) [spring-cloud-starter-alibaba-nacos-config-2.2.5.RELEASE.jar:2.2.5.RELEASE]

需要在配置中添加bootstrap.yaml

由于我是将nacos放在虚拟机中运行的,并不是本地,所以最后会出现localhost的地址,但是本地又没有,所以会报错。

因为设置的默认代理是本地的,必须要让其知道,需要添加bootstrap.yaml在里面;配置好nacos地址

最重要的是!!!!

如果你又设置了namespace需要让你要调用的服务和调用的服务存在同一个namespace下!!!

不然还是会报错说找不到xxx服务只是不会报本地的错误了。

spring:
  application:
    name:  order-service # 服务名称
  profiles:
    active: dev #开发环境,这里是dev
  cloud:
    nacos:
      server-addr: 192.168.2.82:8848
      config:
        file-extension: yaml
#        namespace: 5d7b6c65-7ab8-440e-b580-6f060613913a # 你的命名空间

在这里插入图片描述

第一步、引依赖

pom.xml中引入依赖

<!-- feign -->
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>

第二步、打开Feign开关

在启动类上加上@EnableFeignClients

@EnableFeignClients

在这里插入图片描述

第三步、设置接口准备调用

@FeignClient后面要设置服务的名称,这个和你在配置文件中设置的有关,注意看下面的图。

如果在application.yml中配置了但是又在bootstrap.yaml配置了会以bootstrap.yaml中为准因为nacos将`bootstrap.yaml权重较高。

import cn.itcast.order.pojo.User;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;

@FeignClient("user-service")
public interface UserClients {
    @GetMapping("/user/{id}")
    User findById(@PathVariable("id") Long id);
}

在这里插入图片描述

第四步、调用接口

之后发送请求时就完成了远程调用。

这里会有个坑,也就是本篇文章最上面的哪个,如果有类似情况可以看下。

在这里插入图片描述

测试一下是否可以。没有问题。

在这里插入图片描述

自定义配置

Feign自定义配置

feign.Logger.Level修改日志级别包含四种不同的级别:NONE、BASIC、HEADERS、FULL
类型作用说明
feign.codec.Decoder响应结果的解析器http远程调用的结果做解析,例如解析json字符串为java对象
feign.codec.Encoder请求参数编码将请求参数编码,便于通过http请求发送
feign. Contract支持的注解格式默认是SpringMVC的注解
feign. Retryer失败重试机制请求失败的重试机制,默认是没有,不过会使用Ribbon的重试

配置日志级别

配置文件修改
feign:
  client:
    config:
      default:
        logger-level: FULL #设置日志级别

在这里插入图片描述

Java代码修改
创建配置类
import feign.Logger;
import org.springframework.context.annotation.Bean;

public class DefaultFeignConfiguration {
    @Bean
    public Logger.Level logLevel() {
        return Logger.Level.BASIC;
    }
}

在这里插入图片描述

设置生效方式

针对某个服务生效

如果只是针对某个服务可以这样做,在后面加上configuration

在这里插入图片描述

如果想针对全局生效

需要在启动类上加上defaultConfiguration

在这里插入图片描述

性能优化

Feign底层的客户端实现:

  • URLConnection:默认实现,不支持连接池.
  • Apache HttpClient :支持连接池
  • oKHttp:支持连接池

因此优化Feign的性能主要包括:

  1. 使用连接池代替默认的URLConnection
  2. 日志级别,最好用basic或none

引入依赖

<!--httpClient的依赖 -->
<dependency>
    <groupId>io.github.openfeign</groupId>
    <artifactId>feign-httpclient</artifactId>
</dependency>

配置文件中修改

这个值并不是固定的,在实际中需要使用压测;max-connectionsmax-connections-per-route

feign:
  httpclient:
    enabled: true # 支持HttpClient开关
    max-connections: 200 # 最大连接数--在真实业务中需要测试这两个值
    max-connections-per-route: 50 # 单个路径最大连接数---在真实业务中需要测试这两个值

最佳实践

所谓最近实践,就是使用过程中总结的经验,最好的一种使用方式。

实现基于抽取的最佳实践

新建一个feign-api模块

在这里插入图片描述

在feign-api中然后引入feign的starter依赖

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>

在这里插入图片描述

之后将需要拆分的内容放入以下

如:order-service中编写的UserClient、User、DefaultFeignConfiguration都复制到feign-api项目中

在这里插入图片描述

在order-service中使用feign-api

在order-service的pom文件中中引入feign-api的依赖:

<dependency>
    <groupId>cn.itcast.demo</groupId>
    <artifactId>feign-api</artifactId>
    <version>1.0</version>
</dependency>

重启测试

发现报错,但是依赖确实是引入了,order-service的@EnableFeignClients注解是在cn.itcast.order包下,不在同一个包,无法扫描到UserClient。

解决扫描包问题

在这里插入图片描述

两种方式
第一种

这种是大范围扫描,如果有批量的可以这么做,这么做不精准

@EnableFeignClients(basePackages = "cn.bunny.web.clients", defaultConfiguration = DefaultFeignConfiguration.class)
第二种

这种是将包直接导入进去,实现精准的找到包

@EnableFeignClients(clients = UserClients.class, defaultConfiguration = DefaultFeignConfiguration.class)

文章来源:https://blog.csdn.net/weixin_46533577/article/details/135294678
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。