首页 > 其他分享 >Spring Cloud Gateway(微服务网关)

Spring Cloud Gateway(微服务网关)

时间:2023-02-13 11:32:16浏览次数:50  
标签:网关 http Spring 负载 localhost 服务 Gateway 路由


文章目录

  • ​​1、什么是服务网关?​​
  • ​​1.1 说明​​
  • ​​1.2 为什么需要网关?​​
  • ​​1.3 网关组件在微服务中的架构​​
  • ​​2、服务网关组件Gateway​​
  • ​​2.1 Spring Cloud Gateway简介​​
  • ​​3、开发网关动态路由​​
  • ​​3.1、创建项目并引入依赖​​
  • ​​3.2 编写网关配置​​
  • ​​3.3启动gateway项目​​
  • ​​3.4 测试网关路由转发​​
  • ​​3.5也可以使用Java代码配置路由​​
  • ​​4、配置路由服务负载均衡​​
  • ​​4.1 配置网管转发实现负载均衡​​
  • ​​4.2 负载均衡测试​​

1、什么是服务网关?

1.1 说明

网关统一服务入口,可方便实现对平台众多服务接口进行管控,对访问服务的身份认证、防报文重放与防数据篡改、功能调用的业务鉴权、响应数据的脱敏、流量与并发控制,甚至基于API调用的计量或者计费等等。

1.2 为什么需要网关?

  • 网关可以实现服务的统一管理。
  • 网关可以解决微服务中通用代码的冗余问题(如权限控制、流量监控、限流等)

1.3 网关组件在微服务中的架构

Spring Cloud Gateway(微服务网关)_spring

2、服务网关组件Gateway

2.1 Spring Cloud Gateway简介

官网:​​https://spring.io/projects/spring-cloud-gateway​​​ Spring Cloud Gateway基于Spring5、SpringBoot2和Project Reactor等技术,是在Spring生态系统之上构建的API网关服务。Gateway旨在提供一种简单而有效的方式来对API进行路由(Route),以及提供一些强大的过滤器功能,例如熔断、限流、重试等。
Spring Cloud Gateway具有如下特性:

  • 基于Spring FrameWork5、Project Reactor以及SpringBoot2.0进行构建。
  • 能够匹配任何请求属性
  • 可以对路由指定Predicate(断言)和Filter(过滤器)。
  • 集成Hystrix的断路器功能。
  • 集成SpringCloud服务发现功能。
  • 易于编写的Predicate和Filter。
  • 请求限流功能。
  • 路径重写。
    关键术语解释:

Route(路由):构建网关的基本模块,由ID、目标URI、一系列的断言和过滤器组成,如果断言为true就匹配该路由。
Predicate(断言):Java8的Function Predicate,输入类型是Spring框架中的ServerWebExchange。这使得开发人员可以匹配HTTP请求中的所有内容,例如请求头或请求参数。如果请求与断言相匹配,就进行路由。
Filter(过滤器):Spring框架中的GatewayFilter实例通过使用过滤器可以在路由前后对请求进行修改。

3、开发网关动态路由

3.1、创建项目并引入依赖

<!--引入gateway网关依赖-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-gateway</artifactId>
</dependency>

Spring Cloud Gateway(微服务网关)_gateway_02

3.2 编写网关配置

网关配置有两种方式:一种是快捷方式(Java代码编写网关),一种是完全展开方式(配置文件方式)[推荐]。

