feign漫谈

feign的简单使用。

文章目录

  • 一. 什么是feign
  • 二. 准备工作
  • 三. 如何使用
    • 3.1 定义pom文件
    • 3.2 定义配置文件及启动类注解
    • 3.3 定义feign接口
  • 四. 部署

一. 什么是feign

远程调用框架

二. 准备工作

需要nacos环境:

涉及到feign调用,就没法抛开注册中心,接下来我们使用主流的nacos作为注册中心进行搭建本地环境。具体参见之前的nacos系列:https://blog.csdn.net/imVainiycos/article/details/122917022

三. 如何使用

3.1 定义pom文件

  1. 新建一个maven项目作为父工程

image-20230116160204225

父工程的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.vainycos</groupId><artifactId>demo-spring-cloud</artifactId><version>1.0-SNAPSHOT</version><packaging>pom</packaging><parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.2.5.RELEASE</version></parent><modules><module>core</module><module>customer</module><module>supermarket</module></modules><properties><maven.compiler.source>8</maven.compiler.source><maven.compiler.target>8</maven.compiler.target><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding><springboot.version>2.2.5.RELEASE</springboot.version><spring.cloud.version>Hoxton.SR3</spring.cloud.version><spring.cloud.alibaba.version>2.2.1.RELEASE</spring.cloud.alibaba.version></properties><dependencyManagement><dependencies><!--支持Spring Boot 2.1.X--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-dependencies</artifactId><version>${springboot.version}</version><type>pom</type><scope>import</scope></dependency><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-dependencies</artifactId><version>${spring.cloud.version}</version><type>pom</type><scope>import</scope></dependency><!-- alibaba-cloud --><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-alibaba-dependencies</artifactId><version>${spring.cloud.alibaba.version}</version><type>pom</type><scope>import</scope></dependency></dependencies></dependencyManagement><dependencies><!--服务调用--><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-openfeign</artifactId></dependency><dependency><groupId>io.github.openfeign</groupId><artifactId>feign-okhttp</artifactId></dependency><!--注册中心--><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId></dependency></dependencies>
</project>
  1. 新建三个子模块,模拟一个超市购物行为和结账会员身份识别场景,分别是:
  • core - 核心模块,feign接口层或者其他核心类
  • customer - 会员模块,依赖[core]模块,通过core模块的feign统一调用[supermarket]服务
  • supermarket - 超市模块,依赖[core]模块,通过core模块的feign统一调用[customer]服务

​ core模块的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 https://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><packaging>jar</packaging><parent><groupId>com.vainycos</groupId><artifactId>demo-spring-cloud</artifactId><version>1.0-SNAPSHOT</version></parent><groupId>com.vainycos</groupId><artifactId>core</artifactId><version>0.0.1-SNAPSHOT</version><name>core</name><description>core</description><properties><java.version>8</java.version></properties><dependencies><!-- spring-boot-starter-web --><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></project>

​ customer模块的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 https://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><packaging>jar</packaging><parent><groupId>com.vainycos</groupId><artifactId>demo-spring-cloud</artifactId><version>1.0-SNAPSHOT</version></parent><groupId>com.vainycos</groupId><artifactId>customer</artifactId><version>0.0.1-SNAPSHOT</version><name>customer</name><description>customer</description><properties><java.version>8</java.version></properties><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency><dependency><groupId>com.vainycos</groupId><artifactId>core</artifactId><version>0.0.1-SNAPSHOT</version></dependency></dependencies><build><finalName>customer</finalName><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId></plugin></plugins></build>
</project>

​ supermarket模块的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 https://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><packaging>jar</packaging><parent><groupId>com.vainycos</groupId><artifactId>demo-spring-cloud</artifactId><version>1.0-SNAPSHOT</version></parent><groupId>com.example</groupId><artifactId>supermarket</artifactId><version>0.0.1-SNAPSHOT</version><name>supermarket</name><description>supermarket</description><properties><java.version>8</java.version></properties><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency><dependency><groupId>com.vainycos</groupId><artifactId>core</artifactId><version>0.0.1-SNAPSHOT</version><scope>compile</scope></dependency></dependencies><build><finalName>market</finalName><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId></plugin></plugins></build>
</project>

3.2 定义配置文件及启动类注解

假设你本地的nacos已经启动完成了,启动端口为默认的8848。

两个模块的配置均大同小异,这里以customer模块为例。

这里需要注意由于使用微服务的配置需要优先加载,所以我们不在原来的application.yaml或者application.yml上进行配置,而是新建一个bootstrap.yml文件进行配置,配置内容如下:

