欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

分布式电商项目十二:使用Gateway作为API网关

程序员文章站 2022-04-14 23:21:20
...

使用Gateway作为API网关

Gateway是springcloud官方推出的第二代网关框架,替换了Zuul网关。
具体内容可以参考官方文档
工作原理:
分布式电商项目十二:使用Gateway作为API网关
客户端先将请求发给我们的网关,网关通过映射信息,判断能够被处理和路由,随后进入Web Handler处理,之后给到过滤器中,通过过滤之后到达微服务的服务端。

Gateway使用主要分为两部分:路由工厂过滤器工厂
具体可以参考链接中的文档。

创建Gateway作为API网关

新建一个springboot模块作为我们的API网关:
分布式电商项目十二:使用Gateway作为API网关
随后选择springboot版本,添加Gateway网关模块:
分布式电商项目十二:使用Gateway作为API网关
随后修改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命名空间
分布式电商项目十二:使用Gateway作为API网关
同时添加信息到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即可正常访问。

至此我们的网关已经能够正常使用了,具体的使用内容我们到项目开发时再进行。

相关标签: 电商