上一篇文章,讲述了如何通过RestTemplate+Ribbon去消费服务,这篇文章主要讲述如何通过Feign去消费服务。
一、Feign简介
Feign是一个声明式的伪Http客户端,它使得写Http客户端变得更简单。使用Feign,只需要创建一个接口并注解。它具有可插拔的注解特性,可使用Feign 注解和JAX-RS注解。Feign支持可插拔的编码器和解码器。Feign默认集成了Ribbon,并和Eureka结合,默认实现了负载均衡的效果。
简而言之:
- Feign 采用的是基于接口的注解
- Feign 整合了ribbon
二、准备工作
继续用上一节的工程, 启动eureka-server,端口为8761; 启动service-hi 两次,端口分别为8762 、8773.
三、创建一个feign的服务
新建一个spring-boot工程,取名为serice-feign,在它的pom文件引入Feign的起步依赖spring-cloud-starter-feign、Eureka的起步依赖spring-cloud-starter-eureka、Web的起步依赖spring-boot-starter-web,代码如下:
<?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.forezp</groupId> <artifactId>service-feign</artifactId> <version>0.0.1-SNAPSHOT</version> <packaging>jar</packaging> <name>service-feign</name> <description>Demo project for Spring Boot</description> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>1.5.2.RELEASE</version> <relativePath/> <!-- lookup parent from repository --> </parent> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding> <java.version>1.8</java.version> </properties> <dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-eureka</artifactId> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-feign</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> </dependencies> <dependencyManagement> <dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-dependencies</artifactId> <version>Dalston.RC1</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build> <repositories> <repository> <id>spring-milestones</id> <name>Spring Milestones</name> <url>https://repo.spring.io/milestone</url> <snapshots> <enabled>false</enabled> </snapshots> </repository> </repositories> </project>
在工程的配置文件application.yml文件,指定程序名为service-feign,端口号为8765,服务注册地址为http://localhost:8761/eureka/ ,代码如下:
eureka: client: serviceUrl: defaultZone: http://localhost:8761/eureka/ server: port: 8765 spring: application: name: service-feign
在程序的启动类ServiceFeignApplication ,加上@EnableFeignClients注解开启Feign的功能:
package com.zntg.servicefeign; /** * 一、Feign简介 * Feign是一个声明式的伪Http客户端,它使得写Http客户端变得更简单。使用Feign,只需要创建一个接口并注解。 * 它具有可插拔的注解特性,可使用Feign 注解和JAX-RS注解。Feign支持可插拔的编码器和解码器。 * Feign默认集成了Ribbon,并和Eureka结合,默认实现了负载均衡的效果。 * 简而言之: * Feign 采用的是基于接口的注解 * Feign 整合了ribbon */ import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cloud.client.discovery.EnableDiscoveryClient; import org.springframework.cloud.netflix.feign.EnableFeignClients; /** * @Description: SpringCloud教程 | 第三篇: 服务消费者(Feign) * 用法:在程序的启动类ServiceFeignApplication ,加上@EnableFeignClients注解开启Feign的功能 * @Author: zhengyunfei q q 号:541122375 * @Date: 2018/7/3 * @time:11:03 */ @SpringBootApplication @EnableDiscoveryClient @EnableFeignClients public class ServiceFeignApplication { public static void main(String[] args) { SpringApplication.run(ServiceFeignApplication.class, args); } }
定义一个feign接口,通过@ FeignClient(“服务名”),来指定调用哪个服务。比如在代码中调用了service-hi服务的“/hi”接口,代码如下:
package com.zntg.servicefeign.service; import org.springframework.cloud.netflix.feign.FeignClient; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.bind.annotation.RequestParam; /** * @Description: 定义一个feign接口,通过@ FeignClient(“服务名”),来指定调用哪个服务。比如在代码中调用了service-hi服务的“/hi”接口,代码如下: * @Author: zhengyunfei q群号:541122375 * @Date: 2018/7/3 * @time:11:05 */ @FeignClient(value="service-hi") public interface SchedualServiceHi { @RequestMapping(value = "/hi",method = RequestMethod.GET) String sayHiFromClientOne(@RequestParam(value = "name") String name); }
在Web层的controller层,对外暴露一个”/hi”的API接口,通过上面定义的Feign客户端SchedualServiceHi 来消费服务。代码如下:
package com.zntg.servicefeign.web; import com.zntg.servicefeign.service.SchedualServiceHi; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; /** * @program: zntg_clould_v1 * @description:在Web层的controller层,对外暴露一个”/hi”的API接口,通过上面定义的Feign客户端SchedualServiceHi 来消费服务。代码如下: * @author: zhengyunfei * @create: 2018-07-03 11:08 **/ @RestController public class HiController { @Autowired SchedualServiceHi schedualServiceHi; /** * @Description: sayHi api接口 * @Author: zhengyunfei q q 群:541122375 * @Date: 2018/7/3 * @time:11:09 */ @RequestMapping(value = "/hi",method = RequestMethod.GET) public String sayHi(@RequestParam String name){ return schedualServiceHi.sayHiFromClientOne(name); } }
启动程序,多次访问http://localhost:8765/hi?name=forezp,浏览器交替显示:
hi forezp,i am from port:8762 hi forezp,i am from port:8763
相关推荐
Feign的设计灵感来源于Netflix的Feign库,它的主要目的是简化微服务之间的通信,使得开发者可以像定义接口一样调用远程服务,从而降低了服务消费者与提供者的耦合度。 在传统的Web Service(WebService)中,我们...
在这个名为"SpringCloud-创建服务消费者-Feign方式示例代码.zip"的压缩包中,我们预计将看到一个简单的Spring Cloud应用,该应用展示了如何利用Feign作为服务消费者来调用其他服务。 首先,让我们了解Feign的基本...
本文主要探讨了在SpringCloud中如何使用Ribbon和Feign作为服务消费者的组件,以及它们背后的负载均衡原理。首先,理解服务间通信的基础是HTTP协议,而注册中心Eureka则负责维护服务实例的列表。 Ribbon和Feign都是...
在整合 Feign 和 WebFlux 时,我们需要确保服务提供者的接口是基于 WebFlux 实现的,这样才能保证在服务消费者端使用 Feign 进行调用时,能够正确地处理非阻塞的响应式请求。 具体实现步骤如下: 1. **引入依赖**...
本示例代码着重讲解如何利用Ribbon创建服务消费者,结合Eureka实现服务发现。Eureka是Netflix开源的服务注册与发现工具,它使得微服务之间能够互相找到并进行通信。 首先,我们需要理解Spring Cloud Eureka的工作...
在服务消费者端,当调用服务提供者的API时,Feign会自动使用配置好的Jackson XML序列化器将Java对象转换为XML格式,然后发送请求。服务提供者接收到XML数据后,同样可以通过Jackson反序列化回Java对象。 此外,...
4. 在服务消费者应用启动类中启用Feign客户端,添加@EnableFeignClients注解。 步骤六:测试 1. 先启动Nacos服务器,然后依次启动服务提供者和消费者应用。 2. 服务消费者通过Feign接口调用服务提供者的功能,验证...
在这个"eureka 客户端-服务消费者"的示例中,我们将深入探讨如何使用 Spring Boot 和 Spring Cloud 的最新版本来实现基于 Feign 的服务消费者。 1. **Eureka 服务注册与发现** Eureka 是 Netflix 开源的一个基于 ...
我们的实践案例包括两个项目:服务提供者项目 upload-service 和调用服务项目 upload-client。upload-service 负责提供文件上传服务,而 upload-client 负责调用 upload-service 实现文件上传功能。 upload-service...
- **Feign接口**: 在Feign中,服务消费者通过定义一个接口来描述远程调用,这个接口会带有注解,注解中包含了服务提供者的地址和服务接口等信息。 - **Feign Client**: 实现了HTTP客户端的功能,根据Feign接口生成...
另一个是服务消费者(Consumer),通过Feign调用服务提供者的接口。 - "feign-demo"可能包含了这两个模块的相关代码,如启动类、配置文件、服务接口定义等。 6. **测试与运行**: - 开发完成后,需要确保Eureka ...
在Spring Cloud应用中,Feign、Ribbon和Eureka三者共同作用于服务间的通信: - **Eureka**:作为服务注册中心,维护着所有微服务实例的信息,每个微服务启动时都会向Eureka注册,提供服务发现功能。 - **Feign**:...
Feign允许我们将HTTP请求的定义与服务调用逻辑解耦,通过注解和接口定义,我们可以创建一个服务消费者,就像调用本地方法一样调用远程服务。Feign还支持Hystrix断路器,当服务不可用或响应时间过长时,Hystrix可以...
6. **配置Feign**:在服务消费者的配置中,指定Eureka作为服务发现客户端,并启用Feign。在Feign接口中,定义与服务提供者相同的HTTP方法和URL。 7. **测试应用**:启动服务提供者和消费者,然后通过服务消费者调用...
通过以上步骤,我们就能实现Spring Cloud Feign与Hystrix的整合,为服务调用添加了容错保护,增强了系统的健壮性。在微服务架构中,这种服务间调用的健壮性设计是至关重要的,能够帮助我们构建出更稳定、更可靠的...
Feign的设计理念是通过简单的接口定义来封装服务调用,让开发者能够专注于业务逻辑,而不是底层网络通信的细节。 在开始了解Feign之前,我们先理解RPC的概念。RPC允许一个程序调用另一个运行在不同机器上的程序,就...
Feign 的英文表意为“假装,伪装,变形”, 是一个http请求调用的轻量级...Feign通过处理注解,将请求模板化,当实际调用的时候,传入参数,根据参数再应用到请求上,进而转化成真正的请求,这种请求相对而言比较直观。
Feign 是一个声明式的 Web 服务客户端,它可以使得 Web 服务客户端的写入更加方便。Feign 结合 Eureka 注册中心,把不同的服务项目注册到 Eureka 中,通过 Feign 客户端进行调用,可以解决负载均衡问题。 一、Feign...
这个"Feigndemo02"可能包含了实现以上功能的示例代码,包括服务提供者和服务消费者端的配置、接口定义以及实际调用。通过分析这些代码,你可以更深入地理解Feign的工作原理和使用方式。 总结起来,Spring Cloud ...
在服务消费者的业务逻辑中,使用RestTemplate或Feign等工具,发起HTTP请求调用服务提供者。 4. **运行和测试**:启动Eureka Server,然后依次启动服务提供者和服务消费者。通过服务消费者调用服务提供者的接口,...