server:# 定义另一个模块的启动端口为8082port: 8081spring:application:# 定义另一个模块的值为marketname: customercloud:nacos:discovery:server-addr: localhost:8848

在启动类CustomerApplication上加注解@EnableDiscoveryClient以及@EnableFeignClients(basePackageClasses = {CustomerApplication.class, CoreApplication.class}),这里需要依赖core模块,所以把core的启动类也注入。

@EnableDiscoveryClient
@EnableFeignClients(basePackageClasses = {CustomerApplication.class, CoreApplication.class})
@SpringBootApplication
public class CustomerApplication {public static void main(String[] args) {SpringApplication.run(CustomerApplication.class, args);}}

3.3 定义feign接口

首先我们在customer模块定义一个接口,根据id查询客户信息:

@RequestMapping("/customer")
@RestController
public class CustomerController {@Autowiredprivate MarketService marketService;@GetMapping("/getUser/{id}")public String getById(@PathVariable("id") Integer id){return "获取id=" + id + "的用户";}
}

调用本服务进行测试,访问http://localhost:8081/customer/getUser/1,结果如下表示通过:

image-20230116155257137

我们到core模块下定义一个feign接口CustomerService,在类名上加注解@FeignClient(name = “customer”),该注解name的值需要注意与调用服务方配置文件重的application.name保持一致,比如这里是customer:

image-20230116171123037

完整的feign接口定义如下,这里需要注意每个入参都需要定义入参格式,比如这里是路径参数即加上@PathVariable,其他的还有@RequestParameter,@RequestBody等等,并且@GetMapping的请求地址需要与对应模块的请求地址保持一致:

package com.vainycos.core.feign.customer;import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;@FeignClient(name = "customer")
public interface CustomerService {@GetMapping("/customer/getUser/{id}")String getCustomerById(@PathVariable("id") Integer id);
}

这个时候我们模拟一个场景,即在supermarket模块结账的时候需要调用customer模块获取会员信息。

在supermarket模块中定义controller,把上面的feign接口注入进来即可调用:

package com.example.supermarket.controller;import com.vainycos.core.feign.customer.CustomerService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;/*** @author: Vainycos* @description* @date: 2023/1/16 13:30*/
@RequestMapping("/market")
@RestController
public class MarketController {@Autowiredprivate CustomerService customerService;@GetMapping("/buy")public String order(String things, Integer id){String customerById = customerService.getCustomerById(id);return customerById + "购买了" +things;}
}

我们启动这两个服务之后,观察nacos的服务列表发现已经成功注册上去了:

image-20230117100055168

我们访问http://localhost:8082/market/buy?things=苹果电脑&id=1,结果如下表示成功进行了跨服务间的调用:

image-20230116171607683

到这里,完整的feign调用链路就已经搭建完成了。


同理,我们也可以在supermarket定义获取商品列表的服务,然后提供给customer调用:

package com.example.supermarket.controller;import com.vainycos.core.feign.customer.CustomerService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;/*** @author: Vainycos* @description* @date: 2023/1/16 13:30*/
@RequestMapping("/market")
@RestController
public class MarketController {@Autowiredprivate CustomerService customerService;/*** 获取商品列表* @return*/@GetMapping("/listMarket")public String listMarket(){return "啤酒,瓜子,花生米";}@GetMapping("/buy")public String order(String things, Integer id){// 调用feign接口String customerById = customerService.getCustomerById(id);return customerById + "购买了" +things;}}

然后在core模块下定义feign接口

package com.vainycos.core.feign.supermarket;import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.GetMapping;/*** @author: Vainycos* @description* @date: 2023/1/16 16:18*/
@FeignClient(name = "market")
public interface MarketService {@GetMapping("/market/listMarket")String listMarket();
}

最后在customer模块中注入feign接口MarketService进行使用:

package com.vainycos.customer.controller;import com.vainycos.core.feign.supermarket.MarketService;
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.RequestMapping;
import org.springframework.web.bind.annotation.RestController;/*** @author: Vainycos* @description* @date: 2023/1/16 13:27*/
@RequestMapping("/customer")
@RestController
public class CustomerController {@Autowiredprivate MarketService marketService;@GetMapping("/listMarket/{id}")public String listMarket(@PathVariable("id") Integer id){// 调用feign接口String goods = marketService.listMarket();return "用户id=" + id + "查询商品列表:" + goods;}@GetMapping("/getUser/{id}")public String getById(@PathVariable("id") Integer id){return "获取id=" + id + "的用户";}}

访问http://localhost:8081/customer/listMarket/1,结果如下:

image-20230116172124042

四. 部署

我们在项目工程的根目录下执行如下命令,关于打包的build节点配置可以参考该文:maven的build节点配置:

mvn clean install -Dmaven.test.skip=true

在supermarket\target以及customer\target目录下即可看到对应的jar包,我们可以部署多份jar包作为微服务的扩展,只需要启动的时候指定不同的端口即可

java -jar customer.jar --server.port=8081
java -jar customer.jar --server.port=8091
java -jar customer.jar --server.port=8101

同理,market也分别设置指定三个启动端口为8082,8092,8102

java -jar market.jar --server.port=8082
java -jar market.jar --server.port=8092
java -jar market.jar --server.port=8102

我们观察nacos上的服务列表,就可以发现对应的market和customer服务分别都有了3个实例。

image-20230117105425049

这里我们就实现了服务的简单扩展,只要启动的三个实例有一个还活着就不会导致整个服务挂掉,但是还没有实现如何将请求均匀的分摊到各个实例上,以及其中一个服务的所有实例都挂掉之后该怎么处理,这个课题我们留到之后再来探讨。

以上代码示例可参考该仓库:https://gitee.com/dearvainycos/demo-spring-cloud.git

参考资料:

