OpenFeign组件的使用(使用nacos作为服务注册中心)
一、OpenFeign介绍
Feign是一个声明式的伪Http客户端,它使得写Http客户端变得更简单。使用Feign,只需要创建一个接口并注解。它具有可插拔的注解特性(可以使用springmvc的注解),可使用Feign 注解和JAX-RS注解。
Feign支持可插拔的编码器和解码器。Feign默认集成了Ribbon,默认实现了负载均衡的效果并且springcloud为feign添加了springmvc注解的支持。
思考:使用RestTemplate+ribbon已经可以完成服务间的调用,为什么还要使用feign?
存在问题如下:
- 1.每次调用服务都需要写这些代码,存在大量的代码冗余
- 2.服务地址如果修改,维护成本增高
- 3.使用时不够灵活
解决了服务调用写了一大串url解决了服务调用写了一大串url
二、使用步骤
- 服务调用方法引入依赖OpenFeign依赖
<!--Open Feign依赖-->
<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
- 客户端入口类加入注解开启OpenFeign支持和服务发现支持
@SpringBootApplication
@EnableDiscoveryClient
@EnableFeignClients
public class Users9099Application {public static void main(String[] args) {SpringApplication.run(Users9099Application.class, args);}
}
- 创建一个客户端调用接口
//调用商品服务feign的接口
@FeignClient("products")
public interface ProductClient {@GetMapping("/product/find")Map<String,Object> find(@RequestParam("id") String id);
}
- FeignClient注解的一些属性
重点看一下value和name:vaule和name 其实是一个属性
关于调用目前有两种:
接口提供方在注册中心。
如果服务提供方已经注册到注册中心了,那么name或者value的值为:服务提供方的服务名称。
必须为所有客户端指定一个name或者value@FeignClient(value=“run-product”,fallback ProductClientServiceFallBack.class)单独的一个http接口,接口提供方没有注册到注册中心。
@FeignClient(name=“runClient11111”,url=“localhost:8001”)。 此处name的值为:调用客户端的名称。
以上两种方式都能正常调用。name可以为注册中心的实例名称,加上url属性时,name的值就与注册中心实例名称无关
- 客户端调用OpenFeign方法
@RestController
@Slf4j
public class UserController {@Autowiredprivate ProductClient productClient;@GetMapping("/user/getProductInfo")public Map<String,Object> getProductInfo(String productId){Map<String, Object> map = productClient.find(productId);log.info("返回的信息:[{}]"+map);return map;}
- 服务端入口类加入注解开启服务发现支持
@SpringBootApplication
@EnableDiscoveryClient
public class Products9098Application {public static void main(String[] args) {SpringApplication.run(Products9098Application.class, args);}
}
- 创建服务端被调用方法
@RestController
@Slf4j
public class ProductController {@Value("${server.port}")private int port;@GetMapping("/product/find")public Map<String,Object> find(@RequestParam("id") String id){Map<String, Object> map = new HashMap<>();log.info("进入商品服务,当前接收的商品id为:[{}]",id);map.put("status",true);map.put("msg","当前商品服务调用成功,查询商品id为:"+id+",当前处理服务的端口号为: "+port);return map;}
}
- 客户端配置文件
server.port=9099 #指定当前服务端口
spring.application.name=users #指定服务名称
spring.cloud.nacos.server-addr=xxx.xxx.xxx.xxx:8848 #指定nacos服务地址
spring.cloud.nacos.discovery.server-addr=${spring.cloud.nacos.server-addr} #指定注册中心地址
management.endpoints.web.exposure.include=* #暴露所有web端点
- 服务端配置文件
server.port=9098
spring.application.name=products
spring.cloud.nacos.server-addr=xxx.xxx.xxx.xxx:8848
spring.cloud.nacos.discovery.server-addr=${spring.cloud.nacos.server-addr}
management.endpoints.web.exposure.include=*
两个服务启动后,在nacos的控制台可以看到以下两个服务:
访问本地链接:http://localhost:9099/user/getProductInfo?productId=1
可以看到以下:
需要注意的是,OpenFeign默认实现负载均衡策略,如果products服务有多个实例,那么调用的时候会轮询。
一张图助记:
三、OpenFeign调用远程服务(非本机微服务)
//如果同时指定value和url属性,则以url属性为准,value属性指定的值便当做客户端的名称
@FeignClient(value = "productFeign",url = "远程ip:远程服务端口",fallback = ProductFeignHandler.class)
public interface ProductFeign {@GetMapping("/product/find")Map<String,Object> find(@RequestParam("id") String id);
}
四、Feign原理简述
- 启动时,程序会进行包扫描,扫描所有包下所有@FeignClient注解的类,并将这些类注入到spring的IOC容器中。当定义的Feign中的接口被调用时,通过JDK的动态代理来生成RequestTemplate。
- RequestTemplate中包含请求的所有信息,如请求参数,请求URL等。
- RequestTemplate声场Request,然后将Request交给client处理,这个client默认是JDK的HTTPUrlConnection,也可以是OKhttp、Apache的HTTPClient等。
- 最后client封装成LoadBaLanceClient,结合ribbon负载均衡地发起调用。
参考文章
参考文章
OpenFeign组件的使用(使用nacos作为服务注册中心)相关推荐
- Spring Cloud Alibaba教程:使用Nacos作为服务注册中心
点击上方"方志朋",选择"置顶公众号" 技术文章第一时间送达! 什么是Nacos? Nacos 致力于帮助您发现.配置和管理微服务.Nacos 提供了一组简单易 ...
- Nacos中服务注册中心AP、CP模式实现,AP、CP模式切换
本文分析Nacos基于Nacos 2.0 Nacos中服务注册中心默认是AP模式,如果设置为CP模式 那么客户端设置 spring.cloud.nacos.discovery.ephemeral=fa ...
- Nacos作为服务注册中心及负载均衡、服务流量权重设置
如果我的博客对你有帮助,欢迎进行评论✏️✏️.点赞
- 无敌的服务注册中心Spring CloudAlibaba Nacos不进来看一看吗?
目录 1.Nacos概述 2.Nacos安装运行 安装 运行 3.Nacos作为服务注册中心 服务提供者order-service 服务消费者user-service 4.Nacos作为 ...
- 【双11狂欢的背后】微服务注册中心如何承载大型系统的千万级访问?
点击上方"蓝字", 右上角选择"设为星标" 周一到周五早11点30,精品文章准时送上! 本文来自石杉的架构笔记 目录: 一.问题起源 二.Eureka Serv ...
- SpringCloud微服务注册中心如何承载大型系统的千万级访问?源码及原理分析
2019独角兽企业重金招聘Python工程师标准>>> 问题起源 Spring Cloud架构体系中,Eureka是一个至关重要的组件,它扮演着微服务注册中心的角色,所有的服 ...
- 微服务注册中心如何承载大型系统的千万级访问?
本文来源:石杉的架构笔记(shishan100) 目录: 一.问题起源 二.Eureka Server设计精妙的注册表存储结构 三.Eureka Server端优秀的多级缓存机制 四.总结 一.问题起 ...
- 【双11狂欢背后】微服务注册中心如何承载大型系统的千万级访问?
一.问题起源 Spring Cloud架构体系中,Eureka是一个至关重要的组件,它扮演着微服务注册中心的角色,所有的服务注册与服务发现,都是依赖Eureka的. 不少初学Spring Cloud的 ...
- 使用Nacos实现服务注册与发现(spring cloud 组件教程大全四)
使用Nacos实现服务注册与发现(spring cloud 组件教程大全四) idea 创建maven父子工程(spring cloud 组件教程大全 一) windows下nacos的安装及Mysq ...
最新文章
- 国美零售引入AI图像识别技术 线下自动识别用户数据
- 皮一皮:这剧透的太厉害了...
- 堆排序(C\C++)
- tensorflow tf.name_scope() 命名空间(用于规定对象和操作属于哪个区域)
- JAVA虚拟机 安全区域_Java虚拟机的内存区域
- 获得picker选项的当前年月值_如果你用OPPO手机!千万记得开启开发者选项,手机性能大幅度提升...
- 前端学习(2900):微信小程序简介
- devsecops_DevSecOps改变安全性的5种方式
- 全面的Spring Boot配置文件详解
- qps多少才算高并发_AGV小车价格多少才算合适?
- 03-body标签中相关标签
- html设置网格颜色,AI网格大小颜色怎么设置-设置AI网格大小颜色的方法 - 河东软件园...
- HC-05主从模式蓝牙配对说明v1.0
- 6-1 判断顺序表是否有序(Java语言描述 )
- 第 2-3 课:迭代法计算定积分
- 超级牛逼的立体画,太厉害了!
- 服务器取证——服务器基础知识
- Token的简单解释
- 大学人机交互课小组作业(刚入坑菜鸟一枚,求别喷吼吼)
- net::ERR_CONNECTION_REFUSED解决办法
热门文章
- ASP.NET之纠错
- 全栈工程师之路(二)—— JavaScript(网页前端脚本语言)
- [译] 理解数组在 PHP 内部的实现(给PHP开发者的PHP源码-第四部分)
- 转:终于会用c#中的delegate(委托)和event(事件)了
- linux系统源配置(根据自己理解编写,不当之处,敬请指教)
- [云炬python3玩转机器学习笔记] 2-4批量学习、咋西安学习、参数学习和非参数学习
- Sci-Hub和 Alexandra 的基本信息
- 云炬Android开发笔记 11主界面-商品分类开发(多布局Section RecyclerView)
- Coursera 吴恩达《Machine Learning》视频 + 作业
- Python 深度学习,你的 Keras 准备好了吗?