1.OpenFeign是个声明式WebService客户端,使用OpenFeign让编写Web Service客户端更简单
2.它的使用方法是定义一个服务接口然后在上面添加注解
3.OpenFeign也支持可拔插式的编码器和解码器
4.Spring Cloud对OpenFeign进行了封装使其支持了Spring MVC标准注解和HttpMessageConverters
5.OpenFeign可以与Eureka和Ribbon组合使用以支持负载均衡
github.com/spring-cloud/spring-cloud-openfeign
Feign,目前已弃用:
·Feign是Spring Cloud组件中的一个轻量级RESTful的HTTP服务客户端
·Feign内置了Ribbon,用来做客户端负载均衡,去调用服务注册中心的服务。
·Feign的使用方式是:使用Feign的注解定义接口,调用服务注册中心的服务
·Feign支持的注解和用法请参考官方文档:https://github.com/OpenFeign/feign
·Feign本身不支持Spring MVC的注解,它有一套自己的注解
引入依赖
org.springframework.cloud
spring-cloud-starter-feign
OpenFeign
·OpenFeign是Spring Cloud在Feign的基础上支持了Spring MVC的注解,如@RequesMapping等等。
·OpenFeign的@FeignClient可以解析SpringMVC的@RequestMapping注解下的接口
·OpenFeign通过动态代理的方式产生实现类,实现类中做负载均衡并调用其他服务
精简一句话:OpenFeign就是在Feign基础上做了加强,有些程序员为了方便,说Feign就是指的OpenFeign
引入依赖
org.springframework.cloud
spring-cloud-starter-openfeign
对于 获取服务+负载均衡+远程调用 这样的架构,之前用的方案1,现在来使用方案2:
方案1:Ribbon+RestTemplate
方案2:OpenFeign
在consumer的pom.xml基础上,添加openfeign的依赖
org.springframework.cloud
spring-cloud-starter-openfeign
server:
port: 80 #配置端口
spring:
application:
name: e-commerce-consumer-openfeign-80 #配置在服务器显示的名字
eureka:
client:
register-with-eureka: true #将自己注册到服务端
fetch-registry: true #从服务端抓取注册列表
service-url: #注册到的服务器地址
# 使用逗号分隔多个服务器地址
defaultZone: http://eureka9001.com:9001/eureka,http://eureka9002.com:9002/eureka
@EnableEurekaClient 启用Eureka客户端
@EnableFeignClients 启用OpenFeign客户端
@SpringBootApplication
@EnableEurekaClient
@EnableFeignClients
public class MemberConsumeOpenfeignApplication {
public static void main(String[] args) {
SpringApplication.run(MemberConsumeOpenfeignApplication.class,args);
}
}
感觉还是有点绕的,理清一下思路。
浏览器地址-->Consumer(Controller.selectByIdTest->.Service.selectByIdTest->url)
-->openfeign-->Provider(url->Controller.selectById->Service->DAO)
这儿作为消费者consumer模块需要去-->调用provider的模块,需要对面的地址,所以有@GetMapping("/member/query/{id}")要使用
而注解下面的方法,是给Controller层调用的,这儿起到接口的作用来解耦。所以最好就是复制调用对象的方法,当然方法名自己可以更改(不建议),下面加了Test进行测试确认可以更名。
所以联系起来就是。Controller调用->Service接口方法,通过该方法反射到注解的路径,此时Feign来决定调用MEMBER-SERVICE-PROVIDER里面具体哪台服务器,起到负载均衡的作用。
(个人理解)这儿的Mapper是被方法所使用的,provider的Mapper是用来定位方法的。
/**
* 1.远程调用的方式是get。跟随引用的provider一致,而它又是根据方法名来选择的,比如“get”ForObject()
* 2.远程调用url http://MEMBER-SERVICE-PROVIDER/member/get/{id}。
* 经测试,大小写都能用。无论从Eureka网页复制(大写),还是pom.xml复制的(小写)都行
* 3.MEMBER-SERVICE-PROVIDER就是服务提供方在Eureka Server注册的服务
* 4.openfeign会根据负载均衡来决定调用10000/10002,默认是轮询
*/
@Component
@FeignClient("member-service-provider")
public interface MemberConsumerOpenfeignService {
@GetMapping("/member/query/{id}")
public Result selectByIdTest(@PathVariable("id")Long id);
}
@RestController。因为返回类型的缘故,需要使用Json格式,所以使用@ResponseBody的组合形式。
@RestController
public class MemberConsumerOpenfeignController {
@Resource
private MemberConsumerOpenfeignService feignService;
@GetMapping("/member/feign/query/{id}")
public Result getResultById(@PathVariable Long id){
return feignService.selectByIdTest(id);
}
启动各服务,浏览器输入:http://localhost/member/feign/query/1 。通过刷新查看返回的不同provider确定成功使用。
·配Openfeign的使用特点是微服务调用接口+@FeignClient,使用接口进行解耦
@FeignClient(value="MEMBER-SERVICE-PROVIDER"),这里MEMBER-SERVICE-PROVIDER就是Eureka提供注册的名称,不要写错了
·接口方法上:value是不能乱写,远程调用的url为
http://MEMBER-SERVICE-PROVIDER/member/get/{id}
@GetMapping(value ="/member/get/(id)")
public ResultgetMembertByld(@PathVariable("id")Long id);
说明:Feign提供了日志打印功能,可以通过配置来调整日志级别,从而对Feign接口的调用情况进行监控和输出。也便于调试。
2.日志级别
NONE:默认的,不显示任何日志
BASIC:仅记录请求方法、URL、响应状态码及执行时间;
HEADERS:除了BASIC中定义的信息之外,还有请求和响应的头信息;
FULL:除了HEADERS中定义的信息之外,还有请求和响应的正文及元数据。
设置日志级别
@Configuration
public class OpenfeignConfiguration {
@Bean
public Logger.Level setLevel(){
return Logger.Level.FULL;
}
}
常见的日志级别有5种,分别是error、warn、info、debug、trace
error:错误日志,指比较严重的错误,对正常业务有影响,需要运维配置监控的:
warn:警告日志,一般的错误,对业务影响不大,但是需要开发关注;
info:信息日志,记录排查问题的关键信息,如调用时间、出参入参等等;
debug:用于开发DEBUG的,关键逻辑里面的运行时数据;
trace:最详细的信息,一般这些信息只记录到日志文件中。
注意level下面类的全路径,指向Service,差点写错了
logging:
level:
com.stein.springcloud.service.MemberConsumerOpenfeignService: debug
不使用,可撤销测试日志配置
默认超过1s,返回超时。在两个provider的controller.selectById()添加代码:
手动设置超时。不能使用线程休眠,导致该provider无法使用
try {
// Thread.sleep(2000);
TimeUnit.MILLISECONDS.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
在consumer-openfeign的yml设置超时时长
ribbon:
#1,设置Feign客户端超时时间(openfeign,默认支铆ibbon)
#2.ReadTimeout:8000:建立连接从服务提供方获取可用资源的所用的全部时间
#3.时间单位是毫秒
ReadTimeout: 4000
#连接超时时间
ConnectionTimeout: 4000
地址栏输入:http://localhost/member/feign/query/1 查看设置前后,是否超时。