SpringCloud-Feign:负载均衡(基于服务端)

7.Feign:负载均衡(基于服务端)

7.1 Feign简介

Feign是一个开源的声明式HTTP客户端,它可以简化HTTP API的调用过程。Feign的设计目标是使得使用者可以像调用本地方法一样调用远程服务,使得编写和维护HTTP客户端变得更加简单类似controller调用serviceSpringCloud集成了Ribbon和Eureka,可以使用Feigin提供负载均衡的http客户端

只需要创建一个接口,然后添加注解即可~
使用Feign时,需要先定义一个接口,该接口中定义了需要远程调用的方法、URL、请求方法、请求头等信息。然后通过使用Feign注解来配置接口的具体实现,包括URL模板、请求方法、请求参数等。通过这种方式,Feign会自动处理接口方法的参数和返回值,并将其转化为HTTP请求发送到远程服务

Feign,主要是社区版,大家都习惯面向接口编程。这个是很多开发人员的规范。调用微服务访问两种方法

  1. 微服务名字 【ribbon】
  2. 接口和注解 【feign】

Feign能干什么?

  • Feign旨在使编写Java Http客户端变得更容易
  • 前面在使用Ribbon + RestTemplate时,利用RestTemplate对Http请求的封装处理,形成了一套模板化的调用方法。但是在实际开发中,由于对服务依赖的调用可能不止一处往往一个接口会被多处调用,所以通常都会针对每个微服务自行封装一个客户端类来包装这些依赖服务的调用。所以,Feign在此基础上做了进一步的封装,由他来帮助我们定义和实现依赖服务接口的定义,在Feign的实现下,我们只需要创建一个接口并使用注解的方式来配置它 (类似以前Dao接口上标注Mapper注解,现在是一个微服务接口上面标注一个Feign注解),即可完成对服务提供方的接口绑定,简化了使用Spring Cloud Ribbon 时,自动封装服务调用客户端的开发量。

Feign默认集成了Ribbon

  • 利用Ribbon维护了MicroServiceCloud-Dept的服务列表信息,并且通过轮询实现了客户端的负载均衡,而与Ribbon不同的是,通过Feign只需要定义服务绑定接口且以声明式的方法,优雅而简单的实现了服务调用。

7.2 Feign的使用步骤

1.创建springcloud-consumer-fdept-feign模块 : 拷贝springcloud-consumer-dept-80模块下的pom.xml,resource,以及java代码到springcloud-consumer-feign模块,并添加feign依赖

在这里插入图片描述

在这里插入图片描述

<!--Feign的依赖-->
<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-feign</artifactId><version>1.4.6.RELEASE</version>
</dependency>

springcloud-api模块和Feign模块都添加此依赖

2.修改springcloud-api模块

在这里插入图片描述

在这里插入图片描述

package com.kdz.springcloud.service;import com.kdz.springcloud.pojo.Dept;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;import java.util.List;
// @FeignClient:微服务客户端注解,value:指定微服务的名字,这样就可以使Feign客户端直接找到对应的微服务,就可以直接远程通信调用
@FeignClient(value = "SPRINGCLOUD-PROVIDER-DEPT")
public interface DeptClientService {@GetMapping("/dept/get/{id}")public Dept queryById(@PathVariable("id") Long id);@GetMapping("/dept/list")public List<Dept> queryAll();@GetMapping("/dept/add")public Dept addDept(Dept dept);}

3.修改DeptConsumerController.java:使用接口的形式

在这里插入图片描述

package com.kdz.springcloud.controller;import com.kdz.springcloud.pojo.Dept;
import com.kdz.springcloud.service.DeptClientService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;import java.util.List;@RestController
public class DeptConsumerController {@Autowiredprivate DeptClientService deptClientService =null;/*** 消费方添加部门信息* @param dept* @return*/@RequestMapping("/consumer/dept/add")public Dept add(Dept dept) {return deptClientService.addDept(dept);}/*** 消费方根据id查询部门信息* @param id* @return*/@RequestMapping("/consumer/dept/get/{id}")public Dept get(@PathVariable("id") Long id) {return deptClientService.queryById(id);}/*** 消费方查询部门信息列表* @return*/@RequestMapping("/consumer/dept/list")public List<Dept> list() {return deptClientService.queryAll();}}

