Spring cloud Gateway 服务网关

  • 一、简介
    • 优点:
    • 特性:
    • 总结:
  • 二、核心概念
  • 三、路由规则
    • 1、Path
    • 2、Query
    • 3、Method
    • 4、Datetime
    • 5、RomoteAddr
    • 6、Header
  • 四、动态路由
    • 1、依赖
    • 2、配置
      • 动态获取URI
      • 服务名称转发
  • 五、过滤器
    • 1、网关过滤器 GatewayFilter
      • 局部
        • Path 过滤器
        • Parameter 参数过滤器
        • Status 状态过滤器
      • 全局
    • 2、全局过滤器 GlobalFilter
    • 3、自定义过滤器
      • 自定义网关过滤器
      • 自定义全局过滤器
  • 六、网关限流
    • 1、原因
    • 2、限流算法
      • 计算器算法
      • 漏桶算法(Leaky)
      • 令牌桶算法(Token)
    • 3、实例
      • URI 限流
      • 参数限流
      • IP 限流
  • 七、高可用网关
    • 1、项目结构
    • 2、配置文件
      • **parent 中的 pom.xml**
      • **nginx.conf**
      • **dockerFile**
      • **docker-compose.yml**
    • 3、docker 部署
      • **Maven 打包**
      • **docker部署**

一、简介

微服务中,客户端调用服务时,将服务分发到对应的微服务

优点:

zuul 使用阻塞式模型,一个请求一个线程,高并发压力大,已经停止维护。

gateway 使用非阻塞式响应模型,基于Netty使用webFlux,用于替代 Tomcat

  • 客户端无需多次请求不同的微服务,降低了客户端的复杂性
  • 解决跨域问题
  • 解决身份认证问题
  • 解决了项目迭代问题
  • 解决了一些协议的问题

特性:

  • 统一接入:

    为各种无线应用提供统一接入入口

    高性能、高并发、高可靠

    负载均衡、容灾切换(异地多活)

  • 流量监管

    服务降级

    熔断

    路由(异地多活中的应用)

  • 安全防护

    和安全部合作,IP 黑名单,URL 黑名单

    风控防刷,恶意攻击等

  • 协议适配

    前端系统(http、https)后端(RPC)

    长连接、短链接支持

    根据请求路由分配至相应的 SOA 服务并执行

总结:

  • 性能:API 高可用、负载均衡、容错机制
  • 安全:权限身份认证,流量清洗,黑名单,后端签名等
  • 日志:日志记录,一旦涉及分布式,全链路跟踪必不可少
  • 缓存:数据缓存
  • 监控:记录请求响应数据,API 耗时分析,性能监控
  • 限流:流量控制,错峰流控,可定义多种限流规则
  • 灰度:线上灰度部署,减小风险
  • 路由:动态路由

二、核心概念

  • 路由:是网关最基础的部分,由ID、目标URI、一组断言和一组过滤器组成,断言为真说明请求的 URI 和配置匹配
  • 断言:Java 8 中的断言函数,允许自定义匹配来自于 Http Request 中的任何信息
  • 过滤器:标准的 Spring Web Filter 对请求和响应进行处理

三、路由规则

1、Path

spring:cloud:# 路由规则gateway:routes:# 将 http://localhost:9000/product/** 路由至 http://localhost:7070/product/**- id: provider                  # 路由 ID,唯一uri: http://localhost:7070/   # 目标 URI,路由到微服务的地址predicates:                   # 断言(判断条件)- Path=/product/**          # 匹配对应的 URL 请求

2、Query

spring:cloud:# 路由规则gateway:# 将 http://localhost:9000/product/** 路由至 http://localhost:7070/product/**- id: order                     # 路由 ID,唯一uri: http://localhost:6060/   # 目标 URI,路由到微服务的地址predicates:                   # 断言(判断条件)- Query=name                # 匹配请求参数中包含 name 的请求
#            - Query=name, abc.          # 匹配请求参数中包含 name 且满足正则表达式 abc. 的请求
  • Query=name: 比如:http://localhost:9000/product/?name=123
  • Query=name,abc.: 比如:http://localhost:9000/product/?name=abc123

