springcloud篇2-feign、gateway

一、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 实现步骤
1、新建module(feign-api)并引入依赖


2、编写内容



3、消费者导入写好的feign-api并完成导包
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.orgwww.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服务中增加以下内容:

解决如下:

访问正常,控制台也打印了信息。

相关推荐
小小虫码8 小时前
项目中用的网关Gateway及SpringCloud
spring·spring cloud·gateway
{⌐■_■}3 天前
【gRPC-gateway】初探grpc网关,插件安装,默认实现,go案例
开发语言·golang·gateway
{⌐■_■}3 天前
【gRPC-gateway】option定义规则及HttpBody响应
java·服务器·开发语言·golang·gateway
潜水阿宝3 天前
微服务网关鉴权之sa-token
java·spring boot·微服务·gateway·springcloud
S-X-S4 天前
项目集成GateWay
java·开发语言·gateway
组合缺一4 天前
Solon Cloud Gateway 开发:导引
java·gateway·reactor·solon·响应式
组合缺一5 天前
Solon Cloud Gateway 开发:熟悉 Cloud Gateway
java·gateway·solon
Mr.Demo.6 天前
[Spring] OpenFeign的使用
java·后端·spring·springcloud
组合缺一6 天前
Solon Cloud Gateway 开发:熟悉 ExContext 及相关接口
java·后端·gateway·solon
组合缺一6 天前
Solon Cloud Gateway 开发:Route 的过滤器与定制
java·后端·gateway·reactor·solon