@FeignClient常用属性
@FeignClient(name = "gateway-test", value = "gateway-test", url = "localhost:9997", fallbackFactory = FallbackFactory.class, contextId = "GatewayClient")
name/value: 服务名称
//查看源码可知: 两个属性等价
public @interface FeignClient {
@AliasFor("value")
String name() default "";
@AliasFor("value")
String name() default "";
}
//查看源码可知: 两个属性至少要配置一个
FeignClientsRegistrar {
private String getClientName(Map<String, Object> client) {
if (client == null) {
return null;
}
String value = (String) client.get("contextId");
if (!StringUtils.hasText(value)) {
value = (String) client.get("value");
}
if (!StringUtils.hasText(value)) {
value = (String) client.get("name");
}
if (!StringUtils.hasText(value)) {
value = (String) client.get("serviceId");
}
if (StringUtils.hasText(value)) {
return value;
}
throw new IllegalStateException("Either 'name' or 'value' must be provided in @"
+ FeignClient.class.getSimpleName());
}
}
url: 请求地址, 没配置的话, 会把name/value的属性值当成服务名进行调用, 配置的话则使用url的值
示例:

Product服务: 服提供者, 服务名product-client, 存在一个接口/product/test, 返回"test"字符串
User服务: 调用方, 服务名user-client, 存在一个接口/user/test, 调用product服务的test接口
//配置url方式,请求地址为url的地址
@FeignClient(name = "product-client", url = "localhost:9997")
public interface ProductClient {
/**
* ..
* @return .
*/
@GetMapping("/product/test")
String test();
}
@RequestMapping("/user")
public class UserController {
@Resource
private ProductClient client;
@GetMapping("/test")
public String test() {
return client.test();
}
}
//访问http://localhost:8200/user/test报错:
//Connection refused: connect executing GET http://localhost:9997/product/test with root cause
//说明配置了url属性后,确实是根据url的值作为请求地址进行调用
//使用服务名调用方式
@FeignClient(name = "product-client")
public interface ProductClient {
/**
* ..
* @return .
*/
@GetMapping("/product/test")
String test();
}
//调用成功,后台能看到获取注册中心(nacos)的数据解析获取真实的url地址的日志

//用一个不存在的服务名再验证一下
@FeignClient(name = "product-client123")
public interface ProductClient {
/**
* ..
* @return .
*/
@GetMapping("/product/test")
String test();
}
//报错信息:
com.netflix.client.ClientException: Load balancer does not have available server for client: product-client123
fallbackFactory: 获取异常信息
示例:
user服务开启hystrix
feign:
hystrix:
enabled: true
//user服务添加fallback,用于在调用服务出现错误时,返回自定义信息
@Component
public class ProductClientFallback implements ProductClient{
@Override
public String test() {
return "error";
}
}
//user服务添加fallbackFactory,用户在调用服务出现错误时,获取错误信息
@Component
public class ProductClientFallbackFactory implements FallbackFactory<ProductClient> {
@Resource
ProductClientFallback fallback;
@Override
public ProductClient create(Throwable cause) {
System.out.println("cause.getMessage() = " + cause.getMessage());
return fallback;
}
}
//product服务修改/product/test接口,模拟出现异常
@RestController
@RequestMapping("/product")
public class ProductController {
@GetMapping("/test")
public String test() throws Exception {
throw new Exception("test Exception");
}
}
Postman访问 http://localhost:8200/user/test ,成功返回自定义的异常信息

查看服务调用方User的日志, 成功打印出错误日志