3、Method

spring:cloud:# 路由规则gateway:routes:# Method- id: provider                                            # 路由 ID,唯一uri: http://localhost:7070/                             # 目标 URI,路由到微服务的地址predicates:                                             # 断言(判断条件)- Method=GET                                          # 匹配 GET 请求

4、Datetime

spring:cloud:# 路由规则gateway:routes:# Datetime- id: provider                  # 路由 ID,唯一uri: http://localhost:7070/   # 目标 URI,路由到微服务的地址predicates:                   # 断言(判断条件)# 匹配中国上海 2022-06-27 16:00:00 后的时间- After=2022-06-27T16:00:00.000+08:00[Asia/Shanghai]

5、RomoteAddr

spring:cloud:# 路由规则gateway:routes:- id: provider                                            # 路由 ID,唯一uri: http://localhost:7070/                             # 目标 URI,路由到微服务的地址predicates:                                             # 断言(判断条件)# RemoteAddr- RemoteAddr=172.16.10.82/0                            # 匹配请求中地址是 172.16.10.82 的请求,/0为子网掩码

API: http://172.16.10.82:9000/product/list

6、Header

spring:cloud:# 路由规则gateway:routes:- id: provider                                            # 路由 ID,唯一uri: http://localhost:7070/                             # 目标 URI,路由到微服务的地址predicates:                                             # 断言(判断条件)# Header- Header=X-Request-Id, \d+                            # 匹配请求头中包含 X-Request-Id 并且其值匹配正则表达式 \d+ 的请求

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-KS9fnrzD-1670555453107)(img/Gateway 路由规则 Header test.png)]

四、动态路由

1、依赖

<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>

2、配置

动态获取URI

spring:cloud:# 路由规则gateway:routes:- id: provider                                            # 路由 ID,唯一uri: lb://provider                                      # 根据注册中心动态路由
#          uri: http://localhost:7070/                            # 目标 URI,路由到微服务的地址predicates:                                             # 断言(判断条件)# Path- Path=/product/**                                    # 匹配对应的 URL 请求

API:http://localhost:9000/product/list

服务名称转发

spring:cloud:# 路由规则gateway:discovery:locator:# 是否与服务发现组件进行结合,通过 serviceId 转发到具体服务enabled: true                      # 是否开启基于服务发现的路由规则,开启后会自动生成一套基于注册中心服务名的路由,自定义路由时建议关闭lower-case-service-id: true        # 是否将服务名称转小写

API前要加服务名称服务名称: http://localhost:9000/provider/product/list

五、过滤器

1、网关过滤器 GatewayFilter

通过 spring.cloud.routes.filters 配置在具体路由下,只作用于当前路由或通过 spring.cloud.default-filters 配置在全局,作用在所有路由上

局部

Path 过滤器
spring:cloud:# 路由规则gateway:routes:- id: provider                                            # 路由 ID,唯一uri: lb://provider                                      # 根据注册中心动态路由
#          uri: http://localhost:7070/                            # 目标 URI,路由到微服务的地址predicates:                                             # 断言(判断条件)# Path- Path=/product/**,/gateway/**                        # 匹配对应的 URL 请求filters:# 将 /gateway/product/list 重写为 /product/list- RewritePath=/gateway(?<segment>/?.*),$\{segment}# 请求增加前缀 /list 变为 /product/list - PrefixPath=/product# 分割前缀 /api/gateway/product/list 变为 /product/list - StripPrefix=2- id: provider2                                           # 路由 ID,唯一uri: lb://provider                                      # 根据注册中心动态路由predicates:                                             # 断言(判断条件)# Path          设置参数 segment - Path=/gateway/product/{segment}  filters:# 将 /gateway/product/list 重写为 /product/list- SetPath=/product/{segment}
Parameter 参数过滤器
spring:cloud:# 路由规则gateway:routes:- id: provider                                            # 路由 ID,唯一uri: lb://provider                                      # 根据注册中心动态路由predicates:                                             # 断言(判断条件)# Path- Path=/**                                            # 匹配对应的 URL 请求filters:# 在下游请求中添加 id = 1- AddRequestParameter=id,1
Status 状态过滤器
spring:cloud:# 路由规则gateway:routes:- id: provider                                            # 路由 ID,唯一uri: lb://provider                                      # 根据注册中心动态路由predicates:                                             # 断言(判断条件)# Path- Path=/product/**,/gateway/**                        # 匹配对应的 URL 请求filters:# 在任何情况下,响应状态码设置为888- SetStatus=888

