当前位置:首页 » 文件传输 » feign声明式接口可以访问
扩展阅读
webinf下怎么引入js 2023-08-31 21:54:13
堡垒机怎么打开web 2023-08-31 21:54:11

feign声明式接口可以访问

发布时间: 2022-12-29 04:48:07

❶ Spring Cloud中优雅的使用Feign调用接口

1、RestTemplate来调用接口

可以直接注入对象,然后调用接口,这种方式唯一的弊端就是你需要知道服务提供者的地址,根据指定的地址来进行调用

@Autowired

private RestTemplate restTemplate;

@Override

public SubstitutionDto getSubstitutionInfo(Long sid) {

    User user= this.restTemplate.getForObject("http://localhost:8000/user/" + id, User.class);

  // .......

}

2、声明式的REST客户端Feign来进行接口调用

在启动类上加 @EnableFeignClients 注解,如果你的Feign接口定义跟你的启动类不在一个包名下,还需要制定扫描的包名 @EnableFeignClients (basePackages = "com.hui.api.client")

接口的消费定义,单独抽一个项目出来,后面打成公共的jar,这样无论是哪个项目需要调用接口,引入公共的接口SDK jar即可,不用重新定义一遍了。

❷ Feign比直接调用RestTemplate好在哪里

Feign是一个声明式的REST客户端,通过Feign我们只需要定义服务绑定接口,以申明式的方法,优雅而简单的实现了服务调用。

虽然RestTemplate已经可以将请求拦截来实现对依赖服务的接口调用,并对Http请求进行封装处理,形成一套模板化的调用方法,但是对服务依赖的调用可能不只一处,一个接口都会被多次调用,所以我们会像前面那样针对各个微服务字形封装一些客户端接口调用类来包装这些依赖服务的调用。
由于RestTemplate的封装,几乎每一个调用都是简单的模板化内容,Feign在此基础上做了进一步的封装,由它来帮助我们定义和实现依赖服务接口的定义。
在服务消费者创建服务调用接口,通过@FeignClient注解指定服务名来绑定服务,然后再使用SpringMVC的注解来绑定具体该服务提供的REST接口。
希望能帮到你

❸ Feign 与 Hystrix

Feign是一个声明式的web服务客户端,它使得web服务调用非常的简单,当我们使用Feign时,Spring Cloud
整合了Ribbon和Eureka,从而为我们提供了一个负载均衡的Http客户端。

首先我们引入Feign的依赖,由于Feign要通过Eureka去获取服务,所以也要引入Eureka-client:

然后再Spring Boot启动类上打上 @EnableFeignClients 注解,使得应用可以使用FeignClient,如下:

最后编写远程调用接口,调用上一篇中提到的Order服务,如下:

其中, @FeignClient 指明这个接口是一个FeignClient,value值是我们要从eureka注册中心获取的服务,由于eureka-client-order项目中
的 spring.application.name 是SERVICE-ORDER,所以我们这里写SERVICE-ORDER。

我们再写个controller使用Feign去调用远程服务,如下:

最后,我们修改一下eureka-client-order,启动两个服务,两个服务的订单状态不同,如下:

大功告成,我们启动4个服务:eureka注册中心,order-node-1,order-node-2,feign。访问我们的controller,并刷新,显示结果如下:

说明feign的负载均衡已经启用。

首先我们引入Hystrix的依赖:

并启用Feign的Hystrix,

Feign封装了所有方法的熔断方法,Hystrix支持fallback的概念,在FeignClien中指定即可

指定fallback的类为OrderHystrix,我们新建OrderHystrix类并实现RemoteOrder接口:

这样我们在调用远程的/order/detail时,如果发生超时或者错误,就会调用 getRemoteOrder() 方法。
我们可以把eureka-client-order的两个服务都停掉,然后进行访问,结果如下:

说明熔断机制起作用了。

项目示例地址: https://github.com/liubo-tech/spring-cloud-eureka 。

