一、背景
项目中接口调用:
- Httpclient
- Okhttp
- Httpurlconnection
- RestTemplate
微服务提供了更简单,方便的Feign
二、Feign简介
- Feign是一个声明式的REST客户端,它的目的就是让REST调用更加简单。
- Feign提供了HTTP请求的模板,通过编写简单的接口和插入注解,就可以定义好HTTP请求的参数、格式、地址等信息。
- 而Feign则会完全代理HTTP请求,我们只需要像调用方法一样调用它就可以完成服务请求及相关处理。
- SpringCloud对Feign进行了封装,使其支持SpringMVC标准注解和HttpMessageConverters。
- Feign可以与Eureka和Ribbon组合使用以支持负载均衡。
三、使用
准备:
1.gradle:
compile('org.springframework.cloud:spring-cloud-starter-feign')
2.在应用主类中通过@EnableFeignClients
注解开启Feign功能,具体如下:
@SpringBootApplication @EnableDiscoveryClient @EnableFeignClients public class MemberApplication { public static void main(String[] args) { SpringApplication.run(MemberApplication.class, args); } }
调用:
1.服务提供方提供接口
2.消费方继承接口,添加注解
@FeignClient(name = "微服务之间调用直接在name处输入服务名,其他rest需要指定url", url = "${member.thirdparty.laws}", fallback = HystrixLawsFallback.class, configuration = MyFeignConfig.class) public interface LawsClient { /** * 根据客户号获得客户信息 * * @param clientNum * @return FClientInfo */ @RequestMapping(method = RequestMethod.GET, value = "/client/info") FClientInfo getClient(@RequestParam("clientNum") String clientCode); }
@FeignClient里的value表示你要消费哪个服务的接口,path就是统一的前缀
该注解表示申明创建一个rest client bean,可以直接通过Autowired
注入使用,如果ribbon在工程中启用,则会使用load balance
进行后端请求调用,可以为FeignClient
指定value表明需要访问的serviceId
url
指定访问路径RequestMapping
表明相对路径
@RequestMapping(“/house”)的地址
@FeignClient里的configuration可以让你自定义配置信息来覆盖Feign的默认配置,
说明:
fallback = HystrixLawsFallback.class为熔断返回处理
@Component public class HystrixLawsFallback implements LawsClient { @Override public FClientInfo getClient(String clientCode) { FClientInfo client = new FClientInfo(); client.setPassed(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:记录所有请求与响应的明细,包括头信息、请求体、元数据等。
Feign的源码实现的过程:
首先通过@EnableFeignCleints注解开启FeignCleint
根据Feign的规则实现接口,并加@FeignCleint注解
程序启动后,会进行包扫描,扫描所有的@ FeignCleint的注解的类,并将这些信息注入到ioc容器中。
当接口的方法被调用,通过jdk的代理,来生成具体的RequesTemplate
RequesTemplate在生成Request
Request交给Client去处理,其中Client可以是HttpUrlConnection、HttpClient也可以是Okhttp
最后Client被封装到LoadBalanceClient类,这个类结合类Ribbon做到了负载均衡。