全局

设置全局默认 filters

spring:application:name: gateway # 应用名称cloud:# 路由规则gateway:discovery:locator:# 是否与服务发现组件进行结合,通过 serviceId 转发到具体服务enabled: true                      # 是否开启基于服务发现的路由规则lower-case-service-id: true        # 是否将服务名称转小写default-filters:- PrefixPath=/product

2、全局过滤器 GlobalFilter

无需在配置文件中配置,作用在所有的路由上,最终通过 GatewayFilterAdapter 包装成 GatewayFilterChain 可识别的过滤器,它为请求业务以及路由的 URI 转换为真实业务请求地址的核心过滤器,不需要配置系统初始化时加载,并作用在每个路由上

3、自定义过滤器

自定义网关过滤器

CustomGatewayFilter:实现接口: GatewayFilter,Ordered

import org.springframework.cloud.gateway.filter.GatewayFilter;
import org.springframework.cloud.gateway.filter.GatewayFilterChain;
import org.springframework.core.Ordered;
import org.springframework.web.server.ServerWebExchange;
import reactor.core.publisher.Mono;/*** Date: 2022-06-28 星期二* Time: 13:56* Author: Dily_Su* Remark: 自定义网关协议*/
public class CustomGatewayFilter implements GatewayFilter, Ordered {/*** 过滤器业务逻辑** @param exchange* @param chain* @return*/@Overridepublic Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {System.out.println("自定义网关过滤器被执行");return chain.filter(exchange);}/*** 过滤器执行顺序,数值越小,优先级越高** @return*/@Overridepublic int getOrder() {return 0;}
}

Configuration

import com.study.gateway.filter.CustomGatewayFilter;
import org.springframework.cloud.gateway.route.RouteLocator;
import org.springframework.cloud.gateway.route.builder.RouteLocatorBuilder;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;/*** Date: 2022-06-28 星期二* Time: 14:00* Author: Dily_Su* Remark:*/
@Configuration
public class GatewayRoutesConfiguration {@Beanpublic RouteLocator routeLocator(RouteLocatorBuilder builder) {return builder.routes().route("test1", r -> r// 断言(判断条件).path("/product/**")// 自定义网关过滤器.filters(f -> f.filter(new CustomGatewayFilter()))// 目标 URI 路由到服务器的地址.uri("lb://provider")).build();}
}
自定义全局过滤器

CustomGlobalFilter:实现接口: GatewayFilter,Ordered

import org.springframework.cloud.gateway.filter.GatewayFilterChain;
import org.springframework.cloud.gateway.filter.GlobalFilter;
import org.springframework.core.Ordered;
import org.springframework.core.io.buffer.DataBuffer;
import org.springframework.http.HttpStatus;
import org.springframework.http.MediaType;
import org.springframework.http.server.reactive.ServerHttpResponse;
import org.springframework.stereotype.Component;
import org.springframework.web.server.ServerWebExchange;
import reactor.core.publisher.Mono;
import java.nio.charset.StandardCharsets;/*** Date: 2022-06-28 星期二* Time: 14:55* Author: Dily_Su* Remark: 自定义全局过滤器* 统一鉴权*/
@Component
public class CustomGlobalFilter implements GlobalFilter, Ordered {/*** 过滤器业务逻辑** @param exchange* @param chain* @return*/@Overridepublic Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {System.out.println("自定义全局过滤器被执行");// 获取请求参数 String token = exchange.getRequest().getQueryParams().getFirst("token");// 业务处理if (token == null){ServerHttpResponse response = exchange.getResponse();// 响应类型response.getHeaders().add("Content-Type", MediaType.APPLICATION_JSON_VALUE);// 响应状态, 401 代表没权限response.setStatusCode(HttpStatus.UNAUTHORIZED);// 响应内容String message = "{\"message\":" + HttpStatus.UNAUTHORIZED.getReasonPhrase() + "\"}";DataBuffer buffer = response.bufferFactory().wrap(message.getBytes(StandardCharsets.UTF_8));// 请求结束return response.writeWith(Mono.just(buffer));}// 使用 token 进行身份验证System.out.println("验证通过");return chain.filter(exchange);}@Overridepublic int getOrder() {return 0;}
}

六、网关限流

顾名思义,限制流量,通过限流控制系统的QPS,从而保护系统

1、原因

