IDEA搭建Finchley.SR2版本的SpringCloud父子基础项目-------Feign负载均衡

news2025/1/14 1:10:12

1.概述

官网:http://projects.spring.io/spring-cloud/spring-cloud.html#spring-cloud-feign

Feign是一个声明式WebService客户端。使用Feign能让编写Web Service客户端更加简单, 它的使用方法是定义一个接口,然后在上面添加注解,同时也支持JAX-RS标准的注解。Feign也支持可拔插式的编码器和解码器。Spring Cloud对Feign进行了封装,使其支持了Spring MVC标准注解和HttpMessageConverters。Feign可以与Eureka和Ribbon组合使用以支持负载均衡。

Feign是一个声明式的Web服务客户端,使得编写Web服务客户端变得非常容易,
只需要创建一个接口,然后在上面添加注解即可。
参考官网:https://github.com/OpenFeign/feign
在这里插入图片描述

1.1 Feign能干什么

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

1.2 Feign集成了Ribbon

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

1.3操作

1.1新建工程consumer-pay-feign

<?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">
	<parent>
		<artifactId>PayUtilsMode</artifactId>
		<groupId>com.xql</groupId>
		<version>1.0-SNAPSHOT</version>
	</parent>
	<modelVersion>4.0.0</modelVersion>

	<artifactId>consumer-pay-feign</artifactId>
	<description>支付微服务消费者</description>


	<dependencies>
		<dependency><!-- 引入自己定义的api通用包,可以使用Entity -->
			<groupId>com.xql</groupId>
			<artifactId>pay-api</artifactId>
			<version>${api.version}</version>
		</dependency>
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-web</artifactId>
		</dependency>
		<!-- 修改后立即生效,热部署 -->
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>springloaded</artifactId>
			<version>${springloaded.version}</version>
		</dependency>
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-devtools</artifactId>
		</dependency>
		<dependency>
			<groupId>com.alibaba</groupId>
			<artifactId>fastjson</artifactId>
			<version>${fastjson.version}</version>
		</dependency>
		<!-- Ribbon相关 -->
		<dependency>
			<groupId>org.springframework.cloud</groupId>
			<artifactId>spring-cloud-starter-eureka</artifactId>
			<version>${ribbo.version}</version>
		</dependency>

		<dependency>
			<groupId>org.springframework.cloud</groupId>
			<artifactId>spring-cloud-starter-config</artifactId>
		</dependency>

		<dependency>
			<groupId>org.springframework.cloud</groupId>
			<artifactId>spring-cloud-starter-feign</artifactId>
			<version>${feign.version}</version>
		</dependency>
	</dependencies>
</project>
package com.xql.consumer;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
import org.springframework.cloud.openfeign.EnableFeignClients;
import org.springframework.context.annotation.ComponentScan;

@SpringBootApplication(exclude = DataSourceAutoConfiguration.class)
@EnableEurekaClient
@EnableFeignClients(basePackages= {"com.xql.api"})
@ComponentScan(value = {"com.xql.api","com.xql.consumer.controller"})
public class ConsumerPayFeignApplication {

	public static void main(String[] args) {
		SpringApplication.run(ConsumerPayFeignApplication.class, args);
	}

}



#改端口号
server.port= 8002

#配置json日期出入格式
spring.mvc.date-format= yyyy-MM-dd HH:mm:ss
spring.jackson.date-format= yyyy-MM-dd HH:mm:ss
spring.jackson.time-zone= GMT+8

#false表示自己端就是注册中心,我的职责就是维护服务实例,并不需要去检索服务
eureka.client.register-with-eureka=false

eureka.client.service-url.defaultZone=http://eureka7001.com:7001/eureka/,http://eureka7002.com:7002/eureka/,http://eureka7003.com:7003/eureka/

package com.xql.consumer.controller;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.xql.api.model.DTO.TestDto;
import com.xql.api.model.Orders;
import com.xql.api.service.DeptClientService;
import com.xql.model.Vo.PageVO;
import com.xql.model.Vo.ResultVO;
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 org.springframework.web.client.RestTemplate;


/**
 * @author 许清磊
 * @version 1.0
 * @ClassName ConsumerPayController
 * @description: TODO
 * @date 2021/12/7 10:03
 */

@RestController
public class ConsumerPayController
{
//    private static final String REST_URL_PREFIX = "http://localhost:8001";
    @Autowired
    private DeptClientService service = null;


    @RequestMapping(value="/consumer/pay/add")
    public boolean add(Orders orders)
    {
        return service.add(orders);
    }

    @RequestMapping(value="/consumer/pay/get/{id}")
    public Orders get(@PathVariable("id") String id)
    {
        return service.get(id);
    }

    @SuppressWarnings("unchecked")
    @RequestMapping(value="/consumer/pay/list")
    public JSONObject list()
    {

        return service.list2();
    }
}





在pay-api模块新增