❹ Spring Cloud Feign使用详解

 通过前面两章对Spring Cloud Ribbon和Spring Cloud Hystrix的介绍,我们已经掌握了开发微服务应用时,两个重要武器,学会了如何在微服务架构中实现客户端负载均衡的服务调用以及如何通过断路器来保护我们的微服务应用。这两者将被作为基础工具类框架广泛地应用在各个微服务的实现中,不仅包括我们自身的业务类微服务,也包括一些基础设施类微服务(比如网关)。此外,在实践过程中,我们会发现对这两个框架的使用几乎是同时出现的。既然如此,那么是否有更高层次的封装来整合这两个基础工具以简化开发呢?本章我们即将介绍的Spring Cloud Ribbon与Spring Cloud Hystrix,除了提供这两者的强大功能之外,它还提供了一种声明式的Web服务客户端定义方式。

 我们在使用Spring Cloud Ribbon时,通常都会利用它对RestTemplate的请求拦截来实现对依赖服务的接口调用,而RestTemplate已经实现了对HTTP请求的封装处理,形成了一套模版化的调用方法。在之前的例子中,我们只是简单介绍了RestTemplate调用对实现,但是在实际开发中,由于对服务依赖对调用可能不止于一处,往往一个接口会被多处调用,所以我们通常都会针对各个微服务自行封装一些客户端累来包装这些依赖服务的调用。这个时候我们会发现,由于RestTemplate的封装,几乎每一个调用都是简单的模版化内容。综合上述这些情况,Spring Cloud Fegin在此基础上做了进一步封装,由它来帮助我们定义和实现依赖服务接口的定义。在Spring Cloud Feign的实现下,我们只需创建一个接口并用注解的方式来配置它,即可完成对服务提供方的接口绑定,简化了在使用Spring Cloud Ribbon时自行封装服务调用客户端的开发量。Spring Cloud Feign具备可插拔的注解支持,包括Feign注解和JAX-RS注解。同时,为了适应Spring的广大用户,它在Netflix Feign的基础上扩展了对Spring MVC的注解支持。这对于习惯于Spring MVC的开发者来说,无疑是一个好消息,你我这样可以大大减少学习适应它的成本。另外,对于Feign自身的一些主要组件,比如编码器和解码器等,它也以可插拔的方式提供,在有需求等时候我们以方便扩张和替换它们。

 在本节中,我们将通过一个简单示例来展示Spring Cloud Feign在服务客户端定义所带来的便利。下面等示例将继续使用之前我们实现等hello-service服务,这里我们会通过Spring Cloud Feign提供的声明式服务绑定功能来实现对该服务接口的调用。

▪️首先,创建一个Spring Boot基础工程,取名为kyle-service-feign,并在pom.xml中引入spring-cloud-starter-eureka和spring-cloud-starter-feign依赖,具体内容如下所示。

▪️创建应用主类Application,并通过@EnableFeignClients注解开启Spring Cloud Feign的支持功能。

▪️定义HelloServiceFeign,接口@FeignClient注解指定服务名来绑定服务,然后再使用Spring MVC的注解来绑定具体该服务提供的REST接口。

▪️接着,创建一个RestClientController来实现对Feign客户端的调用。使用@Autowired直接注入上面定义的HelloServiceFeign实例,并在postPerson函数中调用这个绑定了hello-service服务接口的客户端来向该服务发起/hello接口的调用。

