SpringCloud学习笔记(四)

news2025/8/8 6:48:39

文章目录

  • SpringCloud学习笔记(四)
    • 1.说在前面
    • 2.OpenFeign 简介
    • 3.OpenFeign 快速入门
      • 3.1 本次调用的设计图
      • 3.2 启动一个 eureka-server 服务,这里不重复演示,参考 eureka
      • 3.3 先创建 01-order-service,选择依赖
      • 3.4 创建 02-user-consumer,选择依赖
      • 3.5需求分析以及相应代码编写
        • 3.5.1 01-order-service 创建 controller
        • 3.5.2 02-user-consumer 创建 controller和接口
      • 3.6访问测试
      • 3.7调用超时设置
    • 4.OpenFeign 调用参数处理(开发重点)
      • 4.1 说在前面
      • 4.2 修改 provider-order-service
        • 4.2.1 创建 BaseResult 类
        • 4.2.2 创建 Order 类
        • 4.2.3 创建 TestParamController 类
      • 4.3 修改 consumer-user-service
        • 4.3.1 将 Order 类和 BaseResult 类拷贝过来,后面会抽到公共模块里
        • 4.3.2 修改 UserOrderFeign 接口
        • 4.3.3 创建 TestController 类
        • 4.3.4 测试调用
        • 4.3.5 时间日期参数问题
    • 6.OpenFeign 总结
    • 7.OpenFeign 其他
      • 7.1 OpenFeign 的日志功能
        • 7.1.1 OpenFeign 的日志级别
        • 7.1.2 创建配置类
        • 7.1.3 修改配置文件

SpringCloud学习笔记(四)

1.说在前面

上 一 节 我 们 讲 到 Ribbon 做 了 负 载 均 衡 , 用 Eureka-Client 来 做 服 务 发 现 , 通 过RestTemplate 来完成服务调用,但是这都不是我们的终极方案,终极方案是使用 OpenFeign

2.OpenFeign 简介

https://docs.spring.io/spring-cloud-openfeign/docs/2.2.4.RELEASE/reference/html/#spring-cloud-feign
Feign 是声明性(注解)Web 服务客户端。它使编写 Web 服务客户端更加容易。要使用 Feign,请创建一个接口并对其进行注解。它具有可插入注解支持,包括 Feign 注解和 JAX-RS 注解。Feign 还支持可插拔编码器和解码器。Spring Cloud 添加了对 Spring MVC 注解的支持,并
支持使用 HttpMessageConverters,Spring Web 中默认使用的注解。Spring Cloud 集成了 Ribbon 和 Eureka 以及 Spring CloudLoadBalancer,以在使用 Feign 时提供负载平衡的 http 客户端。

Feign 是一个远程调用的组件 (接口,注解) http 调用的
Feign 集成了 ribbon ribbon 里面集成了 eureka

3.OpenFeign 快速入门

3.1 本次调用的设计图

在这里插入图片描述

在这里插入图片描述

3.2 启动一个 eureka-server 服务,这里不重复演示,参考 eureka

文档

3.3 先创建 01-order-service,选择依赖

在这里插入图片描述添加eureka Client依赖、lombok依赖、spring Web依赖。
修改yml配置文件
在这里插入图片描述

3.4 创建 02-user-consumer,选择依赖

添加lombok、web、eureka client、openFeign依赖。
在这里插入图片描述修改yml配置文件

server:
  port: 8081
spring:
  application:
    name: consumer-user-service
eureka:
  client:
    service-url:
      defaultZone: http://localhost:8761/eureka
  instance:
  instance-id: ${spring.application.name}:${server.port}
  prefer-ip-address: true

3.5需求分析以及相应代码编写

需求:
创建一个消费者去消费订单表的接口(也就是访问消费者接口,能够直接访问到订单的接口)

3.5.1 01-order-service 创建 controller

在这里插入图片描述OrderController

package com.jierlung.controller;

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class OrderController {


    @GetMapping("doOrder")
    public String doOrder() {
        System.out.println("有用户来下单了");
        return "下单成功";
    }
}

3.5.2 02-user-consumer 创建 controller和接口

创建接口

在这里插入图片描述UserOrderFeign

package com.jierlung.feign;

import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.GetMapping;

@FeignClient(value = "provider-order-service")
public interface UserOrderFeign {
    @GetMapping("doOrder")
    public String doOrder();

}

创建controller
在这里插入图片描述
UserController

package com.jierlung.controller;

import com.jierlung.feign.UserOrderFeign;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class UserController {

    @Autowired
    private UserOrderFeign userOrderFeign;

    @GetMapping("doUser")
    public String doOrder() {
        System.out.println("有用户进来了");
        String s = userOrderFeign.doOrder();
        return s;
    }
}

在启动类上添加注解
在这里插入图片描述

3.6访问测试

在这里插入图片描述

3.7调用超时设置

因 为 ribbon 默 认 调 用 超 时 时 长 为 1s , 可 以 修 改 , 超 时 调 整 可 以 查 看
DefaultClientConfigImpl

ribbon: #feign 默认调用 1s 超时
	ReadTimeout: 5000 # 修改调用时长为 5s
	ConnectTimeout: 5000 # 修改连接时长为 5s

4.OpenFeign 调用参数处理(开发重点)

4.1 说在前面

Feign 传参确保消费者和提供者的参数列表一致 包括返回值 方法签名要一致

  1. 通过 URL 传参数,GET 请求,参数列表使用@PathVariable(“”)
  2. 如果是 GET 请求,每个基本参数必须加@RequestParam(“”)
  3. 如果是 POST 请求,而且是对象集合等参数,必须加@Requestbody 或者@RequestParam

4.2 修改 provider-order-service

4.2.1 创建 BaseResult 类

package com.jierlung.domain;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

import java.io.Serializable;

@Data
@NoArgsConstructor
@AllArgsConstructor
public class BaseResult implements Serializable {
    private Integer code;
    private String msg;
    private Object data;

    public static BaseResult success(Integer code, String msg, Object data) {
        BaseResult baseResult = new BaseResult();
        baseResult.setCode(code);
        baseResult.setData(data);
        baseResult.setMsg(msg);
        return baseResult;
    }
}
}
}

4.2.2 创建 Order 类

package com.jierlung.domain;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

import java.io.Serializable;
import java.util.Date;

@Data
@AllArgsConstructor
@NoArgsConstructor
public class Order implements Serializable {
    private String orderSn;
    private String orderName;
    private String orderDetail;
    private Date orderTime;
    private String userId;
}

4.2.3 创建 TestParamController 类

@RestController
public class TestParamController {
/**
* 测试单个参数
*
* @param name
* @return
*/
@GetMapping("testOneParam")
public BaseResult oneParam(@RequestParam("name") String name) {
System.out.println(name);
return BaseResult.success(200, "成功", "ok");
}
/**
* 测试两个参数
*
* @param name
* @param age
* @return
*/
@PostMapping("testTwoParam")
public BaseResult twoParam(@RequestParam("name") String name,

@RequestParam("age") Integer age) {
System.out.println(name + ":" + age);
return BaseResult.success(200, "ok", "ok");
}
/**
* 测试一个对象的传参
*
* @param order
* @return
*/
@PostMapping("testObjectParam")
public BaseResult objectParam(@RequestBody Order order) {
System.out.println(order);
return BaseResult.success(200, "ok", order);
}
/**
* 测试一个对象 一个参数
*
* @param order
* @param name
* @return
*/
@PostMapping("testOneObjectOneParam")
public BaseResult oneObjectOneParam(@RequestBody Order order,
@RequestParam String name) {
System.out.println(order);
System.out.println(name);
return BaseResult.success(200, "ok", order);
}
/**
* 测试 url 传参
*
www.bjpowernode.com 13 / 29 Copyright©动力
节点
* @param id
* @return
*/
@GetMapping("testUrlParam/{id}")
public BaseResult testUrlParam(@PathVariable("id") Integer id) {
System.out.println(id);
return BaseResult.success(200, "ok", id);
}
}

4.3 修改 consumer-user-service

4.3.1 将 Order 类和 BaseResult 类拷贝过来,后面会抽到公共模块里

4.3.2 修改 UserOrderFeign 接口

package com.jierlung.feign;

import com.jierlung.domain.BaseResult;
import com.jierlung.domain.Order;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.*;

@FeignClient(value = "provider-order-service")
public interface UserOrderFeign {


    /**
     * 远程调用下单的方法
     *
     * @return
     */
    @RequestMapping("doOrder")
    String doOrder();

    /**
     * 测试单个参数
     *
     * @param name
     * @return
     */
    @GetMapping("testOneParam")
    public BaseResult oneParam(@RequestParam("name") String name);

    /**
     * 测试两个参数
     *
     * @param name
     * @param age
     * @return
     */
    @PostMapping("testTwoParam")
    public BaseResult twoParam(@RequestParam("name") String name,
                               @RequestParam("age") Integer age);

    /**
     * 测试一个对象的传参
     *
     * @param order
     * @return
     */
    @PostMapping("testObjectParam")
    public BaseResult objectParam(@RequestBody Order order);

    /**
     * 测试一个对象 一个参数
     *
     * @param order
     * @param name
     * @return
     */
    @PostMapping("testOneObjectOneParam")
    public BaseResult oneObjectOneParam(@RequestBody Order order,
                                        @RequestParam String name);

    /**
     * 测试 url 传参
     *
     * @param id
     * @return
     */
    @GetMapping("testUrlParam/{id}")
    public BaseResult testUrlParam(@PathVariable("id") Integer id);
}

4.3.3 创建 TestController 类

@RestController
public class TestController {

    @Autowired
    private UserOrderFeign userOrderFeign;

    @RequestMapping("testFeignParam")
    public String testFeignParam() {
        // 测试一个参数
        BaseResult result1 = userOrderFeign.oneParam("bjpowernode");
        System.out.println(result1);
        System.out.println("--------------------------------------------------");
        // 测试多个参数
        BaseResult result2 = userOrderFeign.twoParam("bjpowernode", 666);
        System.out.println(result2);
        System.out.println("--------------------------------------------------");
        // 测试一个对象
        Order order = new Order("111", "牛排", "一份牛排 256g", new Date(), "159357");
        BaseResult result3 = userOrderFeign.objectParam(order);
        System.out.println(result3);
        System.out.println("--------------------------------------------------");
        // 测试 url 传参
        BaseResult result4 = userOrderFeign.testUrlParam(999);
        System.out.println(result4);
        System.out.println("--------------------------------------------------");
        // 测试一个对象 一个参数
        BaseResult result5 = userOrderFeign.oneObjectOneParam(order,
                "bjpowernodebjpowernode");
        System.out.println(result5);
        System.out.println("--------------------------------------------------");
        return "ok";
    }
}

4.3.4 测试调用

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

在这里插入图片描述

4.3.5 时间日期参数问题

使用 feign 远程调用时,传递 Date 类型,接收方的时间会相差 14 个小时,是因为时区造成的
处理方案:

  1. 使用字符串传递参数,接收方转换成时间类型(推荐使用)不要单独传递时间
  2. 使用 JDK8 的 LocalDate(日期) 或 LocalDateTime(日期和时间,接收方只有秒,没有毫秒)
  3. 自定义转换方法
    传参总结:
    get 请求只用来传递基本参数 而且加注解@RequestParam
    post 请求用来传递对象参数 并且加注解@RequestBody

6.OpenFeign 总结

OpenFeign 主要基于接口和注解实现了远程调用
源码总结:面试

  1. OpenFeign 用过吗?它是如何运作的?
    在主启动类上加上@EnableFeignClients 注解后,启动会进行包扫描,把所有加了
    @FeignClient(value=”xxx-service”)注解的接口进行创建代理对象通过代理对象,使用
    ribbon 做了负载均衡和远程调用
  2. 如何创建的代理对象?
    当 项 目 在 启 动 时 , 先 扫描 , 然 后 拿 到 标 记了 @FeignClient 注 解的 接 口 信息 , 由ReflectiveFeign 类的 newInstance 方法创建了代理对象 JDK 代理
  3. OpenFeign 到底是用什么做的远程调用?
    使用的是 HttpURLConnection (java.net)
  4. OpenFeign 怎么和 ribbon 整合的?
    在代理对象执行调用的时候

7.OpenFeign 其他

7.1 OpenFeign 的日志功能

从前面的测试中我们可以看出,没有任何关于远程调用的日志输出,如请头,参数
Feign 提供了日志打印功能,我们可以通过配置来调整日志级别,从而揭开 Feign 中 Http 请求的所有细节

7.1.1 OpenFeign 的日志级别

NONE 默认的,不显示日志
BASE 仅记录请求方法,URL ,响应状态码及执行时间
HEADERS 在 BASE 之上增加了请求和响应头的信息
FULL 在 HEADERS 之上增加了请求和响应的正文及无数据

7.1.2 创建配置类

@Configuration
public class FeignConfig {
    @Bean
    Logger.Level feignLogger() {
        return Logger.Level.FULL;
    }
}

7.1.3 修改配置文件

在这里插入图片描述

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

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

相关文章

Uni-app常用知识点总结

一、一句话总的形容一下uniapp与vue和微信小程序的异同点 简单来讲Uni-app就是用着vue的指令和小程序的组件和API 二、Uniapp中配置tabbar的方式 见之前的单独文章—— (3条消息) Uni-app中的tabBar的配置_终将抵达丶的博客-CSDN博客_uniapp设置tabbar图片大小https://blog.…

利用霍尔效应传感器和Arduino研究了一个简单的钟摆

A simple pendulum studied using Hall effect sensor and Arduino 利用霍尔效应传感器和Arduino研究了一个简单的钟摆:原文(Hall effect sensor (scitation.org)) ARTICLES YOU MAY BE INTERESTED IN Measurement of gravitational accele…

One UI 5 升级来了

从11月23日开始,三星多款手机海内外开始推送安卓13/One UI 5.0正式版,大家心心念念的One UI 5终于来了,接下来我们看下有关新版One UI 5相关的更新内容,具体如下: One UI 5 升级 (Android 13) One UI 5 为您带来更加强…

Eureka服务注册与发现

✨ Eureka服务注册与发现微服务的注册中心注册中心的基本介绍注册中心的主要作用注册中心基本原理常见的注册中心Eureka基本介绍服务治理服务注册Eureka 两大组件搭建EurekaEureka端服务注册中心创建新模块 cloud-eureka-server7001添加pom依赖yml配置启动类服务中心管理后台服…

Connection(数据库连接对象)

Connection(数据库连接对象) 简介:通过代码来讲解Connection的含义。 推荐学习路线:JDBC数据库的连接->Connection(数据库连接对象)->Statement->ResultSet->通过PreparedStatement预防SQL注入…

【云原生 | Kubernetes 系列】--Gitops持续交付 Argo Rollouts Analysis

1. Argo Rollouts 由一个控制器和一组CRD组成,可为K8s提供高级部署功能 - blue-green - canary - canary analysis 结合外部指标系统金丝雀 - experimentation 实验性的结果 - progressive delivery 渐进式交付,精准管控外部流量策略,不用关心后端部署机制支持Ingress Contro…

第六章《类的高级特性》第1节:static关键字的使用

static意为“静态”,在Java语言中,使用static关键字可以定义静态属性、静态方法和静态块。 6.1.1 静态属性 在第5章中,我们定义了一个Person类的子类Student,用它来表示学生。假如每一个在读学生每年都能得到1000元的助学津贴,并且程序员希望在Student类中以属性的形式把…

骨传导有没有副作用?骨传导耳机有什么优点吗?

骨传导有没有副作用? 先说结论:是没有的。 骨传导耳机虽然是近两年在走向我们大众视野,但是骨传导技术早就已经在医疗、军事领域广泛应用,骨传导也不是什么高端的技术,像我们平常嗑瓜子,吃薯片&#xff0…

javaee实验,SSM整合开发综合实例

由于不能使用maven管理,只能导入jar包做实验,最下面有截图展示所用到的jar包,可以自己搜索文档maven导入依赖; SSM整合开发综合实例 实验目的: (1)掌握SSM项目整合的原则; &#x…

Microsoft Visual Studio C++开发环境的配置及使用

Microsoft Visual Studio C开发环境的配置及使用 本文引用自作者编写的下述图书; 本文允许以个人学习、教学等目的引用、讲授或转载,但需要注明原作者"海洋饼干叔 叔";本文不允许以纸质及电子出版为目的进行抄摘或改编。 1.《Python编程基础及…

大数据面试题(四):Yarn核心高频面试题

文章目录 Yarn核心高频面试题 一、简述Hadoop1与Hadoop2的架构异同 二、为什么会产生yarn,它解决了什么问题,有什么优势? 三、HDFS的数据压缩算法?及每种算法的应用场景? 1、gzip压缩 2、Bzip2压缩 3、Lzo压缩 …

SpringBoot框架接收参数的六种常用方式(全面详细)

文章目录[toc]一、基于PathVariable注解二、基于RequestParam注解三、基于PathVariableRequestParam混合四、基于RequestBody注解五、基于HttpServletRequest请求六、不基于任何注解进行表单传参一、基于PathVariable注解 RestControllerpublic class UserController {GetMapp…

C#11新特性之原始字符串

随着.NET 7与C#11的发布,微软发布了C# 11 中的原始字符串这个新特性。 这个新特性解决了祖传字符串中引号的问题。 微软官方的表述是:" Raw string literals",圈里都叫他”原始字符串”。从字面不难看出,它是适用于字符串的新特性…

elasticsearch 之 histogram 直方图聚合

1. 简介 直方图聚合是一种基于多桶值聚合,可从文档中提取的数值或数值范围值来进行聚合。它可以对参与聚合的值来动态的生成固定大小的桶。 2. bucket_key如何计算 假设我们有一个值是32,并且桶的大小是5,那么32四舍五入后变成30&#xff…

两种方式实现css取消页面鼠标双击选中文字或单击拖动选中文字的效果

问题描述 我们知道浏览器页面上的文字正常情况下我们是可以双击选中、或者单击鼠标横向拖动也能选中的,选中以后可以右击出现面板然后去复制什么的。但是有的时候,这种效果我们并不想要的,比如用户点快了的时候,所以我们需要禁用…

TensorFlow之文本分类算法-3

1 前言 2 收集数据 3 探索数据 4 选择模型 5 准备数据 N-gram向量集 序列向量集 序列向量集主要是用于序列模型中对文本执行分词与向量化,与n-gram向量集类似,也使用特征选择与标准化的技术优化序列向量集的表示。 在一些文本样例中,…

GaussDB-物理、逻辑备份 使用方法和[GAUSS-53403]解决办法

文章目录1.逻辑备份-gs_dump2.逻辑备份恢复数据库3.物理备份(分布式集群验证)查看物理全量备份集:查看物理增量备份集:查看所有备份集(该命令无法确定备份是否有效)停止物理备份:使用物理备份集…

centos7安装mysql8.0.31

mysql 官网 https://www.mysql.com/ 找到对应的版本 然后下载 连接虚拟机 mysql 会和 mariadb这个有冲突,需要卸载掉 查看是否有mariadb rpm -qa|grep mariadb rpm -e --nodeps mariadb-libs 这个是强制卸载命令 再查看一下 rpm -qa|grep mariadb 在根目录创建…

2022 APMCM亚太数学建模竞赛 C题 全球是否变暖 问题一python代码实现(更新完毕)

2022 APMCM亚太数学建模竞赛 C题 全球是否变暖 思路及代码实现(持续更新完毕) 更新信息 2022-11-24 10:00 更新问题1和问题2 思路 2022-11-24 23:20 更新问题一代码 2022-11-25 11:00 更新问题二代码 相关链接 【2022 APMCM亚太数学建模竞赛 C题 全球是否变暖 问题一pytho…

高性能数据访问中间件 OBProxy(六):一文讲透数据路由

在《高性能数据访问中间件 OBProxy(五):一文讲透数据路由》中,我们讲到了数据路由影响因素包括功能因素、性能因素和高可用因素。本文主要介绍高可用因素相关的内容。 相比传统的 IOE 架构,OceanBase 利用更低的成本实…