微服务下使用网关 Spring Cloud Gateway
2018-06-29 06:16:13来源:博客园 阅读 ()
Spring Cloud Gateway 工作原理
客户端向 Spring Cloud Gateway 发出请求,如果请求与网关程序定义的路由匹配,则将其发送到网关 Web 处理程序,此处理程序运行特定的请求过滤器链。
过滤器之间用虚线分开的原因是过滤器可能会在发送代理请求之前或之后执行逻辑。所有 "pre" 过滤器逻辑先执行,然后执行代理请求,代理请求完成后,执行 "post" 过滤器逻辑。
如何启动 Spring Cloud Gateway
1、新建 Maven 工程,添加相关依赖 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> <groupId>com.anoyi</groupId> <artifactId>core-gateway</artifactId> <version>0.0.1-SNAPSHOT</version> <name>core-gateway</name> <description>gateway for miroservice</description> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding> <java.version>1.8</java.version> </properties> <dependencyManagement> <dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-gateway</artifactId> <version>2.0.0.RELEASE</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement> <dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-gateway</artifactId> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build> </project>
2、添加启动类 Application.java
import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.context.annotation.Configuration; @Configuration @SpringBootApplication public class Application { public static void main(String[] args) { SpringApplication.run(Application.class, args); } }
3、启动 Application(和 Spring Boot 项目一样)
访问 http://localhost:8080/ 报错 404,同时日志输出:
2018-06-27 09:18:48.981 WARN 44156 --- [ctor-http-nio-2] .a.w.r.e.DefaultErrorWebExceptionHandler : Failed to handle request [GET http://localhost:8080/]: Response status 404
配置服务的路由:配置文件方式
假设本地启动了另外两个 Spring Boot 服务,分别是 服务A( http://localhost:8081 )、服务B( http://localhost:8082 ),下面通过 Spring Cloud Gateway 来路由到这两个服务。
1、在 resources 路径下添加配置文件 application.yml
spring: cloud: gateway: routes: - id: host_route uri: http://localhost:8081 predicates: - Path=/a/** filters: - StripPrefix=1 - id: host_route uri: http://localhost:8082 predicates: - Path=/b/** filters: - StripPrefix=1
id:固定,不同 id 对应不同的功能,可参考 官方文档
uri:目标服务地址
predicates:路由条件
filters:过滤规则
2、重启 Gateway 服务
3、测试
访问 http://localhost:8080/a/ 路由到 服务A http://localhost:8081/
访问 http://localhost:8080/b/ 路由到 服务B http://localhost:8082/
其他地址,例如 http://localhost:8080/a/user/all 路由到 服务A http://localhost:8081/user/all
配置服务的路由:编码方式
实现如上服务路由,还可以通过编码的方式实现。
1、删除配置文件 application.yml
2、修改 Application.java, 添加自定义路由配置
import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cloud.gateway.filter.factory.StripPrefixGatewayFilterFactory; import org.springframework.cloud.gateway.route.RouteLocator; import org.springframework.cloud.gateway.route.builder.RouteLocatorBuilder; import org.springframework.context.annotation.Bean; @SpringBootApplication public class Application { @Bean public RouteLocator customRouteLocator(RouteLocatorBuilder builder) { StripPrefixGatewayFilterFactory.Config config = new StripPrefixGatewayFilterFactory.Config(); config.setParts(1); return builder.routes() .route("host_route", r -> r.path("/a/**").filters(f -> f.stripPrefix(1)).uri("http://localhost:8081")) .route("host_route", r -> r.path("/b/**").filters(f -> f.stripPrefix(1)).uri("http://localhost:8082")) .build(); } public static void main(String[] args) { SpringApplication.run(Application.class, args); } }
其他功能
http://cloud.spring.io/spring-cloud-gateway/single/spring-cloud-gateway.html
官方提供了大量的路由规则,比如Time、Host、Header 等等,同时也提供了大量的过滤器,比如AddRequestHeader、AddRequestParameter、AddResponseHeader 等等。仅通过简单的配置即可实现功能强大的网关服务。
推荐阅读:https://www.roncoo.com/course/view/ad054a612db54315927a232ea722a03b
文章来源:https://www.jianshu.com/p/1c942a8abe18?utm_source=desktop&utm_medium=timeline
标签:
版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有
上一篇:AOP的实现
- 聊聊微服务架构及分布式事务解决方案! 2020-06-10
- java环境教程:Tomcat下载,安装,设置为Windows服务,启动 2020-06-09
- 聊聊 OAuth 2.0 的 token expire_in 使用 2020-06-08
- Spring Cloud微服务(一):公共模块的搭建 2020-06-07
- 为什么阿里巴巴Java开发手册中强制要求接口返回值不允许使用 2020-06-06
IDC资讯: 主机资讯 注册资讯 托管资讯 vps资讯 网站建设
网站运营: 建站经验 策划盈利 搜索优化 网站推广 免费资源
网络编程: Asp.Net编程 Asp编程 Php编程 Xml编程 Access Mssql Mysql 其它
服务器技术: Web服务器 Ftp服务器 Mail服务器 Dns服务器 安全防护
软件技巧: 其它软件 Word Excel Powerpoint Ghost Vista QQ空间 QQ FlashGet 迅雷
网页制作: FrontPages Dreamweaver Javascript css photoshop fireworks Flash