▪️最后,同Ribbon实现的服务消费者一样,需要在application.properties中指定服务注册中心,并定义自身的服务名为feign-service-provider,为了方便本地调试与之前的Ribbon消费者区分,端口使用8868。

 发送几次GET请求到 http://localhost:8868/client/getHost?name=kyle ,可以得到如之前Ribbon实现时一样到效果,正确返回 hi, kyle! i from 10.166.37.142:8877 。依然是利用Ribbon维护了针对HELLO-SERVICE-PROVIDER的服务列表信息,并且通过轮询实现了客户端负载均衡。而与Ribbon不同到是,通过Feign只需定义服务绑定接口,以声明式的方法,优雅而简单地实现了服务调用。

 现实系统中的各种业务接口要比上一节复杂得多,我们会再HTTP的各个位置传入各种不同类型的参数,并且再返回响应的时候也可能是一个复杂的对象结构。再本节中,我们将详细介绍Feign中的不同形式参数的绑定方法。

 再开始介绍Spring Cloud Feign的参数绑定之前,我们先扩张以下服务提供者hello-service-provider。增加下面这些接口,其中包含带有Request参数的请求、带有Header信息的请求、带有RequestBody的请求以及请求响应体中是一个对象的请求。

 在完成了对hello-service-provider的改造之后,下面我们开始在快速入门示例的kyle-service-feign应用中实现这些新增的绑定。

 这里一定要注意,再定义各参数绑定时,@RequestParam、@RequestHeader等可以指定参数名称的主角,它们的value千万不能少。在Spring MVC程序中,这些注解会根据参数名来作为默认值,但是在Feign中绑定参数必须通过value属性来指明具体的参数名,不然会抛出==IllegalStateException==异常,value属性不能为空。

 在完成上述改造之后,启动服务注册中心、两个hello-service-privider服务以及我们改造的kyle-service-feign。通过发送GET请求到== http://localhost:8868/feign/head/getHost?name=kyle&age=18== ,通过发送POST请求到== http://localhost:8868/feign/project/postPerson== ,请求触发HelloServiceFeign对新增接口的调用。最终,我们会获得如下图的结果,代表接口绑定和调试成功。

 由于Spring Cloud Feign的客户端负载均衡是通过Spring Cloud Ribbon实现的,所以我们可以直接配置Ribbon客户端的方式来自定义各个服务客户端调用参数。那么我们如何使用Spring Cloud Feign的工程中使用Ribbon的配置呢?

 全局配置的方法非常简单,我们可以直接使用ribbon.<key>=<value>的方式来设置ribbon的各项默认参数。如下:

 大多数情况下,我们对于服务调用的超时时间可能会根据实际服务的特性做一些调整,所以仅仅进行个性化配置的方式与使用Spring Cloud Ribbon时的配置方式是意义的,都采用<client>.ribbon.key=value的格式进行设置。但是,这里就有一个疑问了,<cleint>所指代的Ribbon客户端在那里呢?

 回想一下,在定义Feign客户端的时候,我们使用了@FeignClient注解。在初始化过程中,Spring Cloud Feign会根据该注解的name属性或value属性指定的服务名,自动创建一个同名的Ribbon客户端。如下:

 Spring Cloud Ribbon默认负载均衡策略是轮询策略,不过该不一定满足我们的需要。Ribbon一共提供了7种负载均衡策略,如果我们需要ZoneAvoidanceRule,首先要在application.properties文件中添加配置,如下所示:

 不过,只是添加了如上配置,还无法实现负载均衡策略的更改。我们还需要实例化该策略,可以在应用主类中直接加入IRule实例的创建,如下:

 想要深入了解Ribbon的原理,或者想详细了解7种负载均衡策略的,可以参考我另一篇博客 《Ribbon详解》 ,我会在博客最下面给出链接。

 从前两节来看在Spring Boot工程中使用Feign,非常的便利。不过实际生产中,在微服务的初期只能从次要系统开始进行改造,可能很多系统由于历史原因仍然是非Spring Boot的工程,然后这些系统如何使用微服务?如何使用注册中心?如何进行负载均衡呢?

 ▪️首先我们在kyle-service-feign创建调用接口OldSystemPostFeign和OldSystemGetFeign,然后使用feign注解提供的相关注解,包含@RequestLine、@Param、@HeaderParam、@Headers等,主要提供了请求方法、请求参数、头信息参数等操作。

 ▪️我们需要脱离Spring Boot和Spring Cloud的支持,使用feign原生的一些东西。在进行Feign封装之前我们需要一些额外的组件,比如编码器。新增组件依赖如下所示:

 ▪️我们需要一个feign-clientproperties文件,来进行ribbon相关的参数配置,配置如下:

 ▪️到目前为止,相关要素已经准备好了,接下来需要feign和ribbon的封装了。我们需要创建类,作用是加载feign-client.properties文件,并创建一个附带负载均衡器的RibbonClient,然后封装出一个附带Jackson编解码器的FeignClient,如下所示:

 ▪️然后我需要一个测试类FeignClientTest,测试以上3个接口,然后将结果输出到控台如下所示:

 ▪️在完成上述改造之后,启动测试类FeignClientTest,获得如下的结果,说明调用使用了负载均衡。

 细心的同学会发现,非Spring Boot使用feign调用根本没有使用到注册中心的服务发现。在此我提供一个思路,我们可以调用代理微服务,再由代理进行服务发现。那么这个代理服务应该具备哪些功能和作用呢?我将会在下一篇博客详细讲述Netflix公司的API网关组件zuul,它承担路由转发,拦截过滤,流量控制等功能。