  • Feign的使用
  • 什么是Feign?
  • 【微服务】分布式组件 Nacos 结合 Feign 的使用

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://xiahunao.cn/news/251680.html

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

Feign简介

Feign feign是声明式的web service客户端&#xff0c;它让微服务之间的调用变得更简单了&#xff0c;类似controller调用service。Spring Cloud集成了Ribbon和Eureka&#xff0c;可在使用Feign时提供负载均衡的http客户端。 Feign是什么? Feign是一个声明式WebService客户端…

feign的使用入门篇

Feign简介 Feign是一个声明式的Web服务客户端&#xff0c;使用Feign可使得Web服务客户端的写入更加方便。 它具有可插拔注释支持&#xff0c;包括Feign注解和JAX-RS注解、Feign还支持可插拔编码器和解码器、Spring Cloud增加了对Spring MVC注释的支持&#xff0c;并HttpMessag…

Feign的简介及使用

一、Feign简介 Feign是一个声明式的http客户端&#xff0c;官方地址:https://github.com/OpenFeign/feign 其作用就是帮助我们优雅的实现http请求的发送&#xff0c;解决代码可读性差&#xff0c;编程体验不统一、参数复杂URL难以维护的问题。 二、使用Feign的步骤 1.引入依赖…

架构愿景: 构建良好软件的关键

在产品开发生命周期的各个阶段&#xff0c;牢记架构愿景&#xff0c;始终坚持每个决策都符合愿景原则&#xff0c;是避免架构腐化的唯一方式。原文: Architecture Vision — A critical ingredient in building well-maintained software 上一篇文章《软件架构: 一切皆有代价》…

Feign原理

是一个HTTP请求调用轻量级框架&#xff0c;可以以Java接口注解的方式调用HTTP请求&#xff0c;而不用像Java中通过封装HTTP请求报文的方式直接调用。 Feign解决了什么问题 在服务调用的场景中&#xff0c;我们经常调用基于HTTP协议的服务&#xff0c;而我们经常使用到的框架可…

Feign是什么?

Feign能干什么&#xff1f; Feign旨在是编写Java Http客户端变得更加容易。 之前使用RibbonRestTemplate时&#xff0c;利用RESTTemplate请求的封装处理&#xff0c;形成了一套模板化的调用方法。但是在实际开发中&#xff0c;有偶遇对于服务依赖的调用可能不止一处&#xff…

Feign 与 OpenFeign

1. 什么是Feign Netflix Feign 是 Netflix 公司发布的一种实现负载均衡和服务调用的开源组件。Spring Cloud 将其与 Netflix 中的其他开源服务组件&#xff08;例如 Eureka、Ribbon 以及 Hystrix 等&#xff09;一起整合进 Spring Cloud Netflix 模块中&#xff0c;整合后全称为…

Feign的工作原理

文章目录 Feign的简单介绍Feign的工作原理1.创建远程接口的本地代理实例2.封装Request对象并进行编码3.feign.Client发送请求并对获取结果进行解码 总结 Feign的简单介绍 Feign组件主要用于微服务项目中&#xff0c;用来简化服务之间的远程调用&#xff0c;相信大家对他的使用…

OpenFeign和feign使用简介

1.OpenFeign简介 Feign是一个声明式的Web Service客户端。它的出现使开发Web Service客户端变得很简单。使用Feign只需要创建一个接口加上对应的注解&#xff0c;比如&#xff1a;FeignClient注解。Feign有可插拔的注解&#xff0c;包括Feign注解和JAX-RS注解。 Feign也支持编码…

Feign详解与实例

基本介绍 Feign是一种负载均衡的HTTP客户端, 使用Feign调用API就像调用本地方法一样&#xff0c;从避免了调用目标微服务时&#xff0c;需要不断的解析/封装json 数据的繁琐。Feign集成了Ribbon。Ribboneureka是面向微服务编程&#xff0c;而Feign是面向接口编程。 Fegin是一个…

FeignClient

FeignClient的调用 注意&#xff1a; 依赖可能会出现冲突&#xff0c;请根据spring-cloud版本选择并修改 1. 引入依赖&#xff1a; <dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-openfeign</artif…

Feign的介绍

Feign是springcloud里面的一个功能组件&#xff0c;那么它是实现一个什么功能呢&#xff1f; 首先我们可以先从字面意思上去理解一下它&#xff0c;Feign&#xff0c;英文翻译过来就是伪装的意思&#xff0c;实际上它的功能也是和伪装相关的&#xff0c;在我们之前在客户端配置…

@FeignClient使用详解

FeignClient标签的常用属性如下&#xff1a; name&#xff1a;指定FeignClient的名称&#xff0c;如果项目使用了Ribbon&#xff0c;name属性会作为微服务的名称&#xff0c;用于服务发现url: url一般用于调试&#xff0c;可以手动指定FeignClient调用的地址decode404:当发生h…

Feign详解

一. Feign概述 Feign是Spring Cloud提供的声明式、模板化的HTTP客户端&#xff0c; 它使得调用远程服务就像调用本地服务一样简单&#xff0c;只需要创建一个接口并添加一个注解即可。 Spring Cloud集成Feign并对其进行了增强&#xff0c;使Feign支持了Spring MVC注解&#x…

Feign(简介和使用)

1. Feign介绍 通过RestTemplate调用其它服务的API时&#xff0c;所需要的参数须在请求的URL中进行拼接&#xff0c;如果参数少的话或许我们还可以忍受&#xff0c;一旦有多个参数的话&#xff0c;这时拼接请求字符串就会效率低下 Feign是一个声明式的Web Service客户端&#…

什么是Feign?

服务间调用介绍 现有的服务调用方式 利用拼接的方式。 虽然上面有的用不错就很好了 Feign解决了什么问题 Feign的调用方式 Feign体系架构解析-武装到牙齿 上一节我们了解了feign的主要功能&#xff0c;它就像一个自拍杆一样&#xff0c;方便了Eureka的远程调用。可是怎么看…

简单理解Feign的原理与使用

文章目录 SpringCloud 总架构图一、简介1.1、负载均衡的概念2.2、Feign概念 二、入门案例2.1、导入依赖2.2、Feign的客户端2.3、调用Feign2.4、开启Feign功能2.5、启动测试2.6、Feign实现原理简单分析 三、负载均衡(Ribbon)四、熔断器支持五、请求压缩和响应压缩六、配置日志级…

Feign基本使用(超详细)

目录 一、Feign概述 二、Feign入门 1.创建服务提供者(provider) 2.创建feign接口 3、创建服务消费者(consumer) 三、Feign 原理 四、Feign优化 1、开启feign日志 2、feign超时问题 3、http连接池 4、gzip压缩 前言 当我们通过RestTemplate调用其它服务的API时&#xff0c;所…

中外黑客两则

外国一则&#xff1a;丹尼斯麦卡利斯泰尔里奇。挑选他的原因&#xff1a;帅。 &#xff08;英语&#xff1a;Dennis MacAlistair Ritchie&#xff1b;1941年9月9日&#xff0d;2011年10月12日[3][4]&#xff09;&#xff0c;著名的美国计算机科学家&#xff0c;对C语言和其他编…

git使用X篇_2_Git全套教程IDEA版(git、GitHub、Gitee码云、搭建公司内部GitLab、与IDEA集成等内容)

本文是根据以下视频及网上总结进行更新后的介绍git使用的博文。包含了git、GitHub、Gitee码云、搭建公司内部GitLab、与IDEA集成等内容。 笔记来源&#xff1a;【尚硅谷】5h打通Git全套教程IDEA版&#xff08;涵盖GitHub\Gitee码云\GitLab&#xff09; 文章目录 初识 Git0、内容…