SpringCloud OpenFeign服务调用客户端介绍及配置使用
一、OpenFeign介绍
OpenFeign是Netfix开发的一款声明式,模板化的Http服务调用客户端。使用在服务调用者工程端。OpenFeign的负载均衡也为客户端负载均衡。一下简称Feign。
- Feign可以更加便捷,优雅的调用Http API接口。
- SpringCloud中,使用Feign非常简单,创建一个接口,并在接口上添加一些注解,即调用类代码开发完成。
- Feign支持多种注解,例如Feign自带的注解或者JAX-RS注解
- SpringCloud 对Feign进行了增强,使Feign支持了SpringMVC注解,并整合了Ribbon和Eureka从而让Feign使用更加方便
Feign 与 OpenFeign的区别:Feign是Springcloud组件中的一个轻量级Restful的HTTP服务客户端,Feign内置了Ribbon,用来做客户端负载均衡,去调用服务注册中心的服务。Feign的使用方式是:使用Feign的注解定义接口,调用这个接口,就可以调用服务注册中心的服务;OpenFeign是springcloud在Feign的基础上支持了SpringMVC的注解,如@RequestMapping等等。OpenFeign的@FeignClient可以解析SpringMVC的@RequestMapping注解下的接口,并通过动态代理的方式产生实现类,实现类中做负载均衡并调用其他服务。
二、基本配置使用
1,添加openfen依赖:
<!-- springCloud 整合的openFeign -->
<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
2,启动类添加激活OpenFeign注解@EnableFeignClients
@SpringBootApplication
@EnableFeignClients
public class OrderApplication {public static void main(String[] args) {SpringApplication.run(OrderApplication.class,args);}
}
3,编写http远程调用接口类
@FeignClient(name="CLOUD-PAYMENT-SERVICE")
public interface ProductFeignClient {@RequestMapping(value="/payment/get/{id}",method = RequestMethod.GET)CommonResult getPayment(@PathVariable("id") Long id);@GetMapping("/payment/get/timeout")CommonResult getPaymentTimeout();
}
注意接口类需要添加@FeignClient(name="CLOUD-PAYMENT-SERVICE") 注解。注解中name值为服务提供者服务名称。 接口中方法需要添加SpringMVC注解来声明调用的远程方法路径。方法参数要与远程接口提供方参数一致。
4,在Controller中注入并使用调用
@RestController
public class OrderController {@Autowiredprivate ProductFeignClient productFeignClient;@GetMapping("/consumer/payment/get/{id}")public CommonResult<Payment> getPayment(@PathVariable("id") Long id){return productFeignClient.getPayment(id);}@GetMapping("/consumer/payment/get/timeout")public CommonResult getPaymentTimeout(){return productFeignClient.getPaymentTimeout();}
}
在Controller中使用比较简单,注解注入接口类,然后使用接口类方法直接调用即可。和我们之前单机版的Controller调用Service结构比较一致。
测试验证:我们启动Eureka注册中心,并分别启动服务提供者工程2个,和当前feign工程。访问feign工程的controller中方法地址,相关展示信息如下:
三、负载均衡配置
由于OpenFeign对ribbon的支持所以,OpenFeign的负载均衡也是客户端负载均衡,配置方式和ribbon的也一样。最顶级的为服务名称。默认的为轮询策略,如下配置的为随机策略。
CLOUD-PAYMENT-SERVICE:ribbon:NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule
负载均衡测试:我们启动两个生产者工程端口分别为8002 和 8003,并将调用执行的节点端口进行返回。首先不配置负载均衡相关配置进行测试
如下为配置了随机请求后的访问效果。
四、超时及日志级别配置
在开发或这运行时,如果需要看到Feign的请求过程可以通过Feign的日志进行查看。默认情况下Feign日志没有开启。如果需要开启,则需要在yml中添加如下feign.client.config中设置即可。
其中loggerLevel中枚举包含:
- NONE:性能最佳,不包含任何日志,默认值;
- BASIC:仅记录请求方法、URL、相应状态码以及执行时间;
- HEADERS:在BASIC的基础上记录请求和相应的Header信息;
- FULL:记录请求和相应的header、body、和元数据。
超时时间可以在connectTimeout、和readTimeout中配置。
feign:client:config:CLOUD-PAYMENT-SERVICE:loggerLevel: FULLconnectTimeout: 5000readTimeout: 5000
logging:level:com.xiaohui.springcloud.service.ProductFeignClient: debug
配置为FULL时的打印信息:
2020-11-27 20:48:38.893 DEBUG 5832 --- [nio-9001-exec-8] c.x.s.service.ProductFeignClient : [ProductFeignClient#getPayment] ---> GET http://CLOUD-PAYMENT-SERVICE/payment/get/6203063 HTTP/1.1
2020-11-27 20:48:38.893 DEBUG 5832 --- [nio-9001-exec-8] c.x.s.service.ProductFeignClient : [ProductFeignClient#getPayment] ---> END HTTP (0-byte body)
2020-11-27 20:48:38.914 DEBUG 5832 --- [nio-9001-exec-8] c.x.s.service.ProductFeignClient : [ProductFeignClient#getPayment] <--- HTTP/1.1 200 (20ms)
2020-11-27 20:48:38.914 DEBUG 5832 --- [nio-9001-exec-8] c.x.s.service.ProductFeignClient : [ProductFeignClient#getPayment] connection: keep-alive
2020-11-27 20:48:38.914 DEBUG 5832 --- [nio-9001-exec-8] c.x.s.service.ProductFeignClient : [ProductFeignClient#getPayment] content-type: application/json
2020-11-27 20:48:38.914 DEBUG 5832 --- [nio-9001-exec-8] c.x.s.service.ProductFeignClient : [ProductFeignClient#getPayment] date: Fri, 27 Nov 2020 12:48:38 GMT
2020-11-27 20:48:38.914 DEBUG 5832 --- [nio-9001-exec-8] c.x.s.service.ProductFeignClient : [ProductFeignClient#getPayment] keep-alive: timeout=60
2020-11-27 20:48:38.914 DEBUG 5832 --- [nio-9001-exec-8] c.x.s.service.ProductFeignClient : [ProductFeignClient#getPayment] transfer-encoding: chunked
2020-11-27 20:48:38.915 DEBUG 5832 --- [nio-9001-exec-8] c.x.s.service.ProductFeignClient : [ProductFeignClient#getPayment]
2020-11-27 20:48:38.915 DEBUG 5832 --- [nio-9001-exec-8] c.x.s.service.ProductFeignClient : [ProductFeignClient#getPayment] {"code":0,"message":"查询成功 server node:172.18.58.92:8002","data":{"id":6203063,"serial":"Hello SpringCloud"}}
2020-11-27 20:48:38.915 DEBUG 5832 --- [nio-9001-exec-8] c.x.s.service.ProductFeignClient : [ProductFeignClient#getPayment] <--- END HTTP (116-byte body)
五、项目完整文件及目录
父工程pom文件:
<?xml version="1.0" encoding="UTF-8"?><project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>com.xiaohui.springCloud</groupId><artifactId>SpringCloud</artifactId><version>1.0-SNAPSHOT</version><packaging>pom</packaging><parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.2.2.RELEASE</version></parent><modules><module>product_service</module><module>cloud-api-common</module><module>eureka_server</module><module>openfeign_order_service</module></modules><!-- 统一jar包管理 --><properties><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding><maven.compiler.source>1.8</maven.compiler.source><maven.compiler.target>1.8</maven.compiler.target><junit.version>4.12</junit.version><log4j.version>1.2.17</log4j.version><lombok.version>1.16.18</lombok.version><mysql.version>5.1.47</mysql.version><druid.version>1.1.16</druid.version><mybatis.spring.boot.version>1.3.0</mybatis.spring.boot.version></properties><!-- 子模块继承之后,提供作用:锁定版本+子模块不用写groupId和version --><dependencyManagement><dependencies><!-- spring boot 2.2.2 --><!-- <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-dependencies</artifactId><version>2.2.2.RELEASE</version><type>pom</type><scope>import</scope></dependency>--><!-- spring cloud Hoxton.SR1 --><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-dependencies</artifactId><version>Hoxton.SR1</version><type>pom</type><scope>import</scope></dependency><!-- springcloud alibaba --><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-alibaba-dependencies</artifactId><version>2.1.0.RELEASE</version><type>pom</type><scope>import</scope></dependency><dependency><groupId>com.alibaba</groupId><artifactId>druid</artifactId><version>${druid.version}</version></dependency><dependency><groupId>org.mybatis.spring.boot</groupId><artifactId>mybatis-spring-boot-starter</artifactId><version>${mybatis.spring.boot.version}</version></dependency><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>${mysql.version}</version></dependency><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>${junit.version}</version></dependency><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><version>${lombok.version}</version><optional>true</optional></dependency></dependencies></dependencyManagement><build><plugins><!-- maven 插件 --><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId><configuration><fork>true</fork><addResources>true</addResources></configuration></plugin></plugins></build>
</project>
1,openfeign_order_service 子模块 pom.xml
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><parent><artifactId>SpringCloud</artifactId><groupId>com.xiaohui.springCloud</groupId><version>1.0-SNAPSHOT</version></parent><modelVersion>4.0.0</modelVersion><artifactId>openfeign_order_service</artifactId><dependencies><dependency><groupId>com.xiaohui.springCloud</groupId><artifactId>cloud-api-common</artifactId><version>${project.version}</version></dependency><!-- springCloud 整合的openFeign --><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-openfeign</artifactId></dependency><!-- Eureka 客户端 --><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-netflix-eureka-client</artifactId></dependency><dependency><groupId>org.springframework.retry</groupId><artifactId>spring-retry</artifactId></dependency><!-- web依赖开始 --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-actuator</artifactId></dependency><!-- web依赖结束 --><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><optional>true</optional></dependency></dependencies></project>
2,配置文件 application.yml:
server:port: 9001spring:application:name: openfeign-order-serviceeureka:client:register-with-eureka: truefetch-registry: trueservice-url:defaultZone: http://eureka1.com:9000/eureka/instance:prefer-ip-address: true #使用ip进行注册instance-id: ${spring.cloud.client.ip-address}:${server.port} #向注册中心注册服务IDlease-renewal-interval-in-seconds: 5 #发送心跳间隔时间 秒lease-expiration-duration-in-seconds: 10 # 服务续约时间 10秒内没有发送心跳(宕机)CLOUD-PAYMENT-SERVICE:ribbon:NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule#Feign 日志输出配置
feign:client:config:CLOUD-PAYMENT-SERVICE:loggerLevel: FULLconnectTimeout: 5000readTimeout: 5000
logging:level:com.xiaohui.springcloud.service.ProductFeignClient: debug
3,主启动类:
package com.xiaohui.springcloud;import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.openfeign.EnableFeignClients;@SpringBootApplication
@EnableFeignClients
public class OrderApplication {public static void main(String[] args) {SpringApplication.run(OrderApplication.class,args);}
}
4,feign 接口类
package com.xiaohui.springcloud.service;import com.xiaohui.springcloud.entities.CommonResult;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;@FeignClient(name="CLOUD-PAYMENT-SERVICE")
public interface ProductFeignClient {@RequestMapping(value="/payment/get/{id}",method = RequestMethod.GET)CommonResult getPayment(@PathVariable("id") Long id);@GetMapping("/payment/get/timeout")CommonResult getPaymentTimeout();
}
5,业务代码 controller
package com.xiaohui.springcloud.controller;import com.xiaohui.springcloud.entities.CommonResult;
import com.xiaohui.springcloud.entities.Payment;
import com.xiaohui.springcloud.service.ProductFeignClient;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RestController;@RestController
public class OrderController {@Autowiredprivate ProductFeignClient productFeignClient;@GetMapping("/consumer/payment/get/{id}")public CommonResult<Payment> getPayment(@PathVariable("id") Long id){return productFeignClient.getPayment(id);}@GetMapping("/consumer/payment/get/timeout")public CommonResult getPaymentTimeout(){return productFeignClient.getPaymentTimeout();}
}
SpringCloud OpenFeign服务调用客户端介绍及配置使用相关推荐
- SpringCloud OpenFeign 服务调用传递 token
业务场景 通常微服务对于用户认证信息解析有两种方案 在 gateway 就解析用户的 token 然后路由的时候把 userId 等相关信息添加到 header 中传递下去. 在 gateway 直接 ...
- 【Springcloud】(06)中级搭建-OpenFeign服务调用
[Springcloud](06)中级搭建-OpenFeign服务调用 [一]OpenFeign是什么 (1.1)Feign和OpenFeign (1.2)Feign能干什么? (1.3)Feign集 ...
- 最新版Spring Cloud Alibaba微服务架构-Openfeign服务调用篇
文章目录 前言 一.OpenFeign配置使用 1.引入pom依赖 2.消费端开启Feign服务调用 3.消费端动态代理Service接口 3.消费端测试 二.OpenFeign日志配置 1.全局配置 ...
- SpringCloud 微服务网关Gateway 动态路由配置
概述:在上一章节<SpringCloud 微服务网关Gateway介绍及简单路由配置>中我们讲述了Gateway的最简单的路由配置方式.但是其中比较明显的问题就是我们在配置路由服务的地址时 ...
- SpringCloud 微服务网关Gateway介绍及简单路由配置
概述:什么是微服务网关?为了解决用户客户端在调用微服务系统中的多个消费者工程接口时,需要维护非常多的消费者应用接口地址等信息,以及可能存在不同应用见的调用跨域等问题,微服务网关组件随即出现.网关作为用 ...
- (三)SpringCloud实战之openfeign服务调用
feign是依赖注册中心调用的其他服务. 如果A服务调用B服务,A就是在注册中心找B服务,找到了才知道地址,才能调用接口.(也可以不用注册中心访问到B服务,需要在@feignclient的注解后面配置 ...
- springcloud feign 服务调用其他服务_微服务实战——SpringCloud与Feign集成
上一篇集成了ZuulGateway和Eureka并进行了测试.在实际场景中,我们肯定会有很多的微服务,而他们之间可能会存在相互调用的关系,那么,如何优雅的处理服务之间的调用问题呢?接下来就是我们要解决 ...
- SpringCloud(2)--服务调用
SpringCloud 技术栈 服务注册与发现 EUREKA(停更),Zookeeper,Consul,Nocos 服务调用 RIBBON(NETFLIX网飞), LoadBalancer, FELG ...
- SpringCloud微服务的概念介绍
文章目录 一.微服务相关概念 1.什么是微服务? 2.微服务与单体架构区别 二.Spring Cloud相关概念 1.什么是Spring Cloud? 2.Spring Cloud和SpringBoo ...
最新文章
- Windows Phone 8.1 Tiles, Notifications and Action Center
- 一文了解2020年中国液冷数据中心行业市场现状与发展前景分析市场规模有望破千亿...
- svn服务端及客户端搭建和使用(三)
- python执行的命令_如何在Python中执行外部命令
- 语义分割之VOC2012、Cityscapes数据集介绍
- 【poj1284-Primitive Roots】欧拉函数-奇素数的原根个数
- laravel windows、linux下软连接创建
- Cloudera官方课程管理员(CCAH)、开发者(CCA175)、数据分析
- Deep learning-based CSI Feedback for Beamforming 2
- 系统集成项目管理工程师(试题分析、考试大纲、教材目录)
- 2022年版中国污泥处理处置行业投资现状与前景规划分析报告
- 关于用户故事地图的7种用法
- 生命主题dreamweaver作业静态HTML网页设计——卫生与健康 6页 带视频
- Cortex-A55核心板的温升实测!
- node.js 最全命令行配置操作win10
- TiDB HTAP 深度解读
- FoxyProxy使用教程
- mmdet fpg 网络debug
- 腾讯云使用phpStudy部署网站(附腾讯云优惠券)
- 爬虫微课5小时 python学习路线-余强-专题视频课程