株洲网站建设公司,防止网站被克隆,成都知名网络营销公司,深圳为华网络科技有限公司文章目录 前言1. 问题分析2. 了解Feign3. 项目整合Feign3.1 引入依赖3.2 添加注解3.3 编写Feign客户端3.4 测试3.5 总结 4. 自定义配置4.1 配置文件方式4.2 Java代码方式 5. Feign使用优化5.1 引入依赖5.2 配置连接池 6. Feign最佳实践6.1 继承方式6.2 抽取方式 前言
微服务远… 文章目录 前言1. 问题分析2. 了解Feign3. 项目整合Feign3.1 引入依赖3.2 添加注解3.3 编写Feign客户端3.4 测试3.5 总结 4. 自定义配置4.1 配置文件方式4.2 Java代码方式 5. Feign使用优化5.1 引入依赖5.2 配置连接池 6. Feign最佳实践6.1 继承方式6.2 抽取方式 前言
微服务远程调用openFeign整合认识SpringCloud的一些核心组件openFeign。
1. 问题分析
先来看我们以前利用RestTemplate发起远程调用的代码
存在的问题
在服务消费者中我们把url地址硬编码到代码中不方便后期维护。在服务消费者中不清楚服务提供者的状态。服务消费者调用服务提供者时候如果出现故障能否及时发现不向用户抛出异常页面RestTemplate这种请求调用方式是否还有优化空间能不能类似于Dubbo那样玩
2. 了解Feign
Feign是一个声明式的http客户端官方地址github.com/OpenFeign/f… 其作用就是帮助我们优雅的实现http请求的发送解决上面提到的问题。
3. 项目整合Feign
Fegin的使用步骤如下
3.1 引入依赖
我们在order-service服务的pom文件中引入feign的依赖
dependencygroupIdorg.springframework.cloud/groupIdartifactIdspring-cloud-starter-openfeign/artifactId
/dependency3.2 添加注解
在order-service的启动类添加注解开启Feign的功能
3.3 编写Feign客户端
package com.cisyam.order.client;import com.cisyam.pojo.User;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;/*** author gaoziman*/
FeignClient(userservice)
public interface UserClient {/*** 通过用户后编号去获取用户对象* param id* return*/GetMapping(/user/{id})User findById(PathVariable(id) Long id);
}这个客户端主要是基于SpringMVC的注解来声明远程调用的信息比如
服务名称userservice请求方式GET请求路径/user/{id}请求参数Long id返回值类型User
这样Feign就可以帮助我们发送http请求无需自己使用RestTemplate来发送了。
3.4 测试
修改order-service中的OrderService类中的queryOrderById方法使用Feign客户端代替RestTemplate
3.5 总结
使用Feign的步骤 ① 引入依赖 ② 添加EnableFeignClients注解 ③ 编写FeignClient接口 ④ 使用FeignClient中定义的方法代替RestTemplate
4. 自定义配置
Feign可以支持很多的自定义配置如下表所示
类型作用说明feign.Logger.Level修改日志级别包含四种不同的级别NONE、BASIC、HEADERS、FULLfeign.codec.Decoder响应结果的解析器http远程调用的结果做解析例如解析json字符串为java对象feign.codec.Encoderfeign. Contract支持的注解格式默认是SpringMVC的注解feign. Retryer失败重试机制请求失败的重试机制默认是没有不过会使用Ribbon的重试
一般情况下默认值就能满足我们使用如果要自定义时只需要创建自定义的Bean覆盖默认Bean即可。
下面以日志为例来演示如何自定义配置。
4.1 配置文件方式
基于配置文件修改feign的日志级别可以针对单个服务
feign: client:config: userservice: # 针对某个微服务的配置loggerLevel: FULL # 日志级别 也可以针对所有服务
feign: client:config: default: # 这里用default就是全局配置如果是写服务名称则是针对某个微服务的配置loggerLevel: FULL # 日志级别 而日志的级别分为四种
NONE不记录任何日志信息这是默认值。BASIC仅记录请求的方法URL以及响应状态码和执行时间HEADERS在BASIC的基础上额外记录了请求和响应的头信息FULL记录所有请求和响应的明细包括头信息、请求体、元数据。
4.2 Java代码方式
也可以基于Java代码来修改日志级别先声明一个类然后声明一个Logger.Level的对象
public class DefaultFeignConfiguration {Beanpublic Logger.Level feignLogLevel(){return Logger.Level.BASIC; // 日志级别为BASIC}
}如果要全局生效将其放到启动类的EnableFeignClients这个注解中
EnableFeignClients(defaultConfiguration DefaultFeignConfiguration .class) 如果是局部生效则把它放到对应的FeignClient这个注解中
FeignClient(value userservice, configuration DefaultFeignConfiguration .class) 5. Feign使用优化
Feign底层发起http请求依赖于其它的框架。其底层客户端实现包括
URLConnection默认实现不支持连接池Apache HttpClient 支持连接池OKHttp支持连接池
因此提高Feign的性能主要手段就是使用连接池代替默认的URLConnection。 这里我们用Apache的HttpClient来演示。
5.1 引入依赖
在order-service的pom文件中引入Apache的HttpClient依赖
!--httpClient的依赖 --
dependencygroupIdio.github.openfeign/groupIdartifactIdfeign-httpclient/artifactId
/dependency5.2 配置连接池
在order-service的application.yml中添加配置
feign:client:config:default: # default全局的配置loggerLevel: BASIC # 日志级别BASIC就是基本的请求和响应信息httpclient:enabled: true # 开启feign对HttpClient的支持max-connections: 200 # 最大的连接数max-connections-per-route: 50 # 每个路径的最大连接数接下来在FeignClientFactoryBean中的loadBalance方法中打断点
Debug方式启动order-service服务可以看到这里的client底层就是Apache HttpClient
总结Feign的优化 日志级别尽量用basic 使用HttpClient或OKHttp代替URLConnection 引入feign-httpClient依赖配置文件开启httpClient功能设置连接池参数
6. Feign最佳实践
所谓 最佳时间就是使用过程中总结的经验最好的一种使用方式。 仔细的同学可以观察可以发现Feign的客户端与服务提供者的controller代码非常相似 feign客户端
UserController
有没有一种办法简化这种重复的代码编写呢 大家想到的结局方式是什么呢 这里提供两种解决方式看看你有没有想到呢
6.1 继承方式
一样的代码可以通过继承来共享
定义一个API接口利用定义方法并基于SpringMVC注解做声明。Feign客户端和Controller都集成改接口 优点
简单实现了代码共享
缺点 服务提供方、服务消费方紧耦合 参数列表中的注解映射并不会继承因此Controller中必须再次声明方法、参数列表、注解
6.2 抽取方式
将Feign的Client抽取为独立模块并且把接口有关的POJO、默认的Feign配置都放到这个模块中提供给所有消费者使用。
例如将UserClient、User、Feign的默认配置都抽取到一个feign-api包中所有微服务引用该依赖包即可直接使用。