HTTP客户端Feign
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的性能主要包括:
- 使用连接池代替默认的URLConnection
- 日志级别,最好用basic或none
引入依赖
<!--httpClient的依赖 -->
<dependency>
<groupId>io.github.openfeign</groupId>
<artifactId>feign-httpclient</artifactId>
</dependency>
配置文件中修改
这个值并不是固定的,在实际中需要使用压测;max-connections
和max-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)
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!