31.【微服务架构】SpringCloud之Feign(五)
Feign简介
Feign 是一个声明web服务客户端,这便得编写web服务客户端更容易,使用Feign 创建一个接口并对它进行注解,它具有可插拔的注解支持包括Feign注解与JAX-RS注解,Feign还支持可插拔的编码器与解码器,Spring Cloud 增加了对 Spring MVC的注解,Spring Web 默认使用了HttpMessageConverters, Spring Cloud 集成 Ribbon 和 Eureka 提供的负载均衡的HTTP客户端 Feign.
Feignm—个声明式的Web服务客户端,使得编写Web服务客户端变得非常容易,
只需要创建一个接口,然后在上面添加注解即可。
官网:https://github.com/OpenFeign/feign
Feign能干什么
Feign旨在使编写java Http客户端变得更容易。
前面在使用Ribbon+RestTemplate时,利用RestTemplate对http请求的封装处理,形成了一套模版化的调用方法。但是在实际 开发中,由于对服务依赖的调用可能不止一处,往往一个接口会被多处调用,所以通常都会针对每个微服务自行封装一些客户端 类来包装这些依赖服务的调用。所以,Feign在此基础上做了进一步封装,由他来帮助我们定义和实现依赖服务接口的定义。在 Feign的实现下,我们只需创建接口并使用注解的方式来配置它(以前是Dao接口上面标注Mapper注解,现在是是微服务接口上面标注一个Feign注解即可),即可完成对服务提供方的接口绑定 , 简化了使用Spring cloud Ribbon时,自动封装服务调用客户端的开发量。
Feign集成了Ribbon
利用 Ribbon 维护了 MicroserviceCloud-dept 的服务列表信息,并且通过轮询实现了客户端的负载均衡。
而与Ribbon不同的是通过feign只需要定义服务绑定接口且以声明式的方法,优雅而简单的实现了服务调用。
pom修改
feign可能被很多项目都用,所以pom放在api公共项目的pom.xml文件中。
<!-- 旧版本 ,本文档以旧版本例子讲解--> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-feign</artifactId> </dependency> <!-- 新版本 --> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-openfeign</artifactId> </dependency>
新增Service到microservicecloud-api项目中,以便这个方法对外暴露可以被各个微服务项目直接引用
package com.everjiankang.springcloud.service; import java.util.List; import org.springframework.cloud.netflix.feign.FeignClient; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; import com.everjiankang.springcloud.entity.Dept; @FeignClient(value="MICROSERVICECLOUD-DEPT") //微服务名称 public interface DeptService { @RequestMapping(value = "/consumer/dept/add",method=RequestMethod.POST) public boolean add(Dept dept); @RequestMapping(value = "/consumer/dept/get/{id}",method=RequestMethod.GET) public Dept get(Long id); @RequestMapping(value = "/consumer/dept/list",method=RequestMethod.GET) public List<Dept> list(); }
在microservicecloud-consumer-dept-feign项目的启动类上加注解:
@SpringBootApplication @ComponentScan(basePackages = {"com.everjiankang.springcloud"}) @MapperScan(basePackages = {"com.thc.adt.*.dao"}) @EnableFeignClients(basePackages = {"ccom.everjiankang.springcloud"}) @EnableAspectJAutoProxy @EnableScheduling public class AdtApplication { public static void main(String[] args) { SpringApplication.run(AdtApplication.class, args); } }
Feign 通过接口的方法调用Rest服务(之前是 Ribbon + RestTemPlate )
该请求发送给 Eureka 服务器(http://MICROSERVICECLOUD一DEPT/dept/list)
通过 Feign 直接找到服务接口,由于在进行服务调用的时候融合了 Ribbon 技术所以也支持负载均衡作用.
Feign请求拦截器:
@Component @Configuration public class FeignInterceptor implements RequestInterceptor { @Bean public Logger.Level feignLogger(){ return Logger.Level.FULL; } // PermissionFeign permissionFeign; @Override public void apply(RequestTemplate requestTemplate) { requestTemplate.header("Accept", "application/json"); requestTemplate.header("Accpet-Encoding", "gzip"); requestTemplate.header("Content-Encoding", "UTF-8"); requestTemplate.header("Content-Type", "application/json; charset=UTF-8"); if (!StringUtils.isEmpty(SessionUtil.getToken())){ requestTemplate.header("x-access-token",SessionUtil.getToken()); } } }