之前的DeptConsumerController.java:使用http-Resttemplate

@RestController
public class DeptConsumerController {/*** 理解:消费者,不应该有service层~* RestTemplate .... 供我们直接调用就可以了! 注册到Spring中* (地址:url, 实体:Map ,Class<T> responseType)* <p>* 提供多种便捷访问远程http服务的方法,简单的Restful服务模板~*/@Autowiredprivate RestTemplate restTemplate;/*** 服务提供方地址前缀* <p>* Ribbon:我们这里的地址,应该是一个变量,通过服务名来访问*/
//    private static final String REST_URL_PREFIX = "http://localhost:8001";private static final String REST_URL_PREFIX = "http://SPRINGCLOUD-PROVIDER-DEPT";/*** 消费方添加部门信息* @param dept* @return*/@RequestMapping("/consumer/dept/add")public boolean add(Dept dept) {// postForObject(服务提供方地址(接口),参数实体,返回类型.class)return restTemplate.postForObject(REST_URL_PREFIX + "/dept/add", dept, Boolean.class);}/*** 消费方根据id查询部门信息* @param id* @return*/@RequestMapping("/consumer/dept/get/{id}")public Dept get(@PathVariable("id") Long id) {// getForObject(服务提供方地址(接口),返回类型.class)return restTemplate.getForObject(REST_URL_PREFIX + "/dept/get/" + id, Dept.class);}/*** 消费方查询部门信息列表* @return*/@RequestMapping("/consumer/dept/list")public List<Dept> list() {return restTemplate.getForObject(REST_URL_PREFIX + "/dept/list", List.class);}
}

4.启动类配置Feign,扫描到之前的注解配置

EnableFeignClients直接扫到springcloud-api的com.kdz.springcloud下的注解绑定的接口

在这里插入图片描述

理解:本质上,Feign集成了Ribben,通过Ribben实现负载均衡,通过Feign实现远程进程调用,和使用@reference注解的方式类似另一种方式是使用http-Restful实现远程通信调用

Feign和Ribbon二者对比,前者显现出面向接口编程特点,代码看起来更清爽,而且Feign调用方式更符合我们之前在做SSM或者SprngBoot项目时,Controller层调用Service层的编程习惯!

@SpringBootApplication
@EnableEurekaClient
// feign客户端注解,并指定要扫描的包以及配置接口DeptClientService
@EnableFeignClients(basePackages = {"com.haust.springcloud"})
// 切记不要加这个注解,不然会出现404访问不到
//@ComponentScan("com.haust.springcloud")
public class FeignDeptConsumer_80 {public static void main(String[] args) {SpringApplication.run(FeignDeptConsumer_80.class, args);}
}

4.测试效果:

启动7001、8001、8002、feign

在这里插入图片描述

在这里插入图片描述

7.3 Feign和Ribbon如何选择?

根据个人习惯而定,如果喜欢REST风格使用Ribbon;如果喜欢社区版的面向接口风格使用Feign.

Feign 本质上也是实现了 Ribbon,只不过后者是在调用方式上,为了满足一些开发者习惯的接口调用习惯!

下面我们关闭springcloud-consumer-dept-80 这个服务消费方,换用springcloud-consumer-dept-feign(端口还是80) 来代替:(依然可以正常访问,就是调用方式相比于Ribbon变化了)

7.4使用注意事项

在使用Feign时,有一些注意事项需要注意:

  • 使用Feign时需要先引入相关的依赖,如Spring Cloud Feign。

  • Feign的配置过程较为复杂,需要设置一些参数,如连接超时时间、请求重试策略等。

  • 在定义接口时,需要注意正确的URL模板和请求方法,调用的时候也要注意与配置的接口信息一致。

  • Feign默认使用的是SpringEncoder和SpringDecoder,会对请求和响应进行编码和解码,需要根据具体情况进行调整。

  • 对于需要进行身份认证的接口,需要配置相应的认证信息。

