个人网站空间价格,seo优化工作内容做什么,wap网站建设是什么,个人可以做聊天网站备案吗1.什么是Feign
Feign是一种声明式、模板化的HTTP客户端#xff0c;可用于调用HTTP API实现微服务之间的远程服务调用。它的特点是使用少量的配置定义服务客户端接口#xff0c;可以实现简单和可重用的RPC调用。
先来看我们以前利用RestTemplate发起远程调用的代码#xff…1.什么是Feign
Feign是一种声明式、模板化的HTTP客户端可用于调用HTTP API实现微服务之间的远程服务调用。它的特点是使用少量的配置定义服务客户端接口可以实现简单和可重用的RPC调用。
先来看我们以前利用RestTemplate发起远程调用的代码
存在下面的问题
•代码可读性差编程体验不统一
•参数复杂URL难以维护
2. Feign远程调用
2.1. Feign替代RestTemplate
Fegin的使用步骤如下
2.1.1. 引入依赖
我们在order-service服务的pom文件中引入feign的依赖
dependencygroupIdorg.springframework.cloud/groupIdartifactIdspring-cloud-starter-openfeign/artifactId
/dependency
2.1.2. 添加注解
在order-service的启动类添加注解开启Feign的功能 2.1.3. 编写Feign客户端
在order-service中新建一个接口内容如下
package cn.itcast.order.client;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(userservice)
public interface UserClient {GetMapping(/user/{id})User findById(PathVariable(id) Long id);
}
这个客户端主要是基于SpringMVC的注解来声明远程调用的信息比如 服务名称userservice 请求方式GET 请求路径/user/{id} 请求参数Long id 返回值类型User
这样Feign就可以帮助我们发送http请求无需自己使用RestTemplate来发送了。
2.1.4. 测试
修改order-service中的OrderService类中的queryOrderById方法使用Feign客户端代替RestTemplate 是不是看起来优雅多了。
5总结
使用Feign的步骤
① 引入依赖
② 添加EnableFeignClients注解
③ 编写FeignClient接口
④ 使用FeignClient中定义的方法代替RestTemplate
2.2 Feign的自定义配置
Feign可以支持很多的自定义配置如下表所示
类型作用说明feign.Logger.Level修改日志级别包含四种不同的级别NONE、BASIC、HEADERS、FULLfeign.codec.Decoder响应结果的解析器http远程调用的结果做解析例如解析json字符串为java对象feign.codec.Encoder请求参数编码将请求参数编码便于通过http请求发送feign. Contract支持的注解格式默认是SpringMVC的注解feign. Retryer失败重试机制请求失败的重试机制默认是没有不过会使用Ribbon的重试 一般情况下默认值就能满足我们使用如果要自定义时只需要创建自定义的Bean覆盖默认Bean即可。
下面以日志为例来演示如何自定义配置。
2.2.1. 配置文件方式
基于配置文件修改feign的日志级别可以针对单个服务
feign: client:config: userservice: # 针对某个微服务的配置loggerLevel: FULL # 日志级别
也可以针对所有服务
feign: client:config: default: # 这里用default就是全局配置如果是写服务名称则是针对某个微服务的配置loggerLevel: FULL # 日志级别
而日志的级别分为四种 NONE不记录任何日志信息这是默认值。 BASIC仅记录请求的方法URL以及响应状态码和执行时间 HEADERS在BASIC的基础上额外记录了请求和响应的头信息 FULL记录所有请求和响应的明细包括头信息、请求体、元数据。
2.2.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) 3. Feign最佳实践
所谓最近实践就是使用过程中总结的经验最好的一种使用方式。
自习观察可以发现Feign的客户端与服务提供者的controller代码非常相似
feign客户端
UserController 有没有一种办法简化这种重复的代码编写呢
当然有
3.1. 继承方式不推荐
一样的代码可以通过继承来共享
1定义一个API接口利用定义方法并基于SpringMVC注解做声明。
2Feign客户端和Controller都集成改接口 优点 简单 实现了代码共享
缺点 服务提供方、服务消费方紧耦合 参数列表中的注解映射并不会继承因此Controller中必须再次声明方法、参数列表、注解 3.2. 抽取方式
将Feign的Client抽取为独立模块并且把接口有关的POJO、默认的Feign配置都放到这个模块中提供给所有消费者使用。
例如将UserClient、User、Feign的默认配置都抽取到一个feign-api包中所有微服务引用该依赖包即可直接使用。 3.3. 基于抽取的最佳实践
3.3.1. 抽取
首先创建一个module命名为feign-api 项目结构 在feign-api中然后引入feign的starter依赖
dependencygroupIdorg.springframework.cloud/groupIdartifactIdspring-cloud-starter-openfeign/artifactId
/dependency
然后order-service中编写的UserClient、User、DefaultFeignConfiguration都复制到feign-api项目中 3.3.2. 在order-service中使用feign-api
首先删除order-service中的UserClient、User、DefaultFeignConfiguration等类或接口。
在order-service的pom文件中中引入feign-api的依赖
dependencygroupIdcn.itcast.demo/groupIdartifactIdfeign-api/artifactIdversion1.0/version
/dependency
修改order-service中的所有与上述三个组件有关的导包部分改成导入feign-api中的包
3.3.3. 重启测试
重启时发现服务报错 这是因为UserClient现在在cn.itcast.feign.clients包下
而order-service的EnableFeignClients注解是在cn.itcast.order包下不在同一个包无法扫描到UserClient。order-service的启动类默认扫描cn.itcast.order包
3.3.4. 解决扫描包的问题
方式1不推荐
指定Feign应该扫描的包
EnableFeignClients(basePackages cn.itcast.feign.clients) 方式二
指定需要加载的Client接口
EnableFeignClients(clients {UserClient.class})
3.3.5. 重启
重启测试结果 成功