前言:
在Spring框架中,我么可以使用RestTemplate进行微服务之间的远程调用,即一个微服务向另一个微服务发送http请求获取数据。
它的代码是这样的:
但是这样存在很大的问题:
1、代码可读性差,编程体验不统一
2、URL参数复杂,难以维护
因此我们引入声明式的http客户端Feign来进行微服务之间的远程调用,他能帮我们优雅的实现http的请求和发送。
定义和使用Feign客户端:
1、引入依赖:
org.springframework.cloud spring-cloud-starter-openfeign
2、在order-service的启动类添加注解开启Feign的功能:
3、编写Feign客户端
@FeignClient("userservice") public interface UserClient { @GetMapping("/user/{id}") User findById(@PathVariable("id") Long id); }
上面内容主要是基于SpringMVC的注解来声明远程调用的信息,比如:
服务名称:userservice
请求方式:GET
请求路径:/user/{id}
请求参数:Long id
返回值类型:User
4、用Feign客户端代替RestTemplate
自定义Feign的配置
Feign运行自定义配置来覆盖默认配置,可以修改的配置如下:
一般我们需要配置的就是日志级别。
配置Feign日志有两种方式:
方式一:配置文件方式
1、全局生效:
feign: client: config: default: # 这里用default就是全局配置,如果是写服务名称,则是针对某个微服务的配置 loggerLevel: FULL # 日志级别
2、局部生效:
feign: client: config: userservice: # 这里用default就是全局配置,如果是写服务名称,则是针对某个微服务的配置 loggerLevel: FULL # 日志级别
方式二:java代码方式,需要先声明一个Bean:
public class FeignClientConfiguration { @Bean public Logger.Level feignLogLevel(){ return Logger.Level.BASIC; } }
而后如果是全局配置,则把它放到@EnableFeignClients这个注解中:
@EnableFeignClients(defaultConfiguration = FeignClientConfiguration.class)
如果是局部配置,则把它放到@FeignClient这个注解中:
@FeignClient(value = "userservice", configuration = FeignClientConfiguration.class)
Feign的性能优化
Feign底层的客户端实现:
URLConnection:默认实现,不支持连接池
Apache HttpClient :支持连接池
OKHttp:支持连接池
因此优化Feign的性能主要包括:
使用连接池代替默认的URLConnection
日志级别,最好用basic或none
Feign的性能优化-连接池配置
Feign添加HttpClient的支持:
引入依赖:
io.github.openfeign feign-httpclient
配置连接池:
feign: client: config: default: # default全局的配置 loggerLevel: BASIC # 日志级别,BASIC就是基本的请求和响应信息 httpclient: enabled: true # 开启feign对HttpClient的支持 max-connections: 200 # 最大的连接数 max-connections-per-route: 50 # 每个路径的最大连接数
Feign的最佳实践(最佳使用方式)
方式一(继承,面向契约的编程思想,但这里耦合度增大):给消费者的FeignClient和提供者的controller定义统一的父接口作为标准。
方式二(抽取):将FeignClient抽取为独立模块,并且把接口有关的POJO、默认的Feign配置都放到这个模块中,提供给所有消费者使用
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)