message信息为空的话,配置一下Product服务:
server:
error:
include-message: ALWAYS
具体原因请查看 博客, 也可以通过使用@ControllerAdvice来解决
contextId: 别名
假设一个User服务有两个FeignClient,都需要调用Product服务, 因为name属性值一样,所以需要通过配置contextId来区分,否则启动项目时会报错
@FeignClient(name = "product-client", fallbackFactory = ProductClientFallbackFactory.class, contextId = "ProductClientCopy")
public interface ProductClientCopy {
/**
* ..
* @return .
*/
@GetMapping("/product/testCopy")
String test();
}
@FeignClient(name = "product-client", fallbackFactory = ProductClientFallbackFactory.class, contextId = "ProductClient")
public interface ProductClient {
/**
* ..
* @return .
*/
@GetMapping("/product/testCopy")
String test();
}
@FeignClient常用属性的更多相关文章
- 【Android自学日记】五大布局常用属性
线性布局(LinearLayout)常用属性: android:orientation="vertical"--决定子类控件的排布方式(vertical垂直:horizontal水 ...
- DataGrid中的常用属性
DataGrid中的常用属性 $('#dg').datagrid({ url:'datagrid_data.json', columns:[[ {field:'code',title:'Code',w ...
- Node.js process 模块常用属性和方法
Node.js是常用的Javascript运行环境,本文和大家发分享的主要是Node.js中process 模块的常用属性和方法,希望通过本文的分享,对大家学习Node.js http://www.m ...
- ImageView的常用属性
ImageView的一些常用属性,并且这些属性都有与之对应的getter.setter方法: android:adjustViewBounds:设置ImageView是否调整自己的边界来保持所显示图片 ...
- HTML a标签、4个伪类、常用属性(下载)、锚链接(待扩展:邮件、电话、短信、GPS)
HTML 超链接<a> 1.超链接可以是一个字.一个词.一组词.一幅图像,您可以点击这些内容来跳转到新的文档或者当前文档中的某个部分. 2.当您把鼠标指针移动到网页中的某个链接上时,箭头会 ...
- iOS导航控制器常用函数与navigationBar常用属性
导航控制器常用函数触发时机 当视图控制器的View将要出现时触发 - (void)viewWillAppear:(BOOL)animated 当视图控制器的View已经出现时触发 - (void)vi ...
- CSS样式常用属性整理
web工程师是最近5年刚刚兴起的一门高薪职业,人们的专注度越来越高. 那么前端除了学习html标签之外还需要掌握什么知识点呢? 为大家整理了一个和HTML标签密不可分的知识要点--<CSS样式常 ...
- WPF DataGrid常用属性记录
WPF DataGrid常用属性记录 组件常用方法: BeginEdit:使DataGrid进入编辑状态. CancelEdit:取消DataGrid的编辑状态. CollapseRowGroup:闭 ...
- Android开发中XML布局的常用属性说明
<!-- 常用属性说明: android:id="@+id/button" 为控件指定Id android:text="NNNNNNNNNN" 指定控件的 ...
随机推荐
- opencv——import导包出现错误
原因:编辑器找不到,CV2的模块,也就是导入这个模块失败: 原因可能是sublime找不到这个这个模块的位置,不知道这个包在哪里,这时候需要我们安装OpenCV的一个扩展包. 解决步骤: ①:找到py ...
- 性能工具之Jmeter压测Hprose RPC服务
概述 Hprose(High Performance Remote Object Service Engine),国人开发的一个远程方法调用的开源框架.它是一个先进的轻量级的跨语言跨平台面向对象的高性 ...
- Processing中PImage类和loadImage()、createImage()函数的相关解析
聊一聊Processing中PImage类和loadImage().createImage()函数.因为要借P5做多媒体创意展示,图片是一个很重要的媒体.有必要就图片的获取和展放作总结. 首先 有一点 ...
- JS里的异步实例化
JS里的异步构造函数 众所周知,Js的构造函数是不能加上async/await来实现异步实例化的,一般当需要一个对象的属性是异步的结果时可以这样写: //! 一个需要指定时间后返回的异步函数 func ...
- Akamai CDN刷新(通过Akamai cli 自动刷新)
1.刷新类型选择 根据官方介绍,可使用多种途径和方式来完成快速刷新 按照简便快捷高效的要求,暂时选择Akamai cli + url 来完成刷新. 2.二进制文件下载地址 文件下载地址:https:/ ...
- Linux-Samba服务
Samba服务 1.Samba的起源 对于windows的网上邻居来讲,共享文件的方式用的是SMB和CIFS协议以及NETBIOS协议Linux/Unix之间用的是NFS协议. 但是Linux和Win ...
- 29、vi和vim用法详解
vi类似于windows中的文本文件,用于普通的文本文件 vim:专家版的文件编辑器,用于shell程序型文件,带颜色,自检查语法 一般模式快捷键 O:光标到一行的首 $:光标到一行的尾 H:光标到整 ...
- 35、mysql数据库(ddl)
35.1.数据库之库操作: 1.创建数据库(在磁盘上创建一个对应的文件夹): create database [if not exists] db_name [character set xxx]; ...
- 2、oracle用户和权限
权限主要可以分成三类:系统权限.角色.对象权限,角色是一类系统权限的分组, Oracle 的角色存放在表 dba_roles 中,某角色包含的系统权限存放在 dba_sys_privs 中, 包含的对 ...
- gRPC(3):拦截器
在 gRPC 调用过程中,我们可以拦截 RPC 的执行,在 RPC 服务执行前或执行后运行一些自定义逻辑,这在某些场景下很有用,例如身份验证.日志等,我们可以在 RPC 服务执行前检查调用方的身份信息 ...