构建基于 Feign 的微服务:从 Eureka 到负载均衡的实践 --day05

news2024/9/28 3:09:46

目录

    • 步骤1:创建父工程feign-1
    • 步骤2:改造服务提供者
      • 使用 `@RequestMapping`
      • 使用 `@GetMapping`
    • 步骤3:改造服务消费者为Feign客户端
      • (1)添加Feign依赖
      • (2)添加@EnableFeignClients注解
      • (3)实现Feign Client
    • 创建FeignController类,调用sayHello()方法
    • 步骤4:测试运行
  • 参数绑定
    • 步骤1:改造服务提供者eureka-provider
    • 步骤2:改造含有Feign的eureka-consumer
      • (1)在FeignService类中增加绑定参数的方法
      • (2)在FeignController类中调用FeignService中的方法
    • 步骤3:测试运行
  • 总结

Feign,由Netflix打造的声明式HTTP客户端,提供了一种简便的方式来进行服务调用。

结合Eureka和Ribbon,Feign不仅具备了服务发现的机制,还实现了负载均衡功能。

通过Feign,开发者仅需定义接口并利用注解配置,便可轻松实现对服务接口的绑定。

这极大地简化了使用Ribbon封装服务调用的过程。

因此,Feign可被视为Spring Cloud中的一种框架工具,旨在减少编码量,同时提升与远程服务的兼容性和交互效率。

第一个Feign程序
步骤:

1.搭建Eureka Server

2.创建服务提供者

3.创建Feign客户端

4.测试运行

步骤1:创建父工程feign-1

将搭建的Eureka基本应用中的3个子项目都复制到feign-1父工程中,并依次添加为Maven项目。
在这里插入图片描述

步骤2:改造服务提供者

在服务提供者eureka-provider中创建controller包,并在该包下创建HelloController类,该类定义了一个sayHello ()方法,用于处理路径为/hello的请求。

HelloController类的内容如下:

在这里插入图片描述

@RestController
public class HelloController {
    @RequestMapping(value = "/hello",method = RequestMethod.GET)
    public String say(){
        return "feign!";
    }
}

在Spring Framework中,@GetMapping实际上是@RequestMapping的一个专门化子注解,主要用于处理HTTP的GET请求。

这一注解是在Spring Framework的4.3版本中引入的,目的在于提升代码的语义清晰度和可读性。

接下来,我们来对比一下这两个注解的使用:

使用 @RequestMapping

@RequestMapping(value = "/hello", method = RequestMethod.GET)
public String say() {
    return "feign!";
}

这里,@RequestMapping 注解指定了 URL 路径 /hello 并且限定了只有 GET 请求才会触发此方法。

使用 @GetMapping

@GetMapping("/hello")
public String say() {
    return "feign!";
}

@GetMapping作为@RequestMapping针对GET请求的特定版本,它默认只处理GET请求,因此无需显式设置method属性。

这样不仅使代码更加简洁,也使得其意图更为明显和直接。

两者在功能上是等价的,但是 @GetMapping 提供了更好的语义表达力。

步骤3:改造服务消费者为Feign客户端

(1)添加Feign依赖

在eureka-consumer项目的pom文件中,我们需要添加Feign依赖。

  <dependency>

      <groupId>org.springframework.cloud</groupId>

      <artifactId>spring-cloud-starter-openfeign</artifactId>

  </dependency>

添加后重新加载pom文件。

(2)添加@EnableFeignClients注解

在EurekaConsumerApplication类中,通过加入@EnableFeignClients注解来激活Feign Client功能。
在这里插入图片描述

(3)实现Feign Client

在eureka-consumer项目中,首先建立名为service的包。

在这个新创建的包内,定义一个接口命名为FeignService。

接着,通过在该接口上应用@FeignClient注解,明确指出我们打算调用的服务端点。
在这里插入图片描述

创建FeignController类,调用sayHello()方法

在eureka-consumer工程中,我们需要建立一个名为controller的包。

在这个包内部,进一步创建一个FeignController类。