▪️ 第一次请求失败

 原因:由于spring的懒加载机制导致大量的类只有在真正使用的才会真正创建,由于默认的熔断超时时间(1秒)过短,导致第一次请求很容易失败,特别互相依赖复杂的时候。

 解决方法:提升熔断超时时间和ribbon超时时间,配置如下:

▪️ Feign的Http Client

 Feign在默认情况下使用的是JDK原生URLConnection发送HTTP请求,没有连接池,但是对每个地址会保持一个长连接,即利用HTTP的persistence connection。我们可以用Apache的HTTP Client替换Feign原始的http client,从而获取连接池、超时时间等与性能息息相关的控制能力。Spring Cloud从Brixtion.SR5版本开始支持这种替换,首先在项目中声明Apcahe HTTP Client和feign-httpclient依赖,然后在application.properties中添加:

▪️ 如何实现在feign请求之前进行操作

 feign组件提供了请求操作接口RequestInterceptor,实现之后对apply函数进行重写就能对request进行修改,包括header和body操作。

▪️ 请求压缩
 Spring Cloud Feign支持对请求和响应进行GZIP压缩,以减少通信过程中的性能损耗。我们只需通过下面两个参数设置,就能开启请求与响应的压缩功能:

 同时,我们还能对请求压缩做一些更细致的设置,比如下面的配置内容指定了压缩的请求数据类型,并设置了压缩的大小下限,只有超过这个大小的请求才会对其进行压缩。

 上述配置的feign.compression.request.nime-types和feign.compression.requestmin-request-size均为默认值。

▪️ 日志配置

 Spring Cloud Feign在构建被@FeignClient注解修饰的服务客户端时,会为每一个客户端都创建一个feign的请求细节。可以在 application.properties 文件中使用logging.level.<FeignClient>的参数配置格式来开启指定Feign客户端的DEBUG日志,其中<FeignClient>为Feign客户端定义捷克队完整路径,比如针对本博文中我们实现的HelloServiceFeign可以如下配置开启:

 但是,只是添加了如上配置,还无法实现对DEBUG日志的输出。这时由于Feign客户端默认对Logger.Level对象定义为NONE级别,该界别不会记录任何Feign调用过程中对信息,所以我们需要调整它对级别,针对全局对日志级别,可以在应用主类中直接假如Logger.Level的Bean创建,具体如下:

 在调整日志级别为FULL之后,我们可以再访问第一节的 http://localhost:8868/feign/postPerson?name=kyle 接口,这是我们在kyle-service-feign的控制台中可以看到类似下面的请求详细的日志:

 对于Feign的Logger级别主要有下面4类,可根据实际需要进行调整使用。

▪️ 负载均衡异常

 当我们只是对一个微服务进行调用的时候,Ribbon提供的支持好像没什么问题。不过在我们进行多个微服务调用时会产生异常,这也是大多数人忽略的。

情景描述 :2个应用B和C,在A中使用feign client调用B和C;测试结果,假如先调用B,再调用C都是有效的,但是再调用B就是无效的;(B,C先后顺序改变,都会产生这个bug)
解决方法 :在主启动类使用注解@RibbonClient,进行RibbonClient配置,如下所示:

 看不懂是吗?不要紧,我下面详细讲解一下,先看一下我们之前的非Spring Boot工程中封装FeignClient:

 OldSystemPostFeign只是一个接口,Feign为什么需要使用接口来调用远程接口?原因就是使用JDK动态代理,我们可以去看Feign是如何进行处理。