  • 用户增长过快
  • 热点事件(如微博热搜)
  • 竞争对手爬虫
  • 恶意请求

2、限流算法

计算器算法

设置规定时间内请求数量

时间节点前后一起发送请求上限的请求,数量可能会超出,拖垮服务

资源浪费

漏桶算法(Leaky)

使用队列机制,请求进入网关不做限制,但是从网关访问下行服务时按规定速率请求

请求堆积,网关压力大,网关容易宕机

超出队列上限,可能导致请求丢失

微服务资源浪费

令牌桶算法(Token)

改进的漏桶算法,可以应对突发请求

1、网关恒定速率生成令牌放入令牌桶,桶满后丢弃令牌

2、请求到达后先获取令牌再做业务处理,没拿到令牌的请求丢弃

3、实例

通过 RequestRateLimiterGatewayFilterFactory 过滤工厂,使用Redis 和 lua 实现令牌桶

URI 限流

KeyResolverConfiguration

import org.springframework.cloud.gateway.filter.ratelimit.KeyResolver;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import reactor.core.publisher.Mono;/*** Date: 2022-06-28 星期二* Time: 16:45* Author: Dily_Su* Remark:*/
@Configuration
public class KeyResolverConfiguration {/*** 限流规则* URI 限流* @return*/@Beanpublic KeyResolver pathKeyResolver() {return exchange -> Mono.just(exchange.getRequest().getURI().getPath());}
}

application.yml

spring:application:name: gateway # 应用名称cloud:# 路由规则gateway:routes:- id: provider                                            # 路由 ID,唯一uri: lb://provider                                      # 根据注册中心动态路由predicates:                                             # 断言(判断条件)- Path=/product/**                                           # 匹配对应的 URL 请求,并追加到 URI 后filters:- name: RequestRateLimiterargs:redis-rate-limiter.replenishRate: 1  # 令牌每秒填充数量redis-rate-limiter.burstCapacity: 2  # 令牌桶总容量key-resolver: "#{@pathKeyResolver}"  # 使用 SpEL 表达式按名称引用 beanredis:host: localhost               # redis 地址port: 6379                    # 端口database: 1                   # database

redis 中的 令牌会自动清理

参数限流

KeyResolverConfiguration

import org.springframework.cloud.gateway.filter.ratelimit.KeyResolver;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import reactor.core.publisher.Mono;/*** Date: 2022-06-28 星期二* Time: 16:45* Author: Dily_Su* Remark: 限流规则* 下面 Bean 只能有一个*/
@Configuration
public class KeyResolverConfiguration {/*** 参数 限流** @return*/@Beanpublic KeyResolver parameterKeyResolver() {return exchange -> Mono.just(Objects.requireNonNull(exchange.getRequest().getQueryParams().getFirst("id")));}
}

application.yml

spring:application:name: gateway # 应用名称cloud:# 路由规则gateway:routes:- id: provider                                            # 路由 ID,唯一uri: lb://provider                                      # 根据注册中心动态路由predicates:                                             # 断言(判断条件)- Path=/product/**                                           # 匹配对应的 URL 请求,并追加到 URI 后filters:- name: RequestRateLimiterargs:redis-rate-limiter.replenishRate: 1       # 令牌每秒填充数量redis-rate-limiter.burstCapacity: 2       # 令牌桶总容量key-resolver: "#{@parameterKeyResolver}"  # 使用 SpEL 表达式按名称引用 beanredis:host: localhostport: 6379database: 1

IP 限流

KeyResolverConfiguration

import org.springframework.cloud.gateway.filter.ratelimit.KeyResolver;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import reactor.core.publisher.Mono;/*** Date: 2022-06-28 星期二* Time: 16:45* Author: Dily_Su* Remark: 限流规则* 下面 Bean 只能有一个*/
@Configuration
public class KeyResolverConfiguration {/*** IP 限流** @return*/@Beanpublic KeyResolver ipKeyResolver() {return exchange -> Mono.just(Objects.requireNonNull(exchange.getRequest().getRemoteAddress().getHostName()));}
}

application.yml

spring:application:name: gateway # 应用名称cloud:# 路由规则gateway:routes:- id: provider                                            # 路由 ID,唯一uri: lb://provider                                      # 根据注册中心动态路由predicates:                                             # 断言(判断条件)- Path=/product/**                                           # 匹配对应的 URL 请求,并追加到 URI 后filters:- name: RequestRateLimiterargs:redis-rate-limiter.replenishRate: 1  # 令牌每秒填充数量redis-rate-limiter.burstCapacity: 2  # 令牌桶总容量key-resolver: "#{@ipKeyResolver}"    # 使用 SpEL 表达式按名称引用 beanredis:host: localhostport: 6379database: 1

七、高可用网关

nginx + 网关集群 + docker部署

1、项目结构

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-isdc5lu2-1670555453111)(img/高可用网关项目结构.png)]

2、配置文件

parent 中的 pom.xml

<?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 https://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.6.8</version><relativePath/> <!-- lookup parent from repository --></parent><groupId>com.study</groupId><artifactId>parent</artifactId><version>0.0.1-SNAPSHOT</version><packaging>pom</packaging><!-- 版本控制 --><properties><java.version>11</java.version><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding><project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding><spring-cloud.version>2021.0.3</spring-cloud.version><packaging.type>jar</packaging.type><lombok.version>1.18.24</lombok.version><feign-httpClienr.version>10.7.4</feign-httpClienr.version><ribbon.version>2.7.18</ribbon.version></properties><!-- maven 仓库 --><repositories><repository><id>central</id><name>Nexus aliyun</name><url>https://maven.aliyun.com/repository/public</url></repository></repositories><!-- 依赖版本控制 --><dependencyManagement><dependencies><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><version>${lombok.version}</version><optional>true</optional></dependency><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-dependencies</artifactId><version>${spring-cloud.version}</version><type>pom</type><scope>import</scope></dependency><!--        Feign 使用 httpClient --><dependency><groupId>io.github.openfeign</groupId><artifactId>feign-httpclient</artifactId><version>${feign-httpClienr.version}</version></dependency><!--        ribbon 点对点直连 和 局部负载均衡 不可用--><dependency><groupId>com.netflix.ribbon</groupId><artifactId>ribbon-loadbalancer</artifactId><version>${ribbon.version}</version></dependency></dependencies></dependencyManagement><build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId><configuration><excludes><exclude><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId></exclude></excludes></configuration></plugin></plugins></build><!-- 项目打包配置 --><!-- 不同的打包方式,使用不同的配置文件 --><profiles><profile><id>docker</id><properties><activated.profile>docker</activated.profile><!-- redis连接,更改 application-docker.yml 中的值 --><redis.host>cloud-redis</redis.host><redis.port>6379</redis.port></properties><build><resources><resource><filtering>true</filtering><directory>src/main/resources</directory></resource></resources></build></profile><profile><id>dev</id><properties><activated.profile>dev</activated.profile><!-- redis连接,更改 application.yml 中的值 --><redis.host>localhost</redis.host><redis.port>6379</redis.port></properties><build><resources><resource><filtering>true</filtering><directory>src/main/resources</directory><excludes><exclude>application-docker.*</exclude></excludes></resource></resources></build></profile></profiles>
</project>

nginx.conf

# nginx 配置文件:负载均衡默认为轮询
worker_processes 1;events { worker_connections 1024; }http {include    /etc/nginx/mime.types;sendfile   on;proxy_buffer_size   128k;proxy_buffers   4 256k;proxy_busy_buffers_size   256k;client_max_body_size   100m;# 网关集群upstream gateway {# docker 中 localhost 为 镜像容器名server gateway-01:9000;server gateway-02:9001;}server {listen 8080;location / {# 将所有请求指向 网关集群proxy_pass http://gateway;}}
}

dockerFile

# 每个微服务根目录下都要放置一个,用于将打包好的 jar 整理为 docker image
# jdk 版本不能低于自己编译时的版本,否则 docker 启动会报错
FROM openjdk:11.0.15-jre
ARG JAR_FILE=target/*.jar
COPY ${JAR_FILE} app.jar
WORKDIR /
ENTRYPOINT ["java","-jar","/app.jar"]

docker-compose.yml

version: "3.7"
services:redis:image: redis:latest  # 从 docker hub 中 pull 最新的 redis imagecontainer_name: cloud-redis # docker 中的容器名称ports:               # 对外映射的端口,占用容器内的 6379,本机的26379,不想对外暴漏时,可以省略- "26379:6379"networks:            # 容器内网关,用于容器内镜像互相调用- backendenvironment:         # 设置时区- TZ=Asia/Shanghaierurka-01:build: ./eureka01    # build 存在时,表示从该目录下获取镜像名称image: cloud/eureka01:latest # 镜像名称container_name: eureka-01 # 容器名称ports:- "28761:8761"networks:- backendenvironment:- TZ=Asia/Shanghaierurka-02:build: ./eureka02image: cloud/eureka02:latestcontainer_name: eureka-02ports:- "28762:8762"networks:- backendenvironment:- TZ=Asia/Shanghaigateway-01:build: ./gateway01image: cloud/gateway01:latestcontainer_name: gateway-01networks:- backendenvironment:- TZ=Asia/Shanghaigateway-02:build: ./gateway02image: cloud/gateway02:latestcontainer_name: gateway-02networks:- backendenvironment:- TZ=Asia/Shanghaiprovider-01:build: ./provider01image: cloud/provider01:latestcontainer_name: provider-01networks:- backendenvironment:- TZ=Asia/Shanghaiprovider-02:build: ./provider02image: cloud/provider02:latestcontainer_name: provider-02networks:- backendenvironment:- TZ=Asia/Shanghaiconsumer-eureka:build: ./consumer-eurekaimage: cloud/consumer-eureka:latestcontainer_name: consumer-eurekanetworks:- backendenvironment:- TZ=Asia/Shanghaiconsumer-eureka-feign:build: ./consumer-eureka-feignimage: cloud/consumer-eureka-feign:latestcontainer_name: consumer-eureka-feignnetworks:- backendenvironment:- TZ=Asia/Shanghainginx:image: nginxcontainer_name: cloud-demo-nginxvolumes:- ./nginx.conf:/etc/nginx/nginx.confports:- 28080:8080restart: unless-stoppednetworks:- backendnetworks: # 该微服务项目在容器中的网关backend: name: cloud-demo

3、docker 部署

Maven 打包

# 清理 targer 文件,并按照 按照 docker 配置 打包mvn clean package -P docker -DskipTests

docker部署

# build image 并 生成容器,启动 image
docker compose up -d

Spring cloud Gateway 服务网关 实战相关推荐

  1. Spring Cloud —— Gateway 服务网关

    导航 一.什么是服务网关 二.业界常见网关组件 三.Spring Cloud Gateway 四.Gateway 快速入门 4.1 创建 gateway 服务 4.2 添加 gateway 依赖和 n ...

  2. 《Spring Cloud微服务架构实战派》PDF样章

    内容摘要: 本书针对Spring Cloud Greenwich.SR2版本+Spring Boot的2.1.x.RELEASE版本.在编写过程中,不仅考虑到在企业任职所需的技能,还考虑到求职面试时可 ...

  3. 疯狂Spring Cloud微服务架构实战

    网站 更多书籍点击进入>> CiCi岛 下载 电子版仅供预览及学习交流使用,下载后请24小时内删除,支持正版,喜欢的请购买正版书籍 电子书下载(皮皮云盘-点击"普通下载" ...

  4. Spring Cloud(六) 服务网关GateWay 入门

    前文回顾: Spring Cloud(一)Eureka Server-单体及集群搭建 Spring Cloud(二) 配置Eureka Client Spring Cloud(三) 熔断器Hystri ...

  5. Spring Cloud 微服务网关Gateway组件

    一.网关介绍 大家都知道在微服务架构中,一个系统会被拆分为多个微服务,那么作为客户端如何去调用这么多的微服务呢?如果没有网关的存在,我们只能在客户端记录每个微服务的地址,然后分别去用. 这样的架构会存 ...

  6. spring cloud gateway nacos 网关设置

    前期准备:可参考上一篇,spring cloud nacos 服务提供.服务消费(Feign.RestTemplate)及Hystrix熔断设置 1.下载安装 Nacos 服务中心(下载地址 http ...

  7. Spring Cloud Gateway 替换 Nginx 实战

    一 搭建 server-dataway 微服务 二 引入 pom文件 <?xml version="1.0" encoding="UTF-8"?> ...

  8. Spring Cloud 微服务开发实战

    为什么要学习微服务? 1. 求职时增强技术自信. 微服务是非常热门的话题,企业招聘中也越来越多的要求有微服务开发.架构能力,不掌握一些微服务技能找工作时也缺乏亮点,可以说微服务架构已经成为中高级后端开 ...

  9. Spring Cloud微服务网关Zuul过滤链和整合OAuth2+JWT入门实战

    一.Spring Cloud Zuul 过滤链 1.1 工作原理 Zuul的核心逻辑是由一系列的Filter来实现的,他们能够在进行HTTP请求或者相应的时候执行相关操作.Zuul Filter的主要 ...

最新文章

  1. J2EE的13种核心技术规范
  2. java nio nio2 区别_Java NIO2:NIO概述
  3. arduino上ESP8266用Adafruit_SSD1306库驱动OLED屏
  4. QML基础类型之vector4d
  5. Android TabHost和xml定义Menu应用
  6. WAMP(Windows+Apache+Mysql+PHP)环境搭建
  7. Android ROM DIY之MTK平台手机通用移植 (续)
  8. JSOI2009 BZOJ2257 瓶子和燃料
  9. 【技术】Java打印菱形
  10. 专业的格式转换工具pdf2cad发布v11,支持当前所有的Windows和Mac操作系统
  11. 压力传感器常用的3种检测方法
  12. 必应搜索结果跳转百度
  13. 2018 PKU_WC 长沙游 《我到长沙来看雪》
  14. C我语言编程老鼠寻路,数据结构课设-走迷宫游戏.doc
  15. 机器人运动控制-水下机器人
  16. 16、OSPF配置实验之LSDB过载保护
  17. 计算机文字录入培训大纲,计算机文字录入处理员教学大纲.doc
  18. 各星座导演与他们的电影风格【转】]
  19. 金融工程学(一):概述
  20. 点击按钮复制文本框内容

热门文章

  1. ArcGIS地图制作的注记、格网添加
  2. sr650安装linux网卡驱动,Lenovo SR650安装Windows Server 2012之Solarflare驱动导致系统异常...
  3. 使用API进行微信群管理开发
  4. AI 与经济生产力的这场革命,怕是革不动
  5. 【分布式mysql分库分表中间件sharding】
  6. SIEMENS SIMATIC STEP 7 v5.7 Professional 2021
  7. Web表单的十九个最佳设计实践
  8. 如何端正的去学好编程
  9. OpenCV视频剪切
  10. vscode+cmake多文件编译C++