网关是微服务最边缘的服务,直接暴露给用户,用来做用户和微服务的桥梁。
Gateway是Spring官方提供的用来代替zuul的网关组件
核心逻辑:路由转发 + 执行过滤器链
路由信息的组成: 由一个 ID、一个目的 URL、一组断言工厂、一组 Filter 组成。 如果路由断言为真,说明请求 URL 和配置路由匹配。
一个标准的 Spring WebFilter。 Web 三大组件(servlet listener filter) mvc interceptor
Spring Cloud Gateway 中的 Filter 分为两种类型的 Filter,分别是 Gateway Filter 和 Global Filter。过滤器 Filter 将会对请求和响应进行修改处理。
一个是针对某一个路由(路径)的 filter 对某一个接口做限流
一个是针对全局的 filter token ip 黑名单
1.创建一个Maven项目,之后创建一个Spring Boot项目,添加web依赖
写properties文件,修改启动类名称
# 应用名称
spring.application.name=02-login-service
# 应用服务 WEB 访问端口
server.port=8081
@RestController
public class LoginController {
@GetMapping("doLogin")
public String doLogin(String name,String pwd){
System.out.println(name);
System.out.println(pwd);
//token
String token = UUID.randomUUID().toString();
return token;
}
}
2.创建gateway,添加gateway依赖,注意不可以选择web依赖,web默认是tomcat服务器,gateway默认是netty服务器
修改spring boot版本号,修改启动类名称
修改ym文件
server:
port: 80 # 网关一般是80
spring:
application:
name: gateway-server
cloud:
gateway:
discovery:
locator:
enabled: true # 只要加了依赖默认开启
routes:
- id: login-service-route # 路由id,保持唯一
uri: http://localhost:8081 # uri同一资源定位符
predicates:
- Path=/doLogin # 匹配规则,只要路径匹配上/doLogin,就会往uri转发,并且将路径带上
这样配置,访问80下的/doLogin,会转到8081下的/doLogin
测试:
nginx 拖两个tomcat
upstream www.gateway.com{
server ip:port;
server ip:prot;
}
server{
listen 8080;
server_name loaclhost
…
localtion/{
proxy_pass www.gateway.com;
}
}
创建一个config类,添加config的注解
@Configuration
public class RouteConfig {
}
去spring cloud官网查看gateway
https://spring.io/projects/spring-cloud-gateway
模仿代码模式,写一个访问b站的网关
@Configuration
public class RouteConfig {
@Bean
public RouteLocator customRouteLocator(RouteLocatorBuilder builder) {
return builder.routes()
.route("guochaung-id",r -> r.path("/anime").uri("https://www.bilibili.com"))
.route("movie-id",r -> r.path("/movie").uri("https://www.bilibili.com"))
.route("variety-id",r -> r.path("/variety").uri("https://www.bilibili.com"))
.build();
}
}
测试:
若在https://www.bilibili.com后面添加好/movie,则不会将前面的在往后面拼接
可以给路径加一个前缀
server:
port: 80 # 网关一般是80
spring:
application:
name: gateway-server
cloud:
gateway:
enabled: true # 只要加了依赖默认开启
routes:
- id: login-service-route # 路由id,保持唯一
uri: http://localhost:8081 # uri同一资源定位符
predicates:
- Path=/service/** # 匹配规则,只要路径匹配上/doLogin,就往uri转发,并且将路径带上
这样就可以随意更改访问的路径,最后都会带着service/path一起拼接到http://localhost:8081后面去
需要结合注册发现中心,思路是将gateway也注册到注册中心,这样就可以获取所有服务的名称,在访问时带上服务名称实现负载均衡
注意:使用可负载均衡的动态路由,因为gateway会从Eureka中服务名等信息,所以不需要对访问路径进行配置,当然配置上也不会冲突。
1.修改gateway
首先给网关添加Eureka依赖,修改对应版本号
<dependency>
<groupId>org.springframework.cloudgroupId>
<artifactId>spring-cloud-starter-netflix-eureka-clientartifactId>
dependency>
在yml中配置eureka,并开启动态路由
server:
port: 80 # 网关一般是80
spring:
application:
name: gateway-server
cloud:
gateway:
enabled: true # 只要加了依赖默认开启
discovery:
locator:
enabled: true # 开启动态路由
lower-case-service-id: true # 开启小写
eureka:
client:
service-url:
defaultZone: http://localhost:8761/eureka
在启动类中添加开启Eureka客户端注解
@EnableEurekaClient
2.修改login-service
在pom中添加eureka依赖,cloud版本控制,并修改对应版本号
<dependency>
<groupId>org.springframework.cloudgroupId>
<artifactId>spring-cloud-starter-netflix-eureka-clientartifactId>
dependency>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloudgroupId>
<artifactId>spring-cloud-dependenciesartifactId>
<version>${spring-cloud.version}version>
<type>pomtype>
<scope>importscope>
dependency>
dependencies>
dependencyManagement>
配置yml,启动类中添加开启Eureka客户端注解
eureka:
client:
service-url:
defaultZone: http://localhost:8761/eureka
spring:
application:
name: 02-login-service
server:
port: 8081