31.【微服务架构】SpringCloud之Feign(五)

时间:2023-03-08 19:55:11

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只需要定义服务绑定接口且以声明式的方法,优雅而简单的实现了服务调用。

31.【微服务架构】SpringCloud之Feign(五)

31.【微服务架构】SpringCloud之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());
}
}
}