server:
port: 7979
spring:
application:
name: GATEWAY
cloud:
consul:
host: localhost
port: 8500
gateway:
routes:
- id: category-router #路由对象唯一标识
uri: http://localhost:8787 #用来类别服务地址 http://localhost:8787/category
predicates: #断言 用来配置路由规则
- Path=/category/**
filters:
- StripPrefix=1

- id: product-router #路由对象唯一标识
uri: http://localhost:8799 #用来商品服务地址 http://localhost:8799/list
predicates: #断言
- Path=/product/**

Spring Cloud Gateway(微服务网关)_spring cloud_03


Spring Cloud Gateway(微服务网关)_spring cloud_04

3.3启动gateway项目

直接启动会报错

Spring Cloud Gateway(微服务网关)_spring cloud_05


在启动日志中发现,gateway为了效率使用webflux进行异步非阻塞模型的实现,因此和原来的web包冲突,去掉原来的web即可

Spring Cloud Gateway(微服务网关)_spring_06


再次启动,成功启动了。

Spring Cloud Gateway(微服务网关)_Cloud_07

3.4 测试网关路由转发

http://localhost:7979/product/list

网关会帮我们转发到​​http://localhost:8799 /product/list​

Spring Cloud Gateway(微服务网关)_gateway_08

3.5也可以使用Java代码配置路由

@Configuration
public class GatewayConfig {

@Bean
public RouteLocator customRouteLocator(RouteLocatorBuilder builder) {
return builder.routes()
//类别路由
.route("category_route", r -> r.path("/category")
.uri("http://localhost:8787"))
//商品路由
.route("product_router",r->r.path("/list")
.uri("http://localhost:8799"))
.build();
}
}

Spring Cloud Gateway(微服务网关)_Cloud_09

4、配置路由服务负载均衡

上述代码都是根据服务地址写死的路由转发,没有办法实现请求的负载均衡。

4.1 配置网管转发实现负载均衡

前提是已经引入了Ribbon负载均衡客户端组件

server:
port: 7979
spring:
application:
name: GATEWAY
cloud:
consul:
host: localhost
port: 8500
gateway:
routes:
- id: category-router #路由对象唯一标识
# uri: http://localhost:8787 #用来类别服务地址 http://localhost:8787/category
uri: lb://CATEGORY #lb(loadbalance)代表转发后台服务使用负载均衡,CATEGORY代表服务注册中心上的服务名
predicates: #断言 用来配置路由规则
- Path=/category/**
filters:
- StripPrefix=1

- id: product-router #路由对象唯一标识
# uri: http://localhost:8799 #用来商品服务地址 http://localhost:8799/list
uri: lb://PRODUCT #实现了请求的负载均衡处理
predicates: #断言
- Path=/product/**

Spring Cloud Gateway(微服务网关)_Cloud_10


lb(loadbalance)代表负载均衡转发路由,后面的CATEGORY和PRODUCT分别是类别服务和商品服务的服务名称。我们可以查看下与服务注册中心的服务名称是否一致:

Spring Cloud Gateway(微服务网关)_负载均衡_11

4.2 负载均衡测试

由于商品服务我们有两个服务节点,且Ribbon负载均衡默认使用的负载均衡算法是轮询法,所以当我们连续访问​​http://localhost:7979/product/list​​,看到的应该是8799和8788轮着被请求。

Spring Cloud Gateway(微服务网关)_spring_12


Spring Cloud Gateway(微服务网关)_负载均衡_13


我们访问​​http://localhost:7979/product/list​

Spring Cloud Gateway(微服务网关)_gateway_14


可以看到此时提供服务的节点是8788端口

再次访问:​​http://localhost:7979/product/list​

Spring Cloud Gateway(微服务网关)_负载均衡_15


可以看到此时提供服务的节点是8799端口,确实实现了请求的负载均衡(这里的负载均衡算法默认是轮询法)。

Spring Cloud Gateway(微服务网关)_spring cloud_16


标签:网关,http,Spring,负载,localhost,服务,Gateway,路由
From: https://blog.51cto.com/u_15961549/6053846

相关文章

  • Java:SpringBoot整合Sharding-Jdbc实现数据库读写分离
    读写分离实现效果:写操作使用master主库,读操作使用slave从库依赖<dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-boot-starter</artifactId>......
  • 7 种提升 Spring Boot 吞吐量技巧
    7种提升SpringBoot吞吐量技巧!一、异步执行实现方式二种:1、 使用异步注解@aysnc、启动类:添加@EnableAsync注解;2、 JDK8本身有一个非常好用的Future类——Com......
  • Spring事务管理嵌套事务详解 : 同一个类中,一个方法调用另外一个有事务的方法
    Spring事务机制回顾  Spring事务一个被讹传很广说法是:一个事务方法不应该调用另一个事务方法,否则将产生两个事务. 结果造成开发人员在设计事务方法时束手束脚,生怕一不......
  • spring 知识点
    概述以及IOC理论推导Spring是一个轻量级的控制反转(IoC)和面向切面(AOP)的容器(框架)。Spring框架是一个分层架构,由7个定义良好的模块组成。Spring模块构建在核心容器......
  • 【SpringBoot】Session共享
    本文参考SpringBoot一个依赖搞定session共享,没有比这更简单的方案了!在传统的单服务架构中,只有一个服务器,那就不会存在session共享的问题,但如果在分布式/集群项目......
  • Spring boot 学习笔记:第十章--实现AcApp端
    开启最后一章的学习java-jarmatchingsystem.jar启动jar包ctrl+shift+r浏览器强制刷新重新打包的流程app.vue删去div.windows标签。style加上scoped属......
  • SpringBoot项目启动后再请求远程接口的实现方式
    场景有一个SpringBoot项目需要在启动后请求另一个远程服务拿取配置,而不是加载过程中去请求,可能会出现类没有实例化的场景,因此需要实现项目完全启动后再进行请求的场景......
  • .Net Core使用Ocelot网关(一) -负载,限流,熔断,Header转换
    原文网址:https://www.cnblogs.com/linhuiy/p/12029652.html1.什么是API网关API网关是微服务架构中的唯一入口,它提供一个单独且统一的API入口用于访问内部一个或多个API。......
  • Springboot项目配置SSL问题
    项目写一半想发布看一眼,是微信小程序的项目,一切都准备好了结果没有发布成功。第一次发布小程序,才知道微信小程序必须要https协议的域名才可以。发布小程序大致流程编......
  • springboot内置的数据源,持久化技术和数据库管理工具
    我们之前用的是Druid,mybatis,mysql:   现在看看springboot内置的数据源:   内置的持久化技术jdbcTemplate:   使用这个jdbcTemplate需要导入jar包:  ......