专栏首页码农UP2USpring Cloud Gateway 的简单搭建

Spring Cloud Gateway 的简单搭建

在 《服务注册、发现和远程调用》 这篇文章中介绍关于服务注册、发现和远程调用的一个 Demo,本文在这篇文章的基础上介绍如何使用 Spring Cloud Gateway 搭建一个网关。

一、问题

在上篇文章中,分别创建了 service_user 和 service_dict 两个服务,两个服务分别使用了 8001 和 8002 两个端口。这样直接通过 PostMan 或浏览器调用其中的接口没什么问题,如下图所示。

从上图可以看到,访问 user 使用了 8001 端口,访问 dict 使用了 8002 端口,如果要为这些服务提供一个页面,由于不同的服务使用了不同的端口号,那么在写前端页面时就会因为有多个端口而导致难以管理,使得开发变得复杂。为了解决该问题,那么此时,我们可以通过反向代理来进行完成,比如 Nginx。

二、使用 Nginx 的反向代理功能来完成请求的分发

在上面抛出的问题中,我们可用使用 Nginx 的反向代理功能来进行解决,解决的方法也很容易。这里 Nginx 直接下载一个 Windows 版本的进行测试。对 Nginx 进行简单的配置,配置如下:

    server {
        listen 9001;
        server_name localhost;
                 
        location ~ /user/ {
            proxy_pass http://localhost:8001;
        } 
        location ~ /dict/ {
            proxy_pass http://localhost:8002;
        }
    }

这里通过配置了两个 location 完成了服务的分发,并且可用使用统一的端口 9001,测试如下图所示。

可用看到,通过访问 localhost 的 9001 端口可用正常的访问 service_user 和 service_dict 两个服务。接着,我们写一个页面,通过页面来调用 localhost 的 9001 来访问这两个服务。

三、编写简单的页面进行测试

这里使用 vue-admin-template 来进行测试,我们直接在登录页进行测试,然后通过 F12 的调试窗口来进行观察。先添加接口调用的代码,代码如下:

export function getUser() {
  return request({
    url: 'http://localhost:9001/admin/user/getUser/1',
    method: 'get'
  })
}

然后再登录页面中进行调用,调用的代码如下:

getUsers() {
  getUser().then(response => {
    console.log(response)
  }).catch(error => {
    console.log(error)
  })
},

最后我们让页面打开时就进行调用,代码如下:

created() {
    this.getUsers()
},

然后我们来观察调用的请求,如下图所示。

从两幅图中可用看出,接口并没有调用成功,因为发生了跨域的问题。我们可以在每个控制器上增加 @CrossOrigin 注解,也可以给每个服务添加一个配置类。同样,我们可以在两个服务前面增加一个网关,让网关来做路由分发和处理跨域的问题。

四、使用 Spring Cloud Gateway 网关

网关的作用比较多,网关可以做鉴权、限流、日志等功能,这里只是使用它做一个路由分发和处理跨域的问题。

在项目中创建一个子模块,命名为 gateway,接着来引入它的依赖,依赖如下:

<dependencies>
    <dependency>
        <groupId>com.alibaba.cloud</groupId>
        <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
        <version>2.2.6.RELEASE</version>
    </dependency>

    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-gateway</artifactId>
        <version>2.2.0.RELEASE</version>
    </dependency>
</dependencies>

第一个依赖是做 Nacos 服务发现的,第二个就是网关的依赖。

引入依赖之后,创建 config 包,然后写一个用于允许跨域的 Bean,代码如下:

@Configuration
public class CorsConfig {
    @Bean
    public CorsWebFilter corsFilter() {
        CorsConfiguration config = new CorsConfiguration();
        config.addAllowedMethod("*");
        config.addAllowedOrigin("*");
        config.addAllowedHeader("*");

        UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource(new PathPatternParser());
        source.registerCorsConfiguration("/**", config);

        return new CorsWebFilter(source);
    }
}

有了上面的代码就可以让前端完成跨域请求,这里需要注意,在网关有了上面的跨域配置,那么在实际服务的 Controller 类上面就不可用再使用 @CrossOrigin 注解了,否则会报错。