package com.xql.api.service;

import com.alibaba.fastjson.JSONObject;
import com.xql.api.model.DTO.TestDto;
import com.xql.api.model.Orders;
import com.xql.model.Vo.PageVO;
import com.xql.model.Vo.ResultVO;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;



@FeignClient(value = "PROVIDER-PAY")
public interface DeptClientService {

  @RequestMapping(value="/pay/add",method= RequestMethod.POST)
  public boolean add(@RequestBody Orders orders);

  @RequestMapping(value="/pay/get/{id}",method= RequestMethod.GET)
  public Orders get(@PathVariable("id") String id);

  @RequestMapping(value="/pay/list",method= RequestMethod.GET)
  public ResultVO<PageVO<Orders>> list();

  @RequestMapping(value="/pay/list2",method= RequestMethod.GET)
  public JSONObject list2();

}


pom新增坐标

        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-feign</artifactId>
            <version>${feign.version}</version>
        </dependency>

重新把api模块 clean install

1.4 重启项目测试

Feign通过接口的方法调用Rest服务(之前是Ribbon+RestTemplate),
该请求发送给Eureka服务器(http://PROVIDER-PAY/consumer/pay/list2),
通过Feign直接找到服务接口,由于在进行服务调用的时候融合了Ribbon技术,所以也支持负载均衡作用。

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

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

相关文章

[Linux]进程地址空间

&#x1f941;作者&#xff1a; 华丞臧. &#x1f4d5;​​​​专栏&#xff1a;【LINUX】 各位读者老爷如果觉得博主写的不错&#xff0c;请诸位多多支持(点赞收藏关注)。如果有错误的地方&#xff0c;欢迎在评论区指出。 推荐一款刷题网站 &#x1f449; LeetCode刷题网站 文…

谁你的财神 谁是你的穷神

送穷神&#xff0c;迎灶神&#xff0c;下午提前准备迎接财神 我们说一个人穷&#xff0c;揭不开锅了&#xff0c;只能喝凉水了&#xff0c;到后来只能喝西北风 谁是我们的财神&#xff0c;信任我们的人&#xff0c;帮助我们的人&#xff0c;感谢过往贵人的资助 但是信任是不对…

【数据结构】算法复杂度

文章目录引入算法复杂度一.时间复杂度定义大O渐进表示法经典例题常量字符串二分查找冒泡排序递归1.阶乘2.斐波切纳数列二.空间复杂度定义经典例题冒泡排序递归1.阶乘2.斐波切纳数列引入 为什么要有算法复杂度&#xff1f; 当我们正在解决一个问题的时候&#xff0c;想出了多种思…

【计算机基础】操作系统

前言&#xff1a;本文适合用于基础了解和背诵&#xff0c;尽可能采用流畅且简短的语言回答操作系统相关问题并且辅以图片帮助记忆&#xff0c;不适合用作详细了解与深入学习 。 总述 操作系统部分主要分为以下几个重点 —— 操作系统基础 、 进程和线程、操作系统的内存管理、…

JAVA基础知识07常用API

目录 1. 常用API 1.1 简介 1.2 String类 1.2.1 字符串在开发中的应用场景 1.2.2 String 类的特点 1.2.3 String 类的常见构造方法 1.2.4 String 类的常见面试题 1.2.5 面试题题解 1.2.6 String 类用于比较的方法 1.2.7 String 字符串的遍历 1.2.8 String 字符串的截取…

QByteArray字节流和二进制与字符的关系以及tohex() toLatin1

QByteArray 存储的是字节&#xff0c;二进制形式&#xff0c;即ascii码的二进制编码。输出的时候&#xff0c;会输出二进制对应的字符 即一个映射: 二进制到ascii码的映射而.tohex()会将二进制转化为16进制字符&#xff0c;这里的16进制字符又是作为值域了&#xff0c;实际存…

JavaEE-文件和IO(二)

目录2.2 文件内容相关的操作三、文件操作案例3.1 案例一3.2 案例二3.3 案例三2.2 文件内容相关的操作 打开文件读文件写文件关闭文件 针对文件内容的读写&#xff0c;java标准库提供了一组类~ 首先按照文件的内容&#xff0c;分为两个系列 字节流对象&#xff0c;针对二进制…

手把手教你写web全栈入门项目—React+Koa+MongoDB(3w字教程,真的很详细,有代码)

手把手教你写web全栈入门项目—ReactKoaMongoDB 文章目录手把手教你写web全栈入门项目—ReactKoaMongoDB前言一、推荐基础二、所需环境三、软件四、项目源码五、文章结构六、遇到问题怎么办前端一、页面登录页首页二、目录结构三、技术选择四、开始项目1、页面组件1.1 目录1.2 …

JavaScript 所见所得文本编辑器 Froala Editor 4.0.17Crack

Froala Editor v4.0.17 清除格式工具现在可以从粘贴的内容中删除内联样式。 2023 年 1 月 24 日 - 9:07新版本 特征 清除格式工具现在可以从粘贴的内容中删除内联样式。 改进的“删除时保留格式”功能可保留已删除文本的格式并将其应用于替换文本。 选择图像时&#xff0c;用于…

day20|77. 组合。回溯的开始

回溯思路 void backtracking(参数) {if (终止条件) {存放结果;return;}for (选择&#xff1a;本层集合中元素&#xff08;树中节点孩子的数量就是集合的大小&#xff09;) {处理节点;backtracking(路径&#xff0c;选择列表); // 递归回溯&#xff0c;撤销处理结果} } 77. 组合…

91.使用注意力机制的seq2seq以及代码实现

1. 动机 2. 加入注意力 key和value是一样的 假设英语句子长为3的话&#xff0c;就会有3个key-value pair&#xff0c;key和vlaue是一个东西&#xff0c;每一个key-value pair对应第i个词的RNN的输出。之前的seq2seq只使用了最后的key-value&#xff0c;现在则是把所有的key-val…

JavaWeb语法八:网络原理初识

目录 1.局域网与广域网 1.1&#xff1a;局域网 1.2&#xff1a;广域网 2&#xff1a;网络基础知识 3.协议分层 3.1&#xff1a;分层的好处 3.2&#xff1a;TCP/IP五层&#xff08;或四层&#xff09;模式 4&#xff1a;封装和分用 4.1&#xff1a;封装 4.2&#xff1…

MyBatisPlus入门简介

目录 1. 入门案例 问题导入 1.1 SpringBoot整合MyBatisPlus入门程序 2. MyBatisPlus概述 问题导入 2.1 MyBatis介绍​​​​​​​ 1. 入门案例 问题导入 MyBatisPlus环境搭建的步骤&#xff1f; 1.1 SpringBoot整合MyBatisPlus入门程序 ①&#xff1a;创建新模块&am…

P3368 【模板】树状数组 2

【模板】树状数组 2 题目描述 如题&#xff0c;已知一个数列&#xff0c;你需要进行下面两种操作&#xff1a; 将某区间每一个数加上 xxx&#xff1b; 求出某一个数的值。 输入格式 第一行包含两个整数 NNN、MMM&#xff0c;分别表示该数列数字的个数和操作的总个数。 第…

[Ext JS] Grid Summary(汇总行)特性

Ext.grid.feature.Summary 是 Grid 的feature之一。 这个特性会在表格的最下方多一行汇总。 汇总行主要包含两个部分: 值的计算效果的渲染使用后的效果如下: 定义方式 定义的步骤如下: 在grid的配置中使用features 加入 summary 的特性类型 ftype: summary在columns的每一列…

千峰学习【Ajax】总结

1.同步和异步 2.Ajax状态码 3.创建对象&#xff0c;发送请求 <script>//1.创建XHR&#xff1a; new XMLHttpRequest():var xhr new XMLHttpRequest();// console.log(xhr);//2&#xff0c;配置open(请求方式&#xff0c;请求地址&#xff0c;是否异步(默认为异步)) loc…

ESP32( IDF平台)+MAX30102 配合Pyqt上位机实现PPG波形显示与心率计算

0 引言 年前买了一个MAX30102模块&#xff0c;在家无聊做了这个demo对一些相关的知识进行学习。 主要学习的内容&#xff1a; 光体积变化描记图&#xff08;Photoplethysmogram, PPG&#xff09;测量原理学习。ESP32 IDF平台的MAX30102驱动开发&#xff0c;主要是初始化配置…

8、快捷键的使用

文章目录8、快捷键的使用8.1 常用快捷键第1组&#xff1a;通用型第2组&#xff1a;提高编写速度&#xff08;上&#xff09;第3组&#xff1a;提高编写速度&#xff08;下&#xff09;第4组&#xff1a;类结构、查找和查看源代码第5组&#xff1a;查找、替换与关闭第6组&#x…

理光M340W激光打印机加粉清零

粉盒型号&#xff1a; M340L&#xff08;如图&#xff09;&#xff1a; 加粉及清零&#xff1a; 原装粉盒不用考虑加粉了&#xff0c;原装粉盒墨粉用完后建议更换品牌代用的墨粉盒&#xff0c;品牌代用的墨粉盒直接带加粉口及清零齿轮&#xff1b; 1、加粉&#xff0c;打开加粉…

通信原理简明教程 | 物联网通信技术简介

文章目录1 物联网通信技术概述1.1 物联网通信的产生和发展1.2 物联网通信系统2 RFID技术2.1 RFID系统的组成2.2 RFID系统的工作原理2.3 RFID的典型应用3 ZigBee技术3.1 ZigBee技术的特点及应用3.2 ZigBee协议3.3 ZigBee网络的拓扑结构4 蓝牙通信技术4.1 蓝牙协议4.2 蓝牙网络连…