springcloud整合geteway网关服务

geteway网关

1. 什么是 API 网关(API Gateway)
分布式服务架构、微服务架构与 API 网关
在微服务架构里,服务的粒度被进一步细分,各个业务服务可以被独立的设计、开发、测试、部署和管理。这时,各个独立部署单元可以用不同的开发测试团队维护,可以使用不同的编程语言和技术平台进行设计,这就要求必须使用一种语言和平 台无关的服务协议作为各个单元间的通讯方式。

 

API 网关的定义
网关的角色是作为一个 API 架构,用来保护、增强和控制对于 API 服务的访问。

API 网关是一个处于应用程序或服务(提供 REST API 接口服务)之前的系统,用来管理授权、访问控制和流量限制等,这样 REST API 接口服务就被 API 网关保护起来,对所有的调用者透明。因此,隐藏在 API 网关后面的业务系统就可以专注于创建和管理服务,而不用去处理这些策略性的基础设施。

2. Gateway是什么
Spring Cloud Gateway是Spring官方基于Spring 5.0,Spring Boot 2.0和Project Reactor等技术开发的网关,Spring Cloud Gateway旨在为微服务架构提供一种简单而有效的统一的API路由管理方式。Spring Cloud Gateway作为Spring Cloud生态系中的网关,目标是替代ZUUL,其不仅提供统一的路由方式,并且基于Filter链的方式提供了网关基本的功能,例如:安全,监控/埋点,和限流等。

3. 为什么用Gateway
Spring Cloud Gateway 可以看做是一个 Zuul 1.x 的升级版和代替品,比 Zuul 2 更早的使用 Netty 实现异步 IO,从而实现了一个简单、比 Zuul 1.x 更高效的、与 Spring Cloud 紧密配合的 API 网关。
Spring Cloud Gateway 里明确的区分了 Router 和 Filter,并且一个很大的特点是内置了非常多的开箱即用功能,并且都可以通过 SpringBoot 配置或者手工编码链式调用来使用。
比如内置了 10 种 Router,使得我们可以直接配置一下就可以随心所欲的根据 Header、或者 Path、或者 Host、或者 Query 来做路由。
比如区分了一般的 Filter 和全局 Filter,内置了 20 种 Filter 和 9 种全局 Filter,也都可以直接用。当然自定义 Filter 也非常方便。

geteway最重要的3个概念:

route(路由)

predicate(断言)

filter(过滤)

4. Gateway怎么用

话不多说了 直接上代码:

1 在cloud工程下建 springboot工程

pom:

<?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>
<artifactId>springcloud-parent</artifactId>
<groupId>com.atnicong</groupId>
<version>0.0.1-SNAPSHOT</version>
</parent>
<groupId>com.example</groupId>
<artifactId>cloudgeteway</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>cloudgeteway</name>
<description>Demo project for Spring Boot</description>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-gateway</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>

<dependency>
<groupId>io.projectreactor.netty</groupId>
<artifactId>reactor-netty</artifactId>
<version>0.9.2.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>

<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>

</project>

说一下工程的jar包 geteway起步依赖和eureka起步依赖没什么好说的
我的springboot用的2.2.3 cloud用的
Hoxton.SR1版本 现在问题就出现了 这个环境下的工程整合geteway网关的时候会报错,找不到这个bean对线,springboot版本升级后的一个bug,我也是踩了好长的时间才出来的
后面建工程的兄弟要注意了啊 解决的方案就是加上一个netty的依赖 pomp标红了 再启动就没有什么问题了

application.yml

server:
port: 9527

spring:
application:
name: cloudgeteway #在注册中心上的名字
cloud:
gateway:
routes:
- id: proivde1 #这个睡意 保证唯一就好
uri: lb://myProvide #myProvide 代表eureka注册中心上其他的服务
predicates:
- Path=/nicong/user/** # 断言 代表匹配的路径 如果匹配就拼接上面的IP和端口进行访问
discovery:
locator:
enabled: true #discovery下的locator默认是false,所以手动指定为true discovery其实是服务注册的发现组件,通过discovery发现注册的服务的name来找到注册中心的服务
lower-case-service-id: true #通过小写字母来寻找注册在注册中心的服务

eureka:
client:
service-url:
defaultZone: http://eureka-server1:8761/eureka/
instance:
prefer-ip-address: true
主启动类:
@SpringBootApplication
@EnableEurekaClient
@EnableDiscoveryClient
public class CloudgetewayApplication {

public static void main(String[] args) {
SpringApplication.run(CloudgetewayApplication.class, args);
}

}
就完成了  分别启动eureka 服务提供工程   geteway服务就OK了


 gateway:
routes:
- id: proivde1 #这个睡意 保证唯一就好
uri: lb://myProvide #myProvide 代表eureka注册中心上其他的服务
predicates:
- Path=/nicong/user/** # 断言 代表匹配的路径 如果匹配就拼接上面的IP和端口进行访问
这种配置同样可以用配置类来实现的:
@Configuration
public class GetewayConfig {

@Bean
public RouteLocator custonRouteLocator(RouteLocatorBuilder builder){
RouteLocatorBuilder.Builder routes = builder.routes();

RouteLocator build = routes.route("provide1", r ->
r.path("/nicong/user/**").uri("lb://myProvide")).build();

return build;
}

}
效果一模一样


接下来看一下全局的过滤器:
说白了实现2个接口就可以了 上代码


@Component
public class Myfilter implements GlobalFilter, Ordered {
@Override
public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
System.out.println("进入到过滤器了啊");
String name = exchange.getRequest().getQueryParams().getFirst("name");
if (name == null){
exchange.getResponse().setStatusCode(HttpStatus.FORBIDDEN);
return exchange.getResponse().setComplete();
}
return chain.filter(exchange); //放行
}

@Override
public int getOrder() {
return 0; //代表优先级
}
}
一般用做 日志的记录和鉴权功能偏多


这些就是平常开发中用到的功能点,记录一下,有误的地方请指正














原文地址:https://www.cnblogs.com/niCong/p/15408854.html