创建一个 application.properties 文件,然后来配置路由分发,配置如下:

# 服务端口
server.port=7000
# 服务名
spring.application.name=service-gateway
# nacos服务地址
spring.cloud.nacos.discovery.server-addr=127.0.0.1:8848

#使用服务发现路由
spring.cloud.gateway.discovery.locator.enabled=true

#设置路由id
spring.cloud.gateway.routes[0].id=service-user
#设置路由的uri
spring.cloud.gateway.routes[0].uri=lb://service-user
#设置路由断言,代理servicerId为auth-service的/auth/路径
spring.cloud.gateway.routes[0].predicates= Path=/*/user/**

#设置路由id
spring.cloud.gateway.routes[1].id=service-dict
#设置路由的uri
spring.cloud.gateway.routes[1].uri=lb://service-dict
#设置路由断言,代理servicerId为auth-service的/auth/路径
spring.cloud.gateway.routes[1].predicates= Path=/*/dict/**

上面的配置文件中,主要看 spring.cloud.gateway.routes 的配置,这里是数组,分别配置了两个路由规则,一个用来转发给 service_user 服务,第二个用来转发给 service_dict 服务。

同样要给 gateway 创建一个启动类,启动类的代码如下:

@SpringBootApplication
@EnableDiscoveryClient
public class ServerGatewayApplication
{
    public static void main(String[] args) {
        SpringApplication.run(ServerGatewayApplication.class, args);
    }
}

这样就可以启动我们的 gateway 了,gateway 的端口号为 7000。

五、测试前端调用

service-user、service-dict 和 service-gateway 已经启动并注册到了 Nacos 中,但是现在我们并不能测试我们的前端页面,原因是前端页面的地址使用的是 Nginx 的端口,而 Nginx 的规则仍然是直接转发给两个服务,我们需要修改 Nginx 的配置,修改如下:

    server {
        listen 9001;
        server_name localhost;
         
        location ~ /user/ {
            proxy_pass http://localhost:7000;
        } 
        location ~ /dict/ {
            proxy_pass http://localhost:7000;
        }
    }

可以看到,Nginx 将两个请求转发给了 localhost:7000,也就是转发给了我们的网关。那么,我们来测试我们的前端页面。通过 F12 的调试窗口来进行查看。如下图所示。

可以看到,我们的请求同样成功了。前端页面请求 localhost:9001 也就是 Nginx 的端口号,然后 Nginx 转发给 网关,最后网关路由到具体的服务,这样就完成了一次前端请求服务的调用。如下图所示。

同样的,我们可以让 Ajax 直接调用网关来访问服务,这里就不再进行演示了,大家可以自行测试。

六、总结

本篇文章通过一个简单的 Demo 完成了一个简单的 网关功能,该网关具有 处理跨域请求 和 路由转发 的功能。当然了我们这个功能过于的简单,但是大家可以自己进行扩展。比如可以类似如下图所示。

gateway、service_user 和 service_dict 同时部署多台,Nginx 通过负载均衡策略将请求转发到任意一台网关,网关再将请求分发到任意一台具体的服务上。如果是这样做,那么我们的 Demo 看起来就更有些意思了。

本文分享自微信公众号 - 码农UP2U(gh_3c91b47a82e0),作者:码农UP2U

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2021-10-18

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • gateway整合nacos

    之前了解过通过springCloud整合阿里的nacos作为配置中心,由于之前的需求是想要配置中心搞成可管理的化的,而原始的springCloudConfig是...

    技术从心
  • Spring Cloud 之 Gateway.

    Zuul 基于servlet 2.5 (works with 3.x),使用阻塞API。它不支持任何长期的连接,如websocket。

    JMCui
  • Github标星25K+Star,SpringBoot实战电商项目mall出SpringCloud版本啦!

    mall-swarm是一套微服务商城系统,采用了 Spring Cloud Greenwich、Spring Boot 2、MyBatis、Docker、Ela...

    macrozheng
  • 简单尝试Spring Cloud Gateway

    Spring Cloud Gateway是一个API网关,它是用于代替Zuul而出现的。Spring Cloud Gateway构建于Spring生态系统之上,...

    小忽悠
  • 微服务技术选型之路

    本文以笔者个人经历讲述关于微服务方面的技术选型和相关知识点。微服务模式的项目从初建到上线部署应用,每一个环节都会涉及到相当多的技术细节(上线后的性能调优更需要)...

    Java_老男孩
  • 微服务聚合Swagger文档,这波操作是真的香!

    对比knife4j和原生Swagger的微服务使用,再次证明knife4j是springfox-swagger的增强UI实现,完全遵循了springfox-sw...

    macrozheng
  • 【Spring Cloud gateway】 集成测试

    1.1 子模块 customer-service-api-demo,提高发布接口

    用户5640963
  • 20.SpringCloud实战项目-SpringCloud整合Gateway网关

    API网关通过注册中心实时感知微服务的状态的路由地址,准确地将请求路由到各个服务.

    悟空聊架构
  • Spring Cloud微服务中网关服务是如何实现的?(Zuul篇)

    我们知道在基于Spring Cloud的微服务体系中,各个微服务除了在内部提供服务外,有些服务接口还需要直接提供给客户端,如Andirod、IOS、H5等等。

    用户5927304
  • 快速突击 Spring Cloud Gateway

    Spring Cloud Gateway 是一款基于 Spring 5,Project Reactor 以及 Spring Boot 2 构建的 API 网关,...

    闻人的技术博客
  • Spring Cloud Zuul 基础搭建

    Spring Cloud Zuul API服务网关一、Zuul 介绍二、构建Spring Cloud Zuul网关构建网关请求路由传统路由方式面向服务的路由请求...

    cxuan
  • SpringCloud必会知识点最全(精美版)

    Spring Cloud也是一样,它将现在非常流行的一些技术整合到一起,实现了诸如:配置管理,服务发现,智能路由,负载均衡,熔断器,控制总线,集群状态等等功能。

    CaesarChang张旭
  • 【Java Spring Cloud 实战之路】- 使用Nacos和网关中心的创建

    Nacos可以用来发现、配置和管理微服务。提供了一组简单易用的特性集,可以快速实现动态服务发现、服务配置、服务元数据及流量管理。

    程序员小高
  • Sentinel Gateway Nacos 网关限流三剑客

    顾名思义,网关限流是通过网关层对我们的服务进行限流,达到保护后端服务的作用。在微服务架构的系统中,网关层可以屏蔽外部的请求直接对服务进行调用,网关层可以对内部服...

    程序猿小亮
  • SpringCloud微服务项目实战 - API网关Gateway详解实现

    前面讲过zuul的网关实现,那为什么今天又要讲Spring Cloud Gateway呢?原因很简单。就是Spring Cloud已经放弃Netflix Zuu...

    攻城狮的那点事
  • 【Java Spring Cloud 实战之路】- 3. 添加一个Spring Boot Admin监控

    在之前的几章中,我们先搭建了一个项目骨架,又搭建了一个使用nacos的gateway网关项目,网关项目中并没有配置太多的东西。现在我们就接着搭建在Spring ...

    程序员小高
  • 【spring cloud】 网关Zuul(过滤:安全、监控、限流、路由)

    1. 添加依赖 创建项目tcloud-gateway-zuulserver , pom.xml内容如下

    用户5640963
  • 第二代网关GateWay搭建流程

    Spring Cloud第二代网关GateWay是由纯Netty开发,底层为Reactor,WebFlux构建,不依赖任何Servlet容器,它不同于Zuul,...

    算法之名
  • 限流10万QPS、跨域、过滤器、令牌桶算法-网关Gateway内容都在这儿

    在构建微服务系统中,必不可少的技术就是网关了,从早期的Zuul,到现在的Spring Cloud Gateway,网关我们用的不可少。

    程序员白楠楠

扫码关注云+社区

领取腾讯云代金券