spring cloud学习--feign
简单示例
增加feign maven依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-feign</artifactId>
</dependency>
修改主类
//激活erueka中的DiscoveryClient实现
//自动化配置,创建DiscoveryClient接口针对Eureka客户端的EurekaDiscoveryClient实例
@EnableFeignClients
@EnableDiscoveryClient
@SpringBootApplication
public class EurekaServerApplication {
public static void main(String[] args) {
SpringApplication.run(EurekaServerApplication.class, args);
}
}
通过@FeignClient注解绑定服务
//不区分大小写
@FeignClient("eureka-client")
public interface HelloService
{
@RequestMapping(value = "/hello", method = RequestMethod.GET)
String index();
}
调用服务
RestController
public class ConsumerController
{
@Autowired
HelloService helloService;
@RequestMapping(value = "/feign-consumer", method = RequestMethod.GET)
public String helloController()
{
return helloService.index();
}
}
参数绑定
增加User类
public class User
{
private String name;
private Integer age;
public User()
{
}
public User(String name, Integer age)
{
this.name = name;
this.age = age;
}
public String getName()
{
return name;
}
public void setName(String name)
{
this.name = name;
}
public Integer getAge()
{
return age;
}
public void setAge(Integer age)
{
this.age = age;
}
@Override
public String toString()
{
return "User{" + "name='" + name + '\'' + ", age=" + age + '}';
}
}
在提供的服务中增加FeignController类和下面的User类
@RestController
public class FeignController
{
@RequestMapping(value = "/hello1", method = RequestMethod.GET)
public String hello(@RequestParam String name)
{
return "Hello " + name;
}
@RequestMapping(value = "/hello2", method = RequestMethod.GET)
public User hello(@RequestHeader String name, @RequestHeader Integer age)
{
return new User(name, age);
}
@RequestMapping(value = "/hello3", method = RequestMethod.POST)
public String hello(@RequestBody User user)
{
return "Hello " + user.getName() + ", " + user.getAge();
}
}
增加HelloService类
//不区分大小写
@FeignClient("eureka-client")
public interface HelloService
{
@RequestMapping(value = "/hello", method = RequestMethod.GET)
String hello();
@RequestMapping(value = "/hello1", method = RequestMethod.GET)
String hello(@RequestParam("name") String name);
@RequestMapping(value = "/hello2", method = RequestMethod.GET)
User hello(@RequestHeader("name") String name, @RequestHeader("age") Integer age);
@RequestMapping(value = "/hello3", method = RequestMethod.POST)
String hello(@RequestBody User user);
增加ConsumerController类
@RestController
public class ConsumerController
{
@Autowired
HelloService helloService;
@RequestMapping(value = "/feign-consumer", method = RequestMethod.GET)
public String helloConsumer()
{
return helloService.hello();
}
@RequestMapping(value = "/feign-consumer2", method = RequestMethod.GET)
public String helloConsumer2()
{
StringBuilder sb = new StringBuilder();
sb.append(helloService.hello()).append("\n");
sb.append(helloService.hello("zhangsan")).append("\n");
sb.append(helloService.hello("zhangsan", 20)).append("\n");
sb.append(helloService.hello(new User("zhangsan", 20))).append("\n");
return sb.toString();
}
}
调用http://localhost:9001/feign-consumer2返回
hello world! Hello zhangsan User{name='zhangsan', age=20} Hello zhangsan, 20
feign中ribbon配置
feign中包含ribbon,其客户端负载均衡是通过ribbon实现的
ribbon全局配置
直接使用ribbon.=方式配置参数
ribbon.ConnectTimeout=500
ribbon.ReadTimeout=5000
指定服务配置
<服务名>.ribbon.=
HELLO-SERVICE.ribbon.ConnectTimeout=500
HELLO-SERVICE.ribbon.ReadTime=2000
HELO-SERVICE.ribbon.OkToRetryOnAllOperations=true
HELLO-SERVICE.ribbon.MaxAutoRetriesMextServer=2
HELLO-SERVICE.ribbon.MaxAutoRetries=1
feign中Hystrix配置
feign中包含了Hystrix断路器
全局配置
直接使用前缀hystrix.command.default进行配置,eg:
hystrix.command.default.execution.isolation.thread.timeoutInMilliseconds=5000
开启和关闭feign中hystrix断路器功能
feign.hystrix.enabled=true/false
开启和关闭熔断功能
hystrix.command.default.execution.timeout.enabled=true/false
指定客户端配置
- 构建一个关闭Hystrix的配置
@Configuration
public class DisableHystrixConfiguration
{
@Bean
@Scope("prototype")
public Feign.Builder feignBuilder()
{
return Feign.builder();
}
}
- 在@FeignClient注解的类中,通过configuration参数引入实现的配置
@FeignClient(name="HELLO-SERVICE", configuration=DisableHystrixConfiguration.class)
public interface HelloService
{
...
}
服务降级
与单独使用Hystrix服务降级有很大区别
- 创建服务接口的实现类
@Component
public class HelloServiceFallback implements HelloService
{
@Override
public String hello()
{
return "error";
}
@Override
public String hello(String name)
{
return "error";
}
@Override
public User hello(String name, Integer age)
{
return new User("none", 0);
}
@Override
public String hello(User user)
{
return "error";
}
}
- 在服务接口中通过@FeignClient注解的fallback属性来指定对应服务降级的实现类
//不区分大小写
@FeignClient(value = "eureka-client", configuration = DisableHystrixConfiguration.class, fallback =
HelloServiceFallback.class)
public interface HelloService
{
@RequestMapping(value = "/hello", method = RequestMethod.GET)
String hello();
@RequestMapping(value = "/hello1", method = RequestMethod.GET)
String hello(@RequestParam("name") String name);
@RequestMapping(value = "/hello2", method = RequestMethod.GET)
User hello(@RequestHeader("name") String name, @RequestHeader("age") Integer age);
@RequestMapping(value = "/hello3", method = RequestMethod.POST)
String hello(@RequestBody User user);
}
请求压缩
Feign支持对请求和响应进行GZIP压缩
feign.compression.request.enabled=true
feign.compression.response.enabled=true
自定义请求压缩规则
#开启请求压缩
feign.compression.request.enable=true
#限制压缩请求类型
feign.compression.request.mime-types=text/xml,application/xml,application/json
#限制大小,只有超过这个大小,才会执行压缩,默认值为2048
feign.compression.request.min-request-size=2048
日志配置
Feign在构建背@FeignClient注解修饰的服务客户端是,会为每一个客户端都创建一个feign.Logger实例
配置feign.Logger
logging.level.<被注解接口的完整路径>,eg:
logging.levle.com.example.web.HelloService=DEBUG
创建全局日志级别的Bean
Feign客户端默认的Logger.level对象定义为NONE级别,该级别不会记录任何Feign调用过程中的信息,故添加上面的配置无法实现对DEBUG日志的输出
//激活erueka中的DiscoveryClient实现
//自动化配置,创建DiscoveryClient接口针对Eureka客户端的EurekaDiscoveryClient实例
@EnableFeignClients
@EnableDiscoveryClient
@SpringBootApplication
public class EurekaServerApplication {
@Bean
Logger.Level feignLoggerLevel()
{
return Logger.Level.FULL;
}
public static void main(String[] args) {
SpringApplication.run(EurekaServerApplication.class, args);
}
}
指定客户端的配置类实现
@Configuration
public class FullLogConfiguration
{
@Bean
Logger.Level feignLoggerLevel()
{
return Logger.Level.FULL;
}
}
- 在@FeignClient注解中的属性configuration中使用
@FeignClient(name="HELLO-SERVICE", configuration=FullLogConfiguration.class)
public interface HelloService
{
...
}
日志级别分裂
- NONE : 不记录任何信息
- BASIC :仅记录请求方法、URL以及响应状态码和执行时间
- HEADERS: 除了记录BASIC级别的信息之外,还会记录请求和响应的头信息
- FULL:记录所有请求与响应的明细,包括头信息、请求体、元数据等
spring cloud学习--feign的更多相关文章
- spring cloud学习笔记三 Feign与Ribbon负载均衡的区别
一.Feign的介绍 Feign一般比较书面的解释是:Feign是一个声明式的WebService客户端,使用Feign编写的WebService客户端更加简单,他的使用方法是定义一个接口,然后在上线 ...
- spring cloud 使用feign 遇到问题
spring cloud 使用feign 项目的搭建 在这里就不写了,本文主要讲解在使用过程中遇到的问题以及解决办法 1:示例 @RequestMapping(value = "/gener ...
- Spring Cloud 整合 Feign 的原理
前言 在 上篇 介绍了 Feign 的核心实现原理,在文末也提到了会再介绍其和 Spring Cloud 的整合原理,Spring 具有很强的扩展性,会把一些常用的解决方案通过 starter 的方式 ...
- spring cloud 学习(9) - turbine stream无法在eureka注册的解决办法
turbine是啥就不多解释了,初次接触的可以移步spring cloud 学习(4) - hystrix 服务熔断处理 拉到最后看一下,turbine stream默认情况下启动成功后,eureka ...
- spring cloud(四) feign
spring cloud 使用feign进行服务间调用 1. 新建boot工程 pom引入依赖 <dependency> <groupId>org.springframewor ...
- Spring Cloud学习(一):Eureka服务注册与发现
1.Eureka是什么 Eureka是Netflix开发的服务发现框架,本身是一个基于REST的服务,主要用于定位运行在AWS域中的中间层服务,以达到负载均衡和中间层服务故障转移的目的. Eureka ...
- spring cloud 学习资料
spring cloud 学习资料 网址 拜托!面试请不要再问我Spring Cloud底层原理 https://mp.weixin.qq.com/s/ZH-3JK90mhnJPfdsYH2yDA
- Spring Boot和Spring Cloud学习资源推荐
Spring Boot和Spring Cloud学习资源推荐 比较好的学习资源,分享一下. 1.Spring Boot官方文档:http://projects.spring.io/spring-b ...
- spring cloud关于feign client的调用对象列表参数、设置header参数、多环境动态参数试配
spring cloud关于feign client的调用 1.有些场景接口参数需要传对象列表参数 2.有些场景接口设置设置权限等约定header参数 3.有些场景虽然用的是feign调用,但并不会走 ...
随机推荐
- elasticsearch 基础 —— Jion父子关系
前言 由于ES6.X版本以后,每个索引下面只支持单一的类型(type),因此不再支持以下形式的父子关系: PUT /company { "mappings": { "br ...
- 形象生动的SpringBoot和SpringMVC的区别
spring boot只是一个配置工具,整合工具,辅助工具. springmvc是框架,项目中实际运行的代码 Spring 框架就像一个家族,有众多衍生产品例如 boot.security.jpa等等 ...
- 云中沙箱学习笔记1-快速部署并使用MySQL数据库
1.1 背景知识 业务背景 MySQL是一个关系型数据库管理系统,由瑞典MySQL AB 公司开发,目前属于Oracle旗下产品.MySQL 是最流行的关系型数据库管理系统,在 WEB 应用方面MyS ...
- 《TED演讲的秘密》:TED组织者总结的演讲技巧集锦。三星推荐。
对演讲感兴趣的可以看看.对TED内容感兴趣的也可以翻翻,书中有不少作者认为演讲技巧比较经典(一般来说内容上也有特色)的TED演讲的二维码.三星推荐.http://t.cn/RvFStu7
- 牛客小白月赛16 H小阳的贝壳 (线段树+差分数组)
链接:https://ac.nowcoder.com/acm/contest/949/H来源:牛客网 题目描述 小阳手中一共有 n 个贝壳,每个贝壳都有颜色,且初始第 i 个贝壳的颜色为 colico ...
- php 从7.0升级到7.2
下面的方法安装的php是非线程安全的,apache2服务器用不了 1. 添加Ondřej Surý提供的PHP源: sudo apt-get install software-properties-c ...
- centos 6.5 关闭图形界面
图形界面的关闭分为临时关闭和永久关闭,临时关闭重启系统后恢复正常,永久关闭重启系统后图形界面仍然为关闭状态. 临时关闭 init 3 永久关闭 vi /etc/inittab 修改下面一行 id:3: ...
- django.core.exceptions.ImproperlyConfigured: mysqlclient 1.3.3 or newer is required; you have 0.7.11
搭建Django2.0+Python3+MySQL5时同步数据库时报错:django.core.exceptions.ImproperlyConfigured: mysqlclient 1.3.3 o ...
- 【RabbitMQ】Concurrency、Prefetch、exclusive
分布式消息中间件 RabbitMQ是用Erlang语言编写的分布式消息中间件,常常用在大型网站中作为消息队列来使用,主要目的是各个子系统之间的解耦和异步处理.消息中间件的基本模型是典型的生产者-消费者 ...
- SQL_2008安装教程(完整版)
Win 7 win xp系统中SQL2008安装注意事项一:SQL2008 镜像下载地址 http://download.microsoft.com/download/4/C/4/4C402E48-0 ...