一、OpenFeign介绍

Feign是一个声明式的伪Http客户端,它使得写Http客户端变得更简单。使用Feign,只需要创建一个接口并注解。它具有可插拔的注解特性(可以使用springmvc的注解),可使用Feign 注解和JAX-RS注解。Feign支持可插拔的编码器和解码器。Feign默认集成了Ribbon,默认实现了负载均衡的效果并且springcloud为feign添加了springmvc注解的支持。

思考:使用RestTemplate+ribbon已经可以完成服务间的调用,为什么还要使用feign?
存在问题如下:

  • 1.每次调用服务都需要写这些代码,存在大量的代码冗余
  • 2.服务地址如果修改,维护成本增高
  • 3.使用时不够灵活

解决了服务调用写了一大串url解决了服务调用写了一大串url

二、使用步骤

  1. 服务调用方法引入依赖OpenFeign依赖
<!--Open Feign依赖-->
<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
  1. 客户端入口类加入注解开启OpenFeign支持和服务发现支持
@SpringBootApplication
@EnableDiscoveryClient
@EnableFeignClients
public class Users9099Application {public static void main(String[] args) {SpringApplication.run(Users9099Application.class, args);}
}
  1. 创建一个客户端调用接口
//调用商品服务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的值就与注册中心实例名称无关

  1. 客户端调用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;}
  1. 服务端入口类加入注解开启服务发现支持
@SpringBootApplication
@EnableDiscoveryClient
public class Products9098Application {public static void main(String[] args) {SpringApplication.run(Products9098Application.class, args);}
}
  1. 创建服务端被调用方法
@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;}
}
  1. 客户端配置文件
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端点
  1. 服务端配置文件
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作为服务注册中心)相关推荐

  1. Spring Cloud Alibaba教程:使用Nacos作为服务注册中心

    点击上方"方志朋",选择"置顶公众号" 技术文章第一时间送达! 什么是Nacos? Nacos 致力于帮助您发现.配置和管理微服务.Nacos 提供了一组简单易 ...

  2. Nacos中服务注册中心AP、CP模式实现,AP、CP模式切换

    本文分析Nacos基于Nacos 2.0 Nacos中服务注册中心默认是AP模式,如果设置为CP模式 那么客户端设置 spring.cloud.nacos.discovery.ephemeral=fa ...

  3. Nacos作为服务注册中心及负载均衡、服务流量权重设置

    如果我的博客对你有帮助,欢迎进行评论✏️✏️.点赞

  4. 无敌的服务注册中心Spring CloudAlibaba Nacos不进来看一看吗?

    目录​​​​​​​ 1.Nacos概述 2.Nacos安装运行 安装 运行 3.Nacos作为服务注册中心 服务提供者order-service 服务消费者user-service 4.Nacos作为 ...

  5. 【双11狂欢的背后】微服务注册中心如何承载大型系统的千万级访问?

    点击上方"蓝字", 右上角选择"设为星标" 周一到周五早11点30,精品文章准时送上! 本文来自石杉的架构笔记 目录: 一.问题起源 二.Eureka Serv ...

  6. SpringCloud微服务注册中心如何承载大型系统的千万级访问?源码及原理分析

    2019独角兽企业重金招聘Python工程师标准>>> 问题起源     Spring Cloud架构体系中,Eureka是一个至关重要的组件,它扮演着微服务注册中心的角色,所有的服 ...

  7. 微服务注册中心如何承载大型系统的千万级访问?

    本文来源:石杉的架构笔记(shishan100) 目录: 一.问题起源 二.Eureka Server设计精妙的注册表存储结构 三.Eureka Server端优秀的多级缓存机制 四.总结 一.问题起 ...

  8. 【双11狂欢背后】微服务注册中心如何承载大型系统的千万级访问?

    一.问题起源 Spring Cloud架构体系中,Eureka是一个至关重要的组件,它扮演着微服务注册中心的角色,所有的服务注册与服务发现,都是依赖Eureka的. 不少初学Spring Cloud的 ...

  9. 使用Nacos实现服务注册与发现(spring cloud 组件教程大全四)

    使用Nacos实现服务注册与发现(spring cloud 组件教程大全四) idea 创建maven父子工程(spring cloud 组件教程大全 一) windows下nacos的安装及Mysq ...

最新文章

  1. 国美零售引入AI图像识别技术 线下自动识别用户数据
  2. 皮一皮:这剧透的太厉害了...
  3. 堆排序(C\C++)
  4. tensorflow tf.name_scope() 命名空间(用于规定对象和操作属于哪个区域)
  5. JAVA虚拟机 安全区域_Java虚拟机的内存区域
  6. 获得picker选项的当前年月值_如果你用OPPO手机!千万记得开启开发者选项,手机性能大幅度提升...
  7. 前端学习(2900):微信小程序简介
  8. devsecops_DevSecOps改变安全性的5种方式
  9. 全面的Spring Boot配置文件详解
  10. qps多少才算高并发_AGV小车价格多少才算合适?
  11. 03-body标签中相关标签
  12. html设置网格颜色,AI网格大小颜色怎么设置-设置AI网格大小颜色的方法 - 河东软件园...
  13. HC-05主从模式蓝牙配对说明v1.0
  14. 6-1 判断顺序表是否有序(Java语言描述 )
  15. 第 2-3 课:迭代法计算定积分
  16. 超级牛逼的立体画,太厉害了!
  17. 服务器取证——服务器基础知识
  18. Token的简单解释
  19. 大学人机交互课小组作业(刚入坑菜鸟一枚,求别喷吼吼)
  20. net::ERR_CONNECTION_REFUSED解决办法

热门文章

  1. ASP.NET之纠错
  2. 全栈工程师之路(二)—— JavaScript(网页前端脚本语言)
  3. [译] 理解数组在 PHP 内部的实现(给PHP开发者的PHP源码-第四部分)
  4. 转:终于会用c#中的delegate(委托)和event(事件)了
  5. linux系统源配置(根据自己理解编写,不当之处,敬请指教)
  6. [云炬python3玩转机器学习笔记] 2-4批量学习、咋西安学习、参数学习和非参数学习
  7. Sci-Hub和 Alexandra 的基本信息
  8. 云炬Android开发笔记 11主界面-商品分类开发(多布局Section RecyclerView)
  9. Coursera 吴恩达《Machine Learning》视频 + 作业
  10. Python 深度学习,你的 Keras 准备好了吗?