分布式电商项目十二:使用Gateway作为API网关
使用Gateway作为API网关
Gateway是springcloud官方推出的第二代网关框架,替换了Zuul网关。
具体内容可以参考官方文档
工作原理:
客户端先将请求发给我们的网关,网关通过映射信息,判断能够被处理和路由,随后进入Web Handler处理,之后给到过滤器中,通过过滤之后到达微服务的服务端。
Gateway使用主要分为两部分:路由工厂和过滤器工厂
具体可以参考链接中的文档。
创建Gateway作为API网关
新建一个springboot模块作为我们的API网关:
随后选择springboot版本,添加Gateway网关模块:
随后修改pom文件,由于需要使用Nacos的服务注册功能,所以我们添加common的依赖。
<dependency>
<groupId>com.lastingwar.mall</groupId>
<artifactId>mall-common</artifactId>
<version>0.0.1-SNAPSHOT</version>
</dependency>
随后我们开启注册服务的注解:
@EnableDiscoveryClient
@SpringBootApplication
public class MallGatewayApplication {
public static void main(String[] args) {
SpringApplication.run(MallGatewayApplication.class, args);
}
}
同时在mall-gateway/src/main/resources/application.properties 配置文件中添加连接注册中心的内容:
spring.cloud.nacos.discovery.server-addr=127.0.0.1:8848
spring.application.name=mall-gateway
server.port=88
因为在上一章中,我们已经使用Nacos来进行配置中心的集中配置,所以我们给网关模块也新建配置文件bootstrap.properties。
现状Nacos命名空间中创建gateway命名空间
同时添加信息到bootstrap.properties中:让他能够使用Nacos配置中心的配置文件
spring.application.name=mall-gateway
spring.cloud.nacos.config.server-addr=127.0.0.1:8848
spring.cloud.nacos.config.namespace=8051481d-811d-41de-be2f-79f02792bb54
此时如果启动该程序,系统会报错
Description:
Failed to configure a DataSource: 'url' attribute is not specified and no embedded datasource could be configured.
Reason: Failed to determine a suitable driver class
Action:
Consider the following:
If you want an embedded database (H2, HSQL or Derby), please put it on the classpath.
If you have database settings to be loaded from a particular profile you may need to activate it (no profiles are currently active).
这是由于网关服务依赖了common模块,而common模块在进行mybatis-plus构建的时候发现没有关于数据库的配置地址。而我们的网关服务目前不需要数据库相关的配置,所以我们在主程序上添加注解,忽略掉有关数据库的配置:
@EnableDiscoveryClient
@SpringBootApplication(exclude = {DataSourceAutoConfiguration.class})
public class MallGatewayApplication {
public static void main(String[] args) {
SpringApplication.run(MallGatewayApplication.class, args);
}
}
随后再启动gateway模块,通过控制台能看到已经在88端口启动了:
2020-05-30 17:12:16.163 INFO 14744 --- [ main] o.s.b.web.embedded.netty.NettyWebServer : Netty started on port(s): 88
2020-05-30 17:12:17.517 INFO 14744 --- [ main] o.s.cloud.commons.util.InetUtils : Cannot determine local hostname
2020-05-30 17:12:17.733 INFO 14744 --- [ main] c.a.c.n.registry.NacosServiceRegistry : nacos registry, mall-gateway 192.168.222.1:88 register finished
2020-05-30 17:12:17.736 INFO 14744 --- [ main] c.l.mall.gateway.MallGatewayApplication : Started MallGatewayApplication in 11.12 seconds (JVM running for 11.89)
Gateway使用的测试
接下来我们利用网关来开发一个小功能进行测试,当我们访问http://localhost:88/hello?url=baidu时,让网关跳转到www.baidu.com。
首先我们需要对网关进行配置
配置的方法参考官方文档,官方推荐我们使用yml文件进行配置,所以我们创建一个文件application.yml在mall-gateway/src/main/resources目录下:
spring:
cloud:
gateway:
routes:
- id: baidu_route
uri: https://www.baidu.com
predicates:
- Query=url,baidu
- id: qq_route
uri: https://www.qq.com
predicates:
- Query=url,qq
routes是指我们配置的是路由规则,它是一个列表能够配置多种规则,id是路由的名称,uri是转向的地址,predicates是路由规则,同样是一个列表,Query是官方提供的路由规则的一种,内容匹配,指我们访问的内容之中包含有url的参数,且值等于baidu时,访问地址https://www.baidu.com
此时重启服务,我们访问http://localhost:88/hello?url=baidu时,让网关跳转到www.baidu.com。会发现能够跳转到百度页面,但是会出现网页不存的标语。这是因为网关把我们写入的/hello请求也转入到了要访问的地址中,相当于我们访问了http://www.baidu.com/hello页面。
修改访问地址为http://localhost:88?url=baidu即可正常访问。
至此我们的网关已经能够正常使用了,具体的使用内容我们到项目开发时再进行。
上一篇: MySQL调优系列:慢查询记录
下一篇: 电商项目(四)--后台系统架构初步搭建