【SpringCloud】SpringCloud详解之Feign实战

news2024/12/24 2:09:48

目录

  • 前言
  • SpringCloud Feign远程服务调用
    • 一.需求
    • 二.两个服务的yml配置和访问路径
    • 三.使用RestTemplate远程调用(order服务内编写)
    • 四.使用Feign远程调用(order服务内配置)
    • 五.自定义Feign配置(order服务内配置)
    • 六.Feign配置日志(oder服务内配置)
    • 七.Feign调优(order服务内配置)
    • 八.抽离Feign

前言

微服务分解成多个不同的服务,那么多个服务之间怎么调用呢?(想要微服务项目点赞收藏评论找我拿)
SpringCloud组件原理和面试题

SpringCloud Feign远程服务调用

一.需求

现在有两个服务,订单服务和用户服务,分别对应不同的数据库。
在 查询订单的时候,把所属的用户信息一起查出来。
在这里插入图片描述

二.两个服务的yml配置和访问路径

用两个不同的数据库,模拟部署在两台服务器的数据库

订单yml配置   访问路径:@GetMapping("order/{orderId}")
server:
  port: 8082
spring:
  datasource:
    url: jdbc:mysql://localhost:3306/cloud_order?useSSL=false
    username: root
    password: root
    driver-class-name: com.mysql.jdbc.Driver
  application:
    name: orderservice //订单服务的名称


用户yml配置  访问路径:@GetMapping("user/{id}")
server:
  port: 8081
spring:
  datasource:
    url: jdbc:mysql://localhost:3306/cloud_user?useSSL=false
    username: root
    password: root
    driver-class-name: com.mysql.jdbc.Driver
  application:
    name: userservice //用户服务的名称

三.使用RestTemplate远程调用(order服务内编写)

(1) 注入RestTemplate

	/**
	 * 因为启动类本身也是一个配置了,所以我们在启动类进行注入,你自己自定义配置类注入也行
     * 创建RestTemplate并注入Spring容器
     */
    @Bean
    @LoadBalanced
    public RestTemplate restTemplate() {
        return new RestTemplate();
    }

(2) 编写远程调用


	@Autowired
    private RestTemplate restTemplate;

    public Order queryOrderById(Long orderId) {
        // 根据订单id查询订单
        Order order = orderMapper.findById(orderId);
        // 利用RestTemplate发起http请求,根据用户id查询用户
        // url路径  http://服务名称(上面配置了)/请求路径/参数
        String url = "http://userservice/user/" + order.getUserId();
        // 发送http请求,实现远程调用,现在是get请求类型
        User user = restTemplate.getForObject(url, User.class);
        // 封装user到Order
        order.setUser(user);
        // 返回值
        return order;
    }

(3) RestTemplate的缺点

  • 参数复杂URL难以维护。
  • 不符合正常接口调用的格式。

四.使用Feign远程调用(order服务内配置)

(1) 引入依赖

		<!--feign客户端依赖-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-openfeign</artifactId>
        </dependency>

(2) 在启动类使用注解开启Feign功能

@SpringBootApplication
@EnableFeignClients
public class OrderApplication {
}

(3) 编写远程调用(在order项目内编写)

//服务名称
@FeignClient(value = "userservice")
public interface UserClient {

    @GetMapping("/user/{id}")
    User findById(@PathVariable("id") Long id);
    
}

(4) 调用接口


    @Autowired
    private UserClient userClient;

    public Order queryOrderById(Long orderId) {
        // 根据订单id查询订单
        Order order = orderMapper.findById(orderId);
        // 用Feign远程调用
        User user = userClient.findById(order.getUserId());
        // 封装user到Order
        order.setUser(user);
        // 返回
        return order;
    }

(5) Feign还集成了Ribbon,所以我们不用考虑负载均衡问题

在这里插入图片描述

五.自定义Feign配置(order服务内配置)

类型作用说明
feign.Logger.Level修改日志级别四种不同的级别:NONE(没有任何日志)、BASIC(发起请求的开始结束时间)、HEADERS(会记录请求头请求体)、FULL(请求和响应信息)
feign.codec.Decoder响应结果的解析器http远程调用的结果做解析,例如解析json字符串为java对象
feign.codec.Encoder请求参数编码将请求参数编码,便于通过http请求发送
feign. Contract支持的注解格式默认是SpringMVC的注解
feign. Retryer失败重试机制请求失败的重试机制,默认是没有,不过会使用Ribbon的重试

一般我们自定义配置的是日志

六.Feign配置日志(oder服务内配置)

(1) 配置文件配置日志

//全局配置
feign:
	client:
		config:
			default://default全局配置,远程调用的服务的接口也会打印。
				loggerLevel:FULL //日志级别

//局部配置
feign:
	client:
		config:
			orderservice://只打印服务名为orderservice的日志。
				loggerLevel:FULL //日志级别

(2) 代码方式配置日志

//第一步:注入对象
public class DefaultFeignConfiguration {
    @Bean
    public Logger.Level logLevel(){
    	//日志级别
        return Logger.Level.BASIC;
    }
}
//第二步:注解配置

//全局配置
@EnableFeignClients(defaultConfiguration = DefaultFeignConfiguration.class)

//局部配置
@FeignClient(value = "userservice",confiquration = FeignClientConfiguration.class)

七.Feign调优(order服务内配置)

Feign底层客户端实现:

  • URLConnection:默认实现,不支持连接池。
  • Apache HttpClient: 支持连接池。
  • OKHttp:支持连接池。

(1) 使用连接池替代默认的URL Connection(使用HttpClient支持)

①pom文件引入依赖

	    <!--引入HttpClient依赖-->
        <dependency>
            <groupId>io.github.openfeign</groupId>
            <artifactId>feign-httpclient</artifactId>
        </dependency>

②yml文件进行配置

feign:
  httpclient:
    enabled: true # 支持HttpClient的开关
    max-connections: 100 # 最大连接数
    max-connections-per-route: 25 # 单个路径的最大连接数

(2) 日志级别最好是basic或none

八.抽离Feign

比如 订单、商品、库存服务都要调用用户服务,那我们都需要重复写Feign调用用户服务,这样造成了很多代码冗余,所以我们要把Feign抽离出来放在一个公共的服务里面。我们新建一个 Feign-api服务,然后谁用谁就在pom文件引入一下。

		<!--在order服务引入feign的统一api-->
        <dependency>
            <groupId>cn.xinxin.demo</groupId>
            <artifactId>feign-api</artifactId>
            <version>1.0</version>
        </dependency>

但是这样做会导致SpringBootApplication在扫描包时找不到定义FeignClient对象,那么怎么解决呢?

解决

方式一:指定FeignClient所在包
@EnableFeignClients(basePackages = "cn.xinxin.feign.clients")

方式二:指定FeignClient字节码
EnableFeignClients(clients = {UserClient.class})

Feign-api结构目录
在这里插入图片描述

Feign的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">
    <parent>
        <artifactId>cloud-demo</artifactId>
        <groupId>cn.xinxin.demo</groupId>
        <version>1.0</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>

    <artifactId>feign-api</artifactId>

    <properties>
        <maven.compiler.source>8</maven.compiler.source>
        <maven.compiler.target>8</maven.compiler.target>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-openfeign</artifactId>
        </dependency>
    </dependencies>
</project>

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

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

相关文章

STM32之 串口

串口通信串行接口简称串口&#xff0c;也称串行通信接口或串行通讯接口&#xff08;通常指COM接口&#xff09;&#xff0c;是采用串行通信方 式的扩展接口。串行接口&#xff08;Serial Interface&#xff09;是指数据一位一位地顺序传送。其特点是通信线路简 单&#xff0c;只…

Vue基础入门讲义(三)-指令

文章目录1.什么是指令&#xff1f;2.插值表达式2.1.花括号2.2.插值闪烁2.3.v-text和v-html3.v-model4.v-on4.1.基本用法4.2.事件修饰5.v-for5.1.遍历数组5.2.数组角标5.3.遍历对象6.key7.v-if和v-show7.1.基本使用7.2.与v-for结合7.3.v-else7.4.v-show8.v-bind8.1. 属性上使用v…

服务器处理发生异常:java.text.ParseException: Unparseable date

测试上传报文的时候遇见报错 服务器处理发生异常:java.text.ParseException: Unparseable date: “2023/03/03” 错误报文 实际需要的报文 错误原因 上传时间字段&#xff0c;与Date字段数据位数不匹配&#xff0c;Java类型&#xff1a;Date默认带有年月日 时分秒yyyy-mm-dd…

十年业务开发总结,如何做好高效高质量的价值交付

作者&#xff1a;杨博林 阿里大淘宝场景金融团队 软件交付是一个非常复杂的过程和体系&#xff0c;需要保障好每个阶段的质量和效率才能保障最终的质量和效率。本文将尝试从需求交付的前、中、后三个环节来阐述一下如何做高效高质量的价值交付。 一、背景 转眼间已经做了十年的…

JavaScript基础内容

日升时奋斗&#xff0c;日落时自省 目录 1、基础语法 2、DOM 2.1、选中页面元素 2.2、获取/修改元素内容 3、JS案例 3.1、网页版本猜数字 3.2、网页版表白墙 JS最初只是为了进行前端页面的开发后来JS也被赋予了更多的功能&#xff0c;可以用来开发桌面程序&#xff0c;手…

RHCSA-重置root密码(3.3)

方法1&#xff1a;rd.break &#xff08;1&#xff09;首先重启系统&#xff0c;在此页面按e键&#xff0c;在屏幕上显示内核启动参数 &#xff08;2&#xff09;知道linux这行&#xff0c;末尾空格后输入rd.break&#xff0c;然后按ctrlx &#xff08;3&#xff09;查看&#…

电脑桌面上的图标不见了怎么办?5个完美的解决技巧

案例&#xff1a;电脑桌面不显示任何东西&#xff1f; “救命&#xff01;电脑打开后&#xff0c;只有桌面&#xff0c;任何图标都没有怎么办&#xff1f;心急&#xff0c;不知道该怎么解决&#xff1f;” 电脑桌面上的图标消失是一个比较常见的问题&#xff0c;许多用户都会…

Hadoop集群启动从节点没有DataNode

目录 一、问题背景 二、解决思路 三、解决办法&#xff1a; 一、问题背景 之前启动hadoop集群的时候都没有问题&#xff0c;今天启动hadoop集群的时候&#xff0c;从节点的DataNode没有启动起来。 二、解决思路 遇见节点起不来的情况&#xff0c;可以去看看当前节点的日志…

各大加密算法对比(原理、性能、安全、运用)

原理按加密可逆可以分为&#xff1a;加密可逆算法和加密不可逆算法。加密可逆算法又可以分为&#xff1a;对称加密和非对称加密。1、加密不可逆算法&#xff1a;一般采用hash算法加密&#xff0c;其原理一般是将原文长度补位成64的倍数&#xff0c;接着初始化固定长度的缓存值&…

大数据框架之Hadoop:MapReduce(五)Yarn资源调度器

Apache YARN (Yet Another Resource Negotiator) 是 hadoop 2.0 引入的集群资源管理系统。用户可以将各种服务框架部署在 YARN 上&#xff0c;由 YARN 进行统一地管理和资源分配。 简言之&#xff0c;Yarn是一个资源调度平台&#xff0c;负责为运算程序提供服务器运算资源&…

Windows Cannot Initialize Data Bindings 问题的解决方法

前言 拿到一个调试程序, 怎么折腾都打不开, 在客户那边, 尝试了几个系统版本, 发现Windows 10 21H2 版本可以正常运行。 尝试 系统篇 系统结果公司电脑 Windows 8有问题…下载安装 Windows10 22H2问题依旧下载安装 Windows10 21H2问题依旧家里的 笔记本Window 11正常 网上…

第三章 opengl之着色器

OpenGL着色器GLSLGLSL的数据类型向量输入与输出Uniform更多属性自己的着色器类着色器 着色器是运行在GPU上的小程序。着色器只是一种把输入转化为输出的程序。着色器也是一种非常独立的程序&#xff0c;因为它们之间不能相互通信&#xff1b;它们之间唯一的沟通只有通过输入和…

DC-DC模块电源隔离直流升压高压稳压输出5v12v24v转60v100v110v150v220v250v300v400v500v

特点效率高达80%以上1*1英寸标准封装单电压输出稳压输出工作温度: -40℃~85℃阻燃封装&#xff0c;满足UL94-V0 要求温度特性好可直接焊在PCB 上应用HRB 0.2~10W 系列模块电源是一种DC-DC升压变换器。该模块电源的输入电压分为&#xff1a;4.5~9V、9~18V、及18~36VDC标准&#…

软工第二次个人作业——软件案例分析

软工第二次个人作业——软件案例分析 项目内容这个作业属于哪个课程2023北航敏捷软件工程这个作业的要求在哪里个人作业-软件案例分析我在这个课程的目标是体验敏捷开发过程&#xff0c;掌握一些开发技能&#xff0c;为进一步发展作铺垫这个作业在哪个具体方面帮助我实现目标通…

四川大学软件学院|系统级编程期末复习

概述 选择题 50 分&#xff08;原题率 80%&#xff09;&#xff1a;http://tieba.baidu.com/p/1250021454?&share9105&frsharewise&unique967707B1DAECEF4A785B61D29AF36950&st1639102957&client_type1&client_version12.10.1&sfccopy&share…

使用C语言实现简单的PNG图像读取

概述 首先&#xff0c;关于png图像的结构&#xff1a;PNG文件的结构、PNG格式的数据结构。这两篇文章说的比较细。我简单地说一下我使用到的地方&#xff1a; 注&#xff1a;①引于PNG格式的数据结构。②引于PNG文件的结构 “png文件的前8个字节为固定的文件头信息&#xff0…

Ubuntu中安装StaMPS

Ubuntu中安装StaMPS0 StaMPS简介1 首先安装好MATLAB&#xff0c;安装一些依赖工具包2 安装StaMPS2.1 下载StaMPS安装包2.2 安装2.3 配置环境2.4 matlab中的路径设置0 StaMPS简介 官网&#xff1a;https://homepages.see.leeds.ac.uk/~earahoo/stamps/ A software package to e…

水浒英雄为啥输?因为没愿景

水浒英雄为啥输&#xff1f;输在没愿景&#xff01; 宋江没学企业管理&#xff0c;太遗憾 企业文化核心三件套&#xff1a;使命愿景价值观 趣讲大白话&#xff1a;没有远见成不了大事 【安志强趣讲信息科技92期】 ******************************* 水浒英雄的使命&#xff1a;替…

HTML的表格标签和列表标签

&#x1f31f;所属专栏&#xff1a;HTML只因变凤凰之路&#x1f414;作者简介&#xff1a;rchjr——五带信管菜只因一枚&#x1f62e;前言&#xff1a;该系列将持续更新HTML的相关学习笔记&#xff0c;欢迎和我一样的小白订阅&#xff0c;一起学习共同进步~&#x1f449;文章简…

如何成为一名黑客?基础入门

如何成为一名黑客&#xff1f;基础入门 相信大家对黑客一词并不陌生&#xff0c;因为从小便受电影的熏陶&#xff0c;黑客轻易就能攻入别人的系统也让不少人都羡慕不已&#xff0c;但是真正能够成为黑客的人少之又少。很多人都是三天打鱼两天晒网&#xff0c;学习进度不明显&a…