该类的hello()方法被设计用于触发FeignService中的sayHello()方法。
在这里插入图片描述

步骤4:测试运行

依次启动eureka-server、eureka-provider和eureka-consumer。启动成功后,使用浏览器访问http://localhost,观察页面结果。说明通过Feign调用成功。
在这里插入图片描述

参数绑定

在基于首个Feign程序的升级版中,我们采用了Eureka-Feign-Client来实现对Eureka-Provider接口的调用。

与以往不同的是,此次在调用Eureka-Provider接口时需传递一个不同类型的参数。
步骤:

1.改造服务提供者eureka-provider

2.改造含有Feign的eureka-consumer

3.测试运行

步骤1:改造服务提供者eureka-provider

修改HelloController

在HelloController中新增2个不同类型参数的方法。
在这里插入图片描述

package com.bushuo.eurekaprovider.controller;

import org.springframework.web.bind.annotation.*;

import java.util.Map;

@RestController
public class HelloController {
    @RequestMapping(value = "/hello",method = RequestMethod.GET)
    public String say(){
        return "feign!";
    }
    @RequestMapping(value = "hello1", method = RequestMethod.GET)
    public String say(@RequestParam String name) {
        return "Hello : " +name;
    }
    @RequestMapping(value = "/hello2",method = RequestMethod.POST)
    public  String say(@RequestBody Map userMap ){
        String userName = (String)userMap.get( "userName" );
        String password=(String) userMap.get( "password" );
        return  "hello : " + userName +",your password is"+password;
    }
}

注意事项

  • 如果你想从请求头中获取值,应该使用 @RequestHeader 注解。
  • 如果你正在处理 GET 请求,并且需要传递复杂的对象,也可以考虑使用 MultiValueMap 或者自定义的 DTO 类来封装请求参数。

步骤2:改造含有Feign的eureka-consumer

(1)在FeignService类中增加绑定参数的方法

在FeignService类中增加2个绑定不同参数类型的方法。
在这里插入图片描述

@FeignClient(name = "eureka-provider")
public interface FeignService {
    @RequestMapping(value = "/hello" , method = RequestMethod.GET)
    public String say();
    @RequestMapping(value = "hello1",method = RequestMethod.GET)
    public String say(@RequestParam String name);
    @RequestMapping(value = "/hello2", method = RequestMethod.POST)
    public String say(@RequestBody Map userMap);
}

(2)在FeignController类中调用FeignService中的方法

在FeignController类中,我们新增了两个方法。

第一个方法是hello1,它处理指向“/hi1”的请求,通过调用FeignService中的say()函数实现,该函数接收一个名为name的@RequestParam类型参数。

第二个方法是hello2,用于处理“/hi2”路径下的请求,它也依赖于FeignService的say()函数,但这次接收的是@RequestBody类型的Map对象作为userMap参数。

在这里插入图片描述

@RestController
public class FeignController {
    @Resource
    FeignService helloService;
    @RequestMapping(value = "/hi",method = RequestMethod.GET)
    public String hello(){
        return helloService.say();
    }
    @RequestMapping(value = "/hi1",method = RequestMethod.GET)
    public String hello1(@RequestParam("userName") String userName ){
        return helloService.say(userName);
    }
    @RequestMapping
    public String hello2(@RequestParam("name") String name,@RequestParam("pass") String pass ){
        Map<String,String> userMap = new HashMap<String , String >();
        userMap.put( "userName",name );
        userMap.put( "password",pass );
        return helloService.say(userMap);
    }
}

步骤3:测试运行

依次启动eureka-server、eureka-provider和eureka-consumer。启动成功后,

hello1方法的请求路径为:

http://localhost:7007/hi1?userName=bushuo

同理:hello2方法的访问路径为:

http://localhost:7007/hi2?name=busho&&pass=123

在这里插入图片描述
在这里插入图片描述

总结

通过上述步骤,成功地创建了一个使用 Feign 实现的服务消费者,它能够调用服务提供者的接口,并且能够处理不同类型的参数(如查询字符串参数和请求体中的复杂对象)。这样的设置不仅简化了服务间调用的代码量,同时也提高了代码的可读性和维护性。

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

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

相关文章

YoloV10 训练自己的数据集(推理,转化,C#部署)

目录 一、下载 三、开始训练 train.py detect.py export.py 超参数都在这个路径下 四、C#读取yolov10模型进行部署推理 如下程序是用来配置openvino 配置好引用后就可以生成dll了 再创建一个控件&#xff0c;作为显示 net framework 4.8版本的 再nuget工具箱里下载 …

thinkphp6开发的通用网站系统源码

thinkphp6开发的通用网站系统源码。 基于ThinkPHP6框架开发的通用后台权限管理系统&#xff0c;底层采用国内最流行的ThinkPHP6框架&#xff0c; 支持内容管理、文章管理、用户管理、权限管理、角色管理等功能。 代码下载

Cookie和Session的对比

Cookie和Sesion 一、cookie和session创建对象 2024/9/15 10:23:59 你想了解的是如何在某种编程语言中创建和管理 cookies 和 sessions 吗&#xff1f;如果是的话&#xff0c;具体是哪个语言或框架呢&#xff1f; 2024/9/15 10:24:09 二、创建对象是客户端还是服务器 2024/…

20Kg载重30分钟续航多旋翼无人机技术详解

一、机架与结构设计 1. 材料选择&#xff1a;为了确保无人机能够承载20Kg的负载&#xff0c;同时实现30分钟的续航&#xff0c;其机架材料需选用轻质高强度的材料&#xff0c;如碳纤维或铝合金。这些材料不仅具有良好的承重能力&#xff0c;还能有效减轻无人机的整体重量&…

一步一步搭建AI智能体应用

您可以在百炼控制台以零代码的方式快速创建智能体应用&#xff0c;并将RAG&#xff08;Retrieval-Augmented Generation&#xff0c;检索增强生成&#xff09;以及插件能力集成进来。应用创建完成后&#xff0c;您可以通过控制台或API的方式来使用。 以下均以 大模型应用指代 智…

微信小程序使用 ==== 粘性布局

目录 Chrome杀了个回马枪 position:sticky简介 你可能不知道的position:sticky 深入理解粘性定位的计算规则 粘性定位其他特征 代码实现 微信小程序在scroll-view中使用sticky Chrome杀了个回马枪 position:sticky早有耳闻也有所了解&#xff0c;后来&#xff0c;Chro…

通过API接口获取下来的数据需要怎样应用?

在当今数字化时代&#xff0c;通过API接口获取数据已成为企业获取、处理和分析信息的重要手段。API接口不仅能够提高数据交互的效率&#xff0c;还能促进数据的安全性和灵活性。以下是如何将通过API接口获取的数据有效应用的一些方法和策略。 数据整合与分析 企业可以通过API接…

QPS和TPS的区别简单理解

QPS&#xff08;Queries Per Second&#xff09; QPS是指每秒查询率&#xff0c;它是衡量服务器处理能力的一个指标&#xff0c;表示服务器在一秒钟内能够响应的查询次数。这个指标通常用于数据库或服务器的性能测试&#xff0c;反映了服务器在规定时间内处理流量的能力。QPS …

浮动元素详解

浮动元素 代码实现&#xff1a; <!DOCTYPE html> <html><head><meta charset"utf-8"><title>浮动元素</title><style>#container1 {width: 400px;height: 50px;background-color: lightgrey;border: 1px solid;}#contai…

世界杯足球赛网站---附源码73185

摘 要 随着互联网的普及和足球运动的全球性影响力&#xff0c;建立一个专门的世界杯足球赛网站成为了与球迷互动和传播赛事信息的重要途径。本论文聚焦于世界杯足球赛网站的设计与实现&#xff0c;旨在探讨如何利用现代技术为球迷提供一个全方位的足球赛事体验。 通过对 Spring…

上传头像,访问本地图片

文件大坑&#xff1a; web项目&#xff1a;首先不能直接访问本地资源&#xff0c;只能够访问服务器上的资源。 所以我想就储存数据到服务器&#xff0c;但是这样有个问题就是&#xff0c;当重新启动程序时&#xff0c;服务器上的所有文件会被重新编译&#xff0c;导致之前的文…

HarmonyOS开发实战( Beta5.0)自动生成动态路由实践

鸿蒙HarmonyOS开发往期必看&#xff1a; HarmonyOS NEXT应用开发性能实践总结 最新版&#xff01;“非常详细的” 鸿蒙HarmonyOS Next应用开发学习路线&#xff01;&#xff08;从零基础入门到精通&#xff09; 介绍 本示例将介绍如何使用装饰器和插件&#xff0c;自动生成动…

【UE5】使用2DFlipbook图作为体积纹理,实现实时绘制体积纹理

这是一篇对“Creating a Volumetric Ray Marcher-Shader Bits”的学习心得 文章时间很早&#xff0c;因此这里针对UE5对原文做出兼容性修正&#xff08;为避免累赘不做出注明。链接如上&#xff0c;有需要自行学习&#xff09; 以及最后对Custom做可能的蓝图移植&#xff0c;做…

Qt中样式表常用的属性名称定义

Qt中&#xff0c;用好样式表&#xff0c;不但可以做出意想不到的酷炫效果&#xff0c;有时候也能减轻开发量&#xff0c;可能由于你不了解某些样式使用&#xff0c;想破脑袋通过代码实现的效果&#xff0c;反倒不如别人用样式&#xff0c;一两句样式脚本就搞定。 Qt中&#xff…

第T8周:猫狗识别

本文为365天深度学习训练营 中的学习记录博客原作者&#xff1a;K同学啊 ●难度&#xff1a;夯实基础⭐⭐ ●语言&#xff1a;Python3、TensorFlow2 要求&#xff1a; 1.了解model.train_on_batch()并运用 2.了解tqdm&#xff0c;并使用tqdm实现可视化进度条 拔高&#xff08…

Day11-K8S日志收集及搭建高可用的kubernetes集群实战案例

Day11-K8S日志收集及搭建高可用的kubernetes集群实战案例 0、昨日内容回顾1、日志收集1.1 K8S日志收集项目之架构图解三种方案1.2 部署ES1.3 部署kibana1.4 部署filebeat 2、监控系统2.1 部署prometheus 3、K8S二进制部署3.1 K8S二进制部署准备环境3.2 基础组件安装3.3 生成K8S…

OpenCV-Python笔记(上)

安装 全局安装 pip install opencv-python项目虚拟环境安装 # 进入项目根路径执行 .venv/bin/pip install opencv-python计算机眼中的图像 一张图片由大小比如&#xff08;100*100&#xff09;决定&#xff0c;说明存在100*100的像素点&#xff0c;每个像素点存在颜色通道&…

Science:学术大咖揭秘审稿内幕,你的稿件在审稿人那里经历了什么?

我是娜姐 迪娜学姐 &#xff0c;一个SCI医学期刊编辑&#xff0c;探索用AI工具提效论文写作和发表。 同行评审是每篇论文能够顺利发表的必经之路。Science期刊采访了来自全球各领域研究人员&#xff0c;分享关于他们作为审稿人&#xff0c;为什么接受审稿、给出审稿意见的依据、…

怎么让手机ip地址变化?介绍几种实用方法

随着网络技术的发展&#xff0c;IP地址作为网络设备的唯一标识&#xff0c;其变动对于保护个人隐私、规避网络限制等方面具有重要意义。本文将介绍几种实用的方法&#xff0c;帮助用户实现手机IP地址的变化&#xff0c;并提醒注意事项。 一、连接不同的WiFi网络‌ 连接不同的W…

记一次实战中对fastjson waf的绕过

最近遇到一个fastjson的站&#xff0c;很明显是有fastjson漏洞的&#xff0c;因为type这种字符&#xff0c;fastjson特征很明显的字符都被过滤了 于是开始了绕过之旅&#xff0c;顺便来学习一下如何waf 编码绕过 去网上搜索还是有绕过waf的文章&#xff0c;下面来分析一手&a…