❺ SpringBoot如何使用Feign实现远程接口调用

什么是Feign?与 Ribbon ⼀样,Feign 也是由 Netflflix 提供的,Feign 是⼀个声明式、模版化的 Web Service 客户端,它简化了开发者编写 Web 服务客户端的操作,开发者可以通过简单的接⼝和注解来调⽤ HTTP API, Spring Cloud Feign,它整合了 Ribbon 和 Hystrix,具有可插拔、基于注解、负载均衡、服务熔断等⼀系列便捷功能。

(1)Feign 是⼀个声明式的 Web Service 客户端;

(2)⽀持 Feign 注解、Spring MVC 注解、JAX-RS 注解;

(3)Feign 基于 Ribbon 实现,使⽤起来更加简单;

(4)Feign 集成了 Hystrix,具备服务熔断降级的功能。

pom.xml

application.yaml

User

UserController

启动类

浏览器访问 : http://localhost:8081/api/server/getUserInfo

pom.xml

application.yaml

UserFeignClient

TestController

启动类

浏览器访问: http://localhost:8082/api/client/get

这样就实现了通过feign client来调用远程(第三方)接口了。

❻ 使用【Feign】调用接口

使用feign能像使用service类一样的方式调用接口,使调用简单明了。
文档: https://cloud.spring.io/spring-cloud-openfeign/reference/html/

新建一个interface使用注解 @FeignClient 示例中是直接通过接口地址调用,要指定 name 。
另一种方式是使用 Eureka 服务发现的应用,要调用微服务可以直接指定应该名就可以了 @FeignClient("myapi")
interface里面调用 search 接口的写方和接口的定义几乎一样。示例中用了 @SpringQueryMap 注解,其作用是动态的添加url后面的参数,如果 parameter 没有设置的项(如pageSize)会被忽略 https://v1.myapi/search?keyword=xxx&type=xxx&page=0 。

❼ Spring Cloud Feign的两种使用姿势

最近结合一些别人的开源项目来学习Spring Cloud,其中关于服务消费这方面的一个很便利的工具 Feign让我记忆颇深。虽然网上的Demo和例子不胜枚举,但大多比较分散,本文就来集中记录一下声明式客户端 Feign的一些使用姿势。

三个步骤即可搞定:

创建一个名为 eureka_server 的 SpringBoot工程,并在pom.xml中添加好对应依赖

修改应用主类,添加 @EnableEurekaServer 注解

配置 application.properties 文件如下所示:

浏览器访问之:

此时还没有任何服务注册上来。

创建一个名为 service_provider 的 SpringBoot工程,并在pom.xml中添加好对应依赖:

添加 @EnableDiscoveryClient 注解

提供一个Restful接口而已,该接口的作用是获取服务器上的时间并返回

浏览器访问服务注册中心,我们发现服务提供者 service_provider 已经注册到 eureka_server 上:

同时浏览器访问: http://localhost:1112/test?param=www.codesheep.cn ,可以测试服务提供 service_provider 提供的接口工作正常

接下来我们创建服务消费者,是 Feign该登场的时候了!

主要是添加有关 Feign客户端的一些注解而已

很明显其内部用 @FeignClient( value = "service-provider" ) 声明的方式指向了 服务提供者,而接口方法则实现了对 服务提供者接口的实际调用

注意,这是服务消费者提供的 Rest接口

我们先去服务注册中心上看看,发现 服务消费者也注册上来了:

然后我们浏览器访问 服务消费者提供的Rest接口: http://localhost:1113/consumer/date?param=www.codesheep.cn

这样我们就通过 服务消费者的 Feign客户端 取到了服务提供者 给予的接口数据。

浏览器访问: http://localhost:1113/consumer2/date?param=www.codesheep.cn