SpringCloud-Feign:负载均衡(基于服务端) 到此完结,笔者归纳、创作不易,大佬们给个3连再起飞吧

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

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

相关文章

2045第六题 拯救花园 (flowers)

题目大意&#xff1a; 有n只兔子&#xff0c;每只兔子抓回去的时间为ti,回来的时间也是ti,则抓一只兔子要2*ti的时间&#xff0c;di则为每只兔子一个时间单位能吃多少草&#xff0c;用最优方法做的话它们一共吃了多少草&#xff08;最少&#xff09; 贪心标准&#xff1a; 我们…

Python获取当前项目路径

在Python中&#xff0c;你可以使用os模块来获取当前Python脚本所在的项目目录。下面是一种常见的方法&#xff1a; import os# 获取当前脚本文件的绝对路径 script_path os.path.abspath(__file__)# 获取当前脚本文件所在的目录 project_dir os.path.dirname(script_path)pr…

[深度学习] 卷积神经网络“卷“在哪里?

​ &#x1f308; 博客个人主页&#xff1a;Chris在Coding &#x1f3a5; 本文所属专栏&#xff1a;[深度学习] ❤️ 热门学习专栏&#xff1a;[Linux学习] ⏰ 我们仍在旅途 目录 1.卷积的定义 2.卷积的"卷"在哪里 3.什么又是卷积神…

C++学习Day06之多继承基本语法

目录 一、程序及输出二、分析与总结 一、程序及输出 多继承的基本语法如下&#xff1a; class Base1 { // Base1 class definition }; class Base2 { // Base2 class definition }; class Derived : public Base1, protected Base2 { // Derived class definition }; #include…

前端页面渲染方式 csr、ssr、ssg 总结于对比

我们经常用的普通的网页应用使用的是 csr ,就是客户端渲染&#xff0c;这种渲染方式不利于seo搜索引擎优化&#xff0c;所以有的时候我们选择服务端渲染&#xff0c;就是适用 nuxt、next等服务端渲染框架&#xff0c;一般做官网我们就适用服务端渲染&#xff0c; 但是除了这两…

树莓派学习路径

学习树莓派和硬件对接的知识对于物联网项目来说是非常有价值的&#xff0c;因为树莓派提供了强大的计算能力和灵活的接口&#xff0c;可以轻松连接多种传感器和其他硬件设备。 学习树莓派和硬件对接的必要性&#xff1a; 1. **物联网项目的核心**&#xff1a;物…

OpenAI划时代大模型——文本生成视频模型Sora作品欣赏(一)

Sora介绍 Sora是一个能以文本描述生成视频的人工智能模型&#xff0c;由美国人工智能研究机构OpenAI开发。 Sora这一名称源于日文“空”&#xff08;そら sora&#xff09;&#xff0c;即天空之意&#xff0c;以示其无限的创造潜力。其背后的技术是在OpenAI的文本到图像生成模…

MySQL-锁(LOCK)

文章目录 1. 锁是什么&#xff1f;2. 全局锁2.1 相关语法2.2 特点 3. 表级锁3.1 表锁3.1.1 共享读锁&#xff08;S&#xff09;3.1.2 排它写锁&#xff08;X&#xff09; 3.2 元数据锁&#xff08;MDL&#xff09;3.2 意向锁&#xff08;IS、IX&#xff09; 4. 行级锁4.1 行锁 …

Python学习(16)|列表_遍历_排序_max_min_sum

列表的遍历&#xff1a; a [10,20,30,40] for obj in a: #obj 是临时变量名称&#xff0c;随意起名print(obj) 执行结果&#xff1a; 复制列表所有的元素到新列表对象&#xff1a; list1 [30,40,50] list2 list1 #只是将list2也指向了列表对象。也就是说list…

Linux常见头文件详解与使用

在Linux编程中&#xff0c;头文件扮演着引入库函数、定义常量、声明数据结构等重要角色。本篇博客将介绍一些常见的Linux头文件&#xff0c;对其进行分类和详细说明&#xff0c;并通过实例展示其使用方法。 一、标准头文件 1. <assert.h> 用于验证程序断言。 示例&am…

Springboot返回给前端的日期变成时间戳问题处理

问题&#xff1a; 解决方案 在对应的Entity类中&#xff0c;给对应属性添加JsonFormat​注解 ​JsonFormat​注解用于将Date日期格式化为指定格式的字符串。由于在序列化时间时是按照国际标准时间GMT进行格式化的&#xff0c;最后接受到的数据会早8个小时&#xff0c;所以应该…

CF778A String Game 题解

文章目录 CF778A String Game 题解题面翻译Input DataOutput DataInput Sample 1Output Sample 1题目描述输入格式输出格式样例 #1样例输入 #1样例输出 #1 样例 #2样例输入 #2样例输出 #2 提示算法&#xff1a;二分代码&#xff1a; CF778A String Game 题解 link 题面翻译 …

SpringCloud微服务调用丢失请求头

在 Spring Cloud 中 微服务之间的调用会用到Feign&#xff0c;但是在默认情况下&#xff0c;Feign 调用远程服务存在Header请求头丢失问题。但基本上每个服务都会有一个全局globalId&#xff0c;能够清除调用链路&#xff0c;可以有两种解决方案 解决方案一 可以在每次远程调…

Git 分支跟踪There is no tracking information for the current branch.

当你执行在develop分支上git pull 返回提示&#xff1a; There is no tracking information for the current branch. Please specify which branch you want to merge with. See git-pull(1) for details.git pull <remote> <branch>If you wish to set tracking…

【白嫖8k买的机构vip教程】安卓设备连接电脑进行adb命令操作

Android 真机进行adb 命令的操作&#xff1a; 连接方式 &#xff1a; 数据线连接&#xff1a; 1&#xff09;手机需通过数据线连接电脑&#xff1b; 2&#xff09;手机调出开发者选项&#xff1b;手机操作步骤&#xff1a;设置——系统——关于手机&#xff08;平板电脑&am…

CDN缓存有什么作用?

CDN缓存是内容分发网络的核心技术之一&#xff0c;它的作用在于通过将内容缓存在边缘服务器上&#xff0c;提高内容的访问速度和可用性。以下是CDN缓存的几个主要作用&#xff1a; 加速内容的访问速度 CDN缓存通过将内容缓存在距离用户更近的边缘服务器上&#xff0c;减少了内…

【办公类-16-07-02】“2023下学期 周计划-户外游戏 每班1周五天相同场地,6周一次循环”(python 排班表系列)

背景需求&#xff1a; 又到了开学季&#xff0c;新的自主游戏&#xff08;户外游戏&#xff09;安排表出炉了。 这张是贴在美术活动室的安排表&#xff0c;我需要转换成班级为单位的安排表&#xff0c;便于批量制作周计划。 设计思路&#xff1a; 1、一个班级每周轮到的一个场…

电商+支付双系统项目------怎么用代码实现支付系统?

前言 上篇文章讲了我们应该怎么设计支付系统&#xff0c;构建了一个支付系统的蓝图&#xff0c;这篇文章我来讲一下怎么用代码来设计支付系统。当然&#xff0c;我肯定不是手把手的教你哈哈哈&#xff0c;我只是把支付系统的核心的部分展示给大家看&#xff0c;让大家了解一下…

C 语言 devc++ 使用 winsock 实现 windows UDP 利用 IP 进行局域网发送消息

UDP 通信流程_udp通信过程-CSDN博客参考来源 UDP 通信流程_udp通信过程-CSDN博客 这里移植到windows 上 &#xff0c;使用 devc 开发。 服务端代码 #include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <string.h> #include <…

【python】深入探索使用Matplotlib中的plt.legend()添加图例

当我们绘制复杂的图表&#xff0c;尤其是包含多个数据系列的图表时&#xff0c;一个清晰、易读的图例是至关重要的。plt.legend()函数是Matplotlib库中用于添加和定制图例的关键工具。在本篇博文中&#xff0c;我们将深入探讨plt.legend()的功能、用法以及如何通过它提升图表的…