当前位置: 首页>后端>正文

rest接口调用异常补偿机制 rest服务调用

格物致知,格Feign。 参考下,了解一下Feign到底能干啥:Feign正确的使用方式

关注的重点仅仅是简化http调用代码的编写。

如果采用httpclient或者okhttp这样相对较重的框架,对初学者来说编码量与学习曲线都会是一个挑战,而使用spring中RestTemplate,又没有配置化的解决方案,由此想到是否可以脱离spring cloud,独立使用Feign

为消费者服务整合Feign分以下几步:

添加Feign依赖

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-feign</artifactId>
 </dependency>
  1. 创建一个Feign接口,并添加@FeignClient注解。

在@FeignClient注解中的user-service/ycq是访问user-service这个微服务的客户端名称+上下文,因为后面省略掉了这一块儿,所以肯定要提前配置好。它用于创建Ribbon负载均衡器。这里的user-serive是Eureka Server服务注册表中的服务。如果不想用Eureka,还阔以使用url属性配置服务列表。如@FeignClient(name=’user-service’, url=’http://localhost:8000/“)

@FeignClient(name = "user-service/ycq")
public interface UserFeignClient {

    @RequestMapping(value = "/{id}", method = RequestMethod.GET)
    public User findById(@PathVariable("id") Long id);
}
  1. 修改Controller代码,让其调用Feign接口
@Autowired
    private UserFeignClient userFeignClient;

    @GetMapping("/user/{id}")
    public User findById(@PathVariable Long id) {
//      return this.restTemplate.getForObject("http://user-service/ycq/" + id, User.class);
        return this.userFeignClient.findById(id);
    }
  1. 修改启动类,添加@EnableFeignClients注解
@SpringBootApplication
@EnableDiscoveryClient
@EnableFeignClients
public class MovieApp 
{
    @Bean
    @LoadBalanced
    public RestTemplate restTemplate() {
        return new RestTemplate();
    }

    public static void main( String[] args )
    {
        SpringApplication.run(MovieApp.class, args);
    }
}

Feign对压缩的支持

一般微服务中如果传输数据大,在并发量比较大的情况下,带宽占用很严重。Feign支持的压缩可以配置最小阈值,指定超过多少大小的指定类型(请求头响应头mime-type=text/xml,application/xml,application/json)的数据进行压缩。Spring Cloud Camden SR4不生效的情况,可以参考。本人看的书的作者已经反映了问题: https://github.com/spring-cloud/spring-cloud-netflix/issues/1580

Feign的日志

可以为每个Feign客户端指定日志记录策略,每个Feign客户端都会创建一个logger。默认情况下,logger的名称时Feign接口的完整类名。

需要注意的是,Feign日志打印只会对DEBUGGER级别做出响应。

Feign对日志处理分四种策略:

  1. NONE
  2. BASIC 记录请求方法 + URL + 响应状态 + 执行时间
  3. HEADERS BASIC + header
  4. FULL HEADERS + body + 元数据

事上练

@SpringBootApplication
@EnableDiscoveryClient
@EnableFeignClients
// 这是用来测试feign 和@FeignClient 注解的接口同时使用
public class MovieApp 

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

@FeignClient(name = "user-service/ycq", configuration = FeignLogConfiguration.class)
public interface UserFeignClient {

    @RequestMapping(value = "/{id}", method = RequestMethod.GET)
    public User findById(@PathVariable("id") Long id);

}

// Controller中

@Autowired //   使用@FeignClient 时使用
private UserFeignClient userFeignClient;

@GetMapping("/user/{id}")
public User findById(@PathVariable Long id) {
//      return this.restTemplate.getForObject("http://user-service/ycq/" + id, User.class);
    return this.userFeignClient.findById(id);
}

logging:
  level:
    com.ycq.Film.UserFeignClient: DEBUG

最终控制台输出结果:

2018-04-12 22:49:35.041 DEBUG 5452 — [r-service/ycq-1] com.ycq.Film.UserFeignClient : [UserFeignClient#findById] 
 <— HTTP/1.1 200 (868ms) 
 content-type: application/json;charset=UTF-8 
 date: Thu, 12 Apr 2018 14:49:35 GMT 
 transfer-encoding: chunked 
 x-application-context: user-service:8000 
 {“id”:1,”username”:”account1”,”name”:”张三”,”age”:20,”balance”:100.00} 
 <— END HTTP (72-byte body)


https://www.xamrdz.com/backend/37x1928795.html

相关文章: