springcloud篇2-feign、gateway

news/2024/12/28 22:17:27/

一、Feign(http客户端)

1.1 简介

之前不同的服务之间进行远程调用使用的是RestTemplate。
在这里插入图片描述
存在下面的问题:
(1)代码可读性差,编程体验不统一;
(2)参数复杂,URL难以维护。

Feign(发音“奋”)是一个声明式的http客户端,作用是帮助我们便捷地实现http请求地发送。

1.2 使用步骤

在这里插入图片描述
在这里插入图片描述
说明:
@FeignClient注解说明远程调用地服务名称。

例如:
(1)在order-service项目中添加feign客户端依赖并开启自动装配功能
在这里插入图片描述
在这里插入图片描述
(2)在order-service中新建接口声明
在这里插入图片描述
(3)在order-service中使用声明的接口发起远程调用
在这里插入图片描述

1.3 自定义配置

在这里插入图片描述
说明:
(1)日志级别
NONE-没有日志
BASIC-记录请求的开始和结束时间
HEADERS-记录请求的开始和结束时、请求头和响应头
FULL-记录请求的开始和结束时、请求头和响应头、请求体和响应体

1.3.1 修改日志文件的级别

在这里插入图片描述
例如:
在order-serivce配置,
在这里插入图片描述
在这里插入图片描述
注意:全局配置的注解写在Application类(例如order-service的OrderApplication类)上,局部配置的注解写在Feign的配置类上(例如order-service的UserClient类)。
例如,在order-service中进行配置,
声明一个Bean:
在这里插入图片描述
加全局有效注解:
在这里插入图片描述

1.4 性能优化

Feign底层的客户端实现(三种模式):
在这里插入图片描述
对Feign性能的优化,主要是对底层客户端的改变。
在这里插入图片描述

1.4.1 连接池配置

在这里插入图片描述

1.5 最佳实践

观察可以看出,order-service发请求的配置与user-service接收的配置一致。
order-service的配置如下:
在这里插入图片描述
user-service的配置如下:
在这里插入图片描述
在这里插入图片描述

1.5.1 给消费者的FeignClient和提供者的controller定义统一的父接口作为标准

在这里插入图片描述
但该方式不推荐,会导致紧耦合。

1.5.2 服务提供者将FeignClient封装成独立模块供消费者调用

而如果有十多个服务需要访问user-service,则UserClient需要书写十多遍,不太方便。
在这里插入图片描述
缺点:feign-api可能有多个接口,但服务消费者只需要某几个,这样就冗余了。
在这里插入图片描述

1.5.2.1 实现步骤
feignapi_66">1、新建module(feign-api)并引入依赖

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

2、编写内容

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

feignapi_73">3、消费者导入写好的feign-api并完成导包

在这里插入图片描述

feignapiFeignClientSpringApplication_75">4、解决导入的feign-api的声明接口FeignClient不在SpringApplication的扫描包范围

注意:这时可能会出现一个问题,即FeignClient不在SpringBootApplication的扫描包范围,导致@Autowire实际注入失败,这些FeignClient无法使用。
在这里插入图片描述
在这里插入图片描述
解决方法:
在这里插入图片描述
例如:
在这里插入图片描述

二、Gateway(统一网关)

2.1 简介

之前的微服务允许任何的访问,不安全,需要添加一个网关(功能包括身份认证和权限校验、服务路由、负载均衡、请求限流)。
在这里插入图片描述
在这里插入图片描述

2.2 搭建网关

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

说明:网关是一个独立的服务,也需要把自己注册到nacos或从nacos中拉取服务。

例如:
创建gateway服务,引入依赖
在这里插入图片描述
在这里插入图片描述
配置路由规则:
在这里插入图片描述
测试:
在这里插入图片描述
在这里插入图片描述

2.3 路由断言predicate

在2.2 中配置过路由断言:
在这里插入图片描述
路由断言(predicates)是一种判断规则,判断请求是否符合要求,符合则转发到路由目的地(由路由断言工厂route predicate factory实现)。路由断言工厂读取配置文件的断言规则并处理,转变成路由判断的条件。
在这里插入图片描述

2.4 路由过滤器GatewayFilter

GatewayFilter是网关中提供的一种过滤器,可以对进入网关的请求和微服务返回的响应做处理(注意:不仅是请求,还有响应)。
在这里插入图片描述
spring的过滤器工厂:
在这里插入图片描述
例如:
在这里插入图片描述
例如:
gateway服务中新增过滤器的内容,
在这里插入图片描述
在user-service的controller里获取增加的请求头:
在这里插入图片描述
执行结果如下:
在这里插入图片描述
补充:
还可以使用默认过滤器,可以对所有路由都生效,
在这里插入图片描述

2.5 全局过滤器GlobalFilter

在这里插入图片描述
在这里插入图片描述例如:
在这里插入图片描述
代码实现如下:
在这里插入图片描述
增加两个注解:
在这里插入图片描述
过滤器顺序也可以通过实现接口设置:
在这里插入图片描述
在这里插入图片描述

2.6 过滤器的执行顺序

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

2.7 跨域问题处理

跨域是指域名不一样。主要包括,
(1)域名不同:www.taobao.com和www.taobao.org、www.jd.com和miaosha.jd.com。
(2)域名相同,端口不同:localhost:8080与localhost:8081。
注意,上面两种情况不都会产生跨域问题,跨域问题特指浏览器禁止请求的发起者与服务端发生跨域ajax请求,请求被浏览器拦截的问题。
解决方案:CORS
CORS方案是浏览器去问服务器(先到gateway)让不让请求跨域。
在这里插入图片描述
说明:
(1)add-to-simple-url-handler-mapping:true;是为了保证浏览器在是否拦截跨域请求前先问gateway
(2)maxAge:是浏览器问过一次后,该设置时间内不再询问。
例如,一个前端页面:
在这里插入图片描述
使用前端工具启动上图的页面(端口问8090),可以看到报错:
在这里插入图片描述
对跨域问题进行解决,在gateway服务中增加以下内容:
在这里插入图片描述
解决如下:
在这里插入图片描述
访问正常,控制台也打印了信息。


http://www.ppmy.cn/news/1558899.html

相关文章

【从零开始入门unity游戏开发之——C#篇33】C#委托(`Delegate`)和事件(`event` )、事件与委托的区别、Invoke()的解释

文章目录 一、委托(Delegate)1、什么是委托?2、委托的基本语法3、定义自定义委托4、如何使用自定义委托5、多播委托6、C# 中的系统委托7、GetInvocationList 获取多个函数返回值8、总结 二、事件(event )1、事件是什么…

柒拾捌- 如何通过数据影响决策(六)- 放大再放大

1、整体带来的错觉 当我们观察宏观的数据时,常常会发现有些东西 无法理解。例如为什么人人都说楼价在跌,但公布的楼价数据却在涨?例如为什么经济感受那么差,宏观数据却还是在涨? 如果我们只在于 某个粒度 的数据&…

农历节日倒计时:基于Python的公历与农历日期转换及节日查询小程序

农历节日倒计时:基于Python的公历与农历日期转换及节日查询小程序 摘要 又是一年春节即将到来,突然想基于Python编写一个农历节日的倒计时小程序。该程序能够根据用户输入的农历节日名称,计算出距离该节日还有多少天。通过使用lunardate库进…

青少年编程与数学 02-004 Go语言Web编程 20课题、单元测试

青少年编程与数学 02-004 Go语言Web编程 20课题、单元测试 一、单元测试(Unit Testing)二、集成测试(Integration Testing)三、区别四、Go Web单元测试使用testing包使用testify框架使用GoConvey框架 五、应用示例步骤 1: 创建HTT…

JVM简介—垃圾回收器和内存分配策略

1.垃圾回收概述 2.如何判断对象存活 (1)引用计数算法 给对象添加一个引用计数器,每当一个地方引用它时就将计数器加1,当引用失效时就将计数器减1,任何时刻计数器为0的对象都不再被使用。 这种算法简单,但是有个致命的缺点&#xf…

云服务器yum无法解析mirrorlist.centos.org

[root~]# yum list available 已加载插件:fastestmirror Loading mirror speeds from cached hostfile Could not retrieve mirrorlist http://mirrorlist.centos.org?archx86_64&release7&reposclo-sclo error was 14: curl#6 - "Could not re…

麒麟操作系统启停微服务jar包脚本.sh

#! /bin/bash # 端口号 PORTS(9054 9051 9056 9052 9055 9059 12010 9057 9060) # 模块 MODULES(DataMiniosService HealthyService IntegrationService ManagementService ProductService SystemService TheGateway ShowService AlgorithmService) # 模块名称 MODULE_NAMES(数…

智能运维赋能江苏汽车制造

——打造高效“智控工厂”新典范 江苏某大型汽车零部件制造企业肩负着为全国多家知名整车厂供应高品质零部件的重任。随着生产规模的不断扩大,设备的长时间高负荷运转带来了故障风险,而传统人工巡检难以满足实时管理需求。若无法及时发现并处理设备异常&…