三、springcloud之服务调用Feign

一、背景

项目中接口调用:

  • Httpclient
  • Okhttp
  • Httpurlconnection
  • RestTemplate

微服务提供了更简单,方便的Feign

二、Feign简介

  • Feign是一个声明式的REST客户端,它的目的就是让REST调用更加简单。
  • Feign提供了HTTP请求的模板,通过编写简单的接口和插入注解,就可以定义好HTTP请求的参数、格式、地址等信息。
  • 而Feign则会完全代理HTTP请求,我们只需要像调用方法一样调用它就可以完成服务请求及相关处理。
  • SpringCloud对Feign进行了封装,使其支持SpringMVC标准注解和HttpMessageConverters。
  • Feign可以与Eureka和Ribbon组合使用以支持负载均衡。

三、使用

1.准备:  

  1.gradle:

compile('org.springframework.cloud:spring-cloud-starter-feign')

  2.在应用主类中通过@EnableFeignClients注解开启Feign功能,具体如下: 

  @EnableFeignClients可以指定扫描的包。如@EnableFeignClients(com.test)

@SpringBootApplication
@EnableDiscoveryClient
@EnableFeignClients
public class MyApplication { public static void main(String[] args) {
SpringApplication.run(MyApplication.class, args);
} }

2.绑定服务

     1.服务提供方提供接口

  2.消费方继承接口,添加注解

@FeignClient(name = "微服务之间调用直接在name处输入服务名,其他rest需要指定url", url = "${yml配置文件url地址}", fallback = HystrixLawsFallback.class, configuration = MyFeignConfig.class)
public interface ServiceClient { @RequestMapping(method = RequestMethod.GET, value = "/client/{id}")
ClientVo getClient(@RequestParam("id") String id);
}

  

@FeignClient

  name/value:微服务之间调用直接在name处输入服务名,其他rest需要指定url,若是没有其他可以省略

      原有serviceId已废弃

  url:指定访问路径RequestMapping表明相对路径

  fallback:Feign熔断器回调

  configuration:可以让你自定义配置信息来覆盖Feign的默认配置

  value:表示你要消费哪个服务的接口

  path:就是统一的前缀

  该注解表示申明创建一个rest client bean,可以直接通过Autowired注入使用,如果ribbon在工程中启用,则会使用load balance进行后端请求调用,可以为FeignClient指定value表明需要访问的serviceId

说明:

  fallback = HystrixServiceFallback.class为熔断返回处理

@Component
public class HystrixServiceFallback implements Client { @Override
public ClientVo getClient(String id) {
ClientVo client = new FClientVo();
client.setName(false);
return client;
} }

  configuration = MyFeignConfig.class配置日志输出

@Configuration
public class MyFeignConfig {
@Bean
Logger.Level feignLoggerLevel() {
return Logger.Level.FULL;
}
}

level级别:

NONE:不记录任何信息

BASIC:仅记录请求方法、URL以及响应状态码和执行时间

HEADERS:BASIC信息加上请求和响应的头信息

FULL:记录所有请求与响应的明细,包括头信息、请求体、元数据等。

3.调用

  controller直接注入使用:

  @Autowired
private ServiceClient serviceClient; @GetMapping("{id}")
public ClientVo getClient(@PathVariable String id) throws Exception {
ClientVo client = serviceClient.getClient(id);
return client;
}

Feign的源码实现的过程:

首先通过@EnableFeignCleints注解开启FeignCleint
根据Feign的规则实现接口,并加@FeignCleint注解
程序启动后,会进行包扫描,扫描所有的@ FeignCleint的注解的类,并将这些信息注入到ioc容器中。
当接口的方法被调用,通过jdk的代理,来生成具体的RequesTemplate
RequesTemplate在生成Request
Request交给Client去处理,其中Client可以是HttpUrlConnection、HttpClient也可以是Okhttp
最后Client被封装到LoadBalanceClient类,这个类结合类Ribbon做到了负载均衡。
上一篇:oracle11g创建数据库最后一步确定时弹出无法创建目录


下一篇:P2055 [ZJOI2009]假期的宿舍