1. 场景描述
springcloud 刚推出的时候用的是 netflix 全家桶, 路由用的 zuul(springcloud - 路由 Zull), 但是据说 zull1.0 在大数据量访问的时候存在较大性能问题, 2.0 就没集成到 springcloud 中了, springcloud 推出了自己的路由 - springcloud gateway, 亲儿子, 目前官网主推.
netfelix 的 zull 路由:
- <dependency>
- <groupId>org.springframework.cloud</groupId>
- <artifactId>spring-cloud-starter-netflix-zuul</artifactId>
- </dependency>
2. 解决方案
2.1 新建 springboot 项目
在 springcloud 项目中, 新建的项目全部是基于 springboot 的 (springboot 与 springcloud 的关系), 新建 springboot 项目再啰嗦一遍吧 (springboot 项目快速搭建)
2.1.1 new->project
next->next 更改下项目名称.
2.1.2 选择组件
(1) 注册中心客户端
(2) 选择 springcloud gateway
next->next, 完成.
2.2 类目录图
开始介绍 springcloud-gateway, 为了区分上一篇的关于 zull 的介绍, 项目名称设置为 springgate.
2.3 重点还是三个文件
2.3.1 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 http://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.1.5.RELEASE</version>
- <relativePath/> <!-- lookup parent from repository -->
- </parent>
- <groupId>com.yutong</groupId>
- <artifactId>springgateway</artifactId>
- <version>0.0.1-SNAPSHOT</version>
- <name>springgateway</name>
- <description>Demo project for Spring Boot</description>
- <properties>
- <java.version>1.8</java.version>
- <spring-cloud.version>Greenwich.SR1</spring-cloud.version>
- </properties>
- <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>org.springframework.boot</groupId>
- <artifactId>spring-boot-starter-test</artifactId>
- <scope>test</scope>
- </dependency>
- </dependencies>
- <dependencyManagement>
- <dependencies>
- <dependency>
- <groupId>org.springframework.cloud</groupId>
- <artifactId>spring-cloud-dependencies</artifactId>
- <version>${spring-cloud.version}</version>
- <type>pom</type>
- <scope>import</scope>
- </dependency>
- </dependencies>
- </dependencyManagement>
- <build>
- <plugins>
- <plugin>
- <groupId>org.springframework.boot</groupId>
- <artifactId>spring-boot-maven-plugin</artifactId>
- </plugin>
- </plugins>
- </build>
- </project>
说明, 重点就两个 starter:
(1)gateway, 不同于 zull, 这个是直接位于 spring-cloud 下面, 是 springcloud 的嫡系部队.
(2) 注册中心客户端, 不多说了
2.3.2 启动类 application
- package com.yutong.springgateway;
- import org.springframework.beans.factory.annotation.Value;
- import org.springframework.boot.SpringApplication;
- import org.springframework.boot.autoconfigure.SpringBootApplication;
- import org.springframework.cloud.gateway.route.RouteLocator;
- import org.springframework.cloud.gateway.route.builder.RouteLocatorBuilder;
- import org.springframework.context.annotation.Bean;
- @SpringBootApplication
- public class SpringgatewayApplication {
- @Value("${test.uri}")
- private String uri;
- @Bean
- public RouteLocator customRouteLocator(RouteLocatorBuilder builder) {
- return builder.routes()
- //basic proxy
- .route(r -> r.path("/**")
- .uri(uri)
- ).build();
- }
- public static void main(String[] args) {
- SpringApplication.run(SpringgatewayApplication.class, args);
- }
- }
说明:
(1) 不同于路由 zull, 需要 zull 的标签, 这里只需要 springboot 的启动标签 @SpringBootApplication 就可以了.
(2) 增加 @Bean 标签, RouteLocator 是路由规则, 这个稍微复杂点, 示例中只做了简单配置, 路由规则用于过滤控制路由等, 可根据具体需求, 参考路由规则 API 进行设置.
2.3.3 配置类 application.YAML
- test:
- uri: lb://client
- spring:
- application:
- name: springgateway
- cloud:
- gateway:
- discovery:
- locator:
- lower-case-service-id: true
- eureka:
- client:
- service-url:
- defaultZone: http://localhost:8761/eureka
- server:
- port: 9000
说明:
(1) 第一行的 uri 在启动类 application 中用到, 指访问的客户端服务, client 为注册中心客户端服务名称.
(2)defaultZone 为注册中心地址.
(3) 为了区分介绍 zull 的项目, name 设置为: springgateway
2.3.4 效果图
(1) 注册中心
(2) 路由 springcloud gateway 访问
说明:
路由访问的时候不需要指定客户端名称 client, 因为在 gateway 启动类中已经指定过了.
I'm 软件老王, 如果觉得还可以的话, 关注下呗! 如有不准确或疑问的地方, 可通过讨论区, QQ 沟通, 多谢!
来源: https://www.cnblogs.com/ruanjianlaowang/p/11197118.html