Spring Cloud Gateway
Spring Cloud Gateway早就被玩烂了,所以这篇也不是什么教程,顶多算是个人总结/记录而已。
由来是因为要用Swagger,但是面向服务的系统,如果只是单独的集成Swagger就显得很混乱,所以需要Knife4j的分布式文档支持。
从我的理解上来讲,Gateway的作用就如同Nginx,是一个独立的服务,用来将所有的请求进行过滤、转发。从目前我使用的情况来看,它与其它服务是解耦的,无侵入的。
新建一个SpringBoot工程,pom文件主体如下:
<!-- spring cloud gateway -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-gateway</artifactId>
</dependency>
<!--服务注册与发现-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-nacos-discovery</artifactId>
</dependency>
入口类的代码如下:
@SpringBootApplication
@EnableDiscoveryClient
public class ExampleGatewayApp {
public static void main(String[] args) {
SpringApplication.run(ExampleGatewayApp.class, args);
}
@Bean
LoadBalancerInterceptor loadBalancerInterceptor(LoadBalancerClient loadBalance) {
return new LoadBalancerInterceptor(loadBalance);
}
}
yml配置文件如下:
server:
port: 8082
compression:
enabled: true
mime-types: application/json,application/xml,text/html,text/xml,text/plain
spring:
http:
encoding:
charset: UTF-8
application:
name: examples-gateway
cloud:
nacos:
discovery:
server-addr: localhost:8848
gateway:
discovery:
locator:
enabled: true
routes:
- id: examples-service-http-provider-route
uri: lb://examples-service-http-provider
predicates:
- Path=/http-service/**
filters:
- StripPrefix=1
main:
allow-bean-definition-overriding: true
然后,运行,一个网关服务就运行起来了。作为一个示例项目,确实非常简单。
yml里面的spring.cloud.gateway就是网关的主要配置。
discovery.locator.enabled为true,代表自动发现服务,比如这个示例的Nacos注册了一个标识为examples-service-http-provider的服务,就可以使用http://localhost:8082/examples-service-http-provider/*来访问服务内的接口。
routes,代表路由配置信息。
1. uri中的lb代表负载均衡,指的是LoadBalanced。
2. predicates指的是需要转发的路径配置。
3. StripPrefix代表转发时,需要忽略的前缀。
这里配置的就是将所有http://localhost:8082/http-service/**的请求,通过负载均衡转发到http://examples-service-http-provider/**。
如果没有配置StripPrefix,就会转发到http://examples-service-http-provider/http-service/**(最开始我就在这里掉坑里了)。
目前为止,基本上就是这样,如有错误,欢迎指正。
