小呆呆的生活

  • 首页
  • 分类
    • Linux
    • MySQL
    • SpringBoot
    • SpringCloud
  • 工具
  • 留言
  • 登录
  • 注册
  • 友情链接
    • 咸鱼的窝
    • DIY熙的家
    • Farmer的自习室
    • Dark的小黑屋
  • 关于
人的一生注定会遇到两个人
一个惊艳了时光,一个温柔了岁月
  1. 首页
  2. SpringCloud框架
  3. 正文

Spring Cloud Zuul和Gateway的简单示例(搭建方式)

2023年 11月 29日 746次阅读 0人点赞 0条评论

一、 Spring Cloud Zuul和Spring Cloud Gateway是什么

Spring Cloud Zuul和Spring Cloud Gateway都是Spring Cloud框架提供的用于构建微服务架构中的API网关的组件。
1. Spring Cloud Zuul:Spring Cloud Zuul是基于Netflix Zuul构建的微服务网关组件。它提供了路由、负载均衡、容错、安全性等功能。Zuul使用同步阻塞模型,适用于较小规模的微服务架构。然而,需要注意的是,Spring Cloud Zuul目前已经进入维护模式,Spring Cloud官方推荐使用Spring Cloud Gateway作为替代方案。
2. Spring Cloud Gateway:Spring Cloud Gateway是Spring Cloud官方推荐的API网关解决方案。它基于Spring Framework 5和Project Reactor构建,并采用异步非阻塞模型,具有更高的性能和吞吐量。Spring Cloud Gateway提供了动态路由、过滤器链、集成服务发现、断路器等功能特性,同时支持Java和函数式编程的API,具有更高级的定制和扩展能力。

这两个组件都可以用于构建微服务架构中的API网关,它们的选择取决于具体的需求和场景。如果需要更高的性能、更灵活的定制能力以及与Spring生态系统更好的集成,推荐使用Spring Cloud Gateway。如果已经在使用Netflix的生态系统组件,并且对性能要求不是特别高,可以考虑使用Spring Cloud Zuul。


二、Spring Cloud Zuul的简单示例

  1. 创建一个Spring Boot项目并添加依赖:在你的项目中创建一个新的Spring Boot应用程序,并添加以下依赖。如果你使用的是Maven,可以在pom.xml文件中添加以下依赖:
<dependencies>
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-netflix-zuul</artifactId>
    </dependency>
</dependencies>
  1. 启用Zuul网关:在你的Spring Boot应用程序的主类上添加@EnableZuulProxy注解,以启用Zuul网关。例如:
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.zuul.EnableZuulProxy;

@SpringBootApplication
@EnableZuulProxy
public class YourApplication {

    public static void main(String[] args) {
        SpringApplication.run(YourApplication.class, args);
    }
}
  1. 配置Zuul路由规则:在application.properties或application.yml文件中配置Zuul的路由规则。例如,以下是一个将/api/路径下的请求转发到http://example.com/api/的示例配置:
zuul:
  routes:
    example-service:
      path: /api/**
      url: http://example.com/api

在上面的示例中,example-service是一个自定义的路由名称,path指定了匹配的路径模式,url指定了要转发到的目标URL。

  1. 运行应用程序并访问Zuul网关:启动你的应用程序,并使用Zuul网关转发请求。例如,如果你的应用程序运行在http://localhost:8080,你可以发送一个请求到http://localhost:8080/api/example,该请求将被Zuul网关转发到http://example.com/api/example。

这就是一个使用Zuul网关的简单示例。通过配置不同的路由规则,你可以实现请求的转发、负载均衡、路由过滤等功能。你还可以添加自定义的过滤器来对请求和响应进行处理。请注意,Zuul目前已被Spring Cloud宣布为不推荐使用,建议使用Spring Cloud Gateway作为替代方案。


三、Spring Cloud Gateway(推荐使用)的简单示例

  1. 创建一个Spring Boot项目并添加依赖:在你的项目中创建一个新的Spring Boot应用程序,并添加以下依赖。如果你使用的是Maven,可以在pom.xml文件中添加以下依赖:
<dependencies>
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-gateway</artifactId>
    </dependency>
</dependencies>
  1. 配置Spring Cloud Gateway路由规则:在application.properties或application.yml文件中配置Spring Cloud Gateway的路由规则。例如,以下是一个将/api/路径下的请求转发到http://example.com/api/的示例配置:
spring:
  cloud:
    gateway:
      routes:
        - id: example-service
          uri: http://example.com/api
          predicates:
            - Path=/api/**

在上面的示例中,example-service是一个自定义的路由ID,uri指定了要转发到的目标URL,predicates指定了匹配的路径模式。

  1. 运行应用程序并访问Spring Cloud Gateway:启动你的应用程序,并使用Spring Cloud Gateway转发请求。例如,如果你的应用程序运行在http://localhost:8080,你可以发送一个请求到http://localhost:8080/api/example,该请求将被Spring Cloud Gateway转发到http://example.com/api/example。
  2. 添加自定义过滤器(可选):你可以添加自定义的过滤器来对请求和响应进行处理。例如,你可以创建一个实现GlobalFilter接口的自定义过滤器类,并在应用程序中进行注册。过滤器可以用于鉴权、日志记录、请求转换等操作。运行应用程序并访问Zuul网关:启动你的应用程序,并使用Zuul网关转发请求。例如,如果你的应用程序运行在http://localhost:8080,你可以发送一个请求到http://localhost:8080/api/example,该请求将被Zuul网关转发到http://example.com/api/example。
import org.springframework.cloud.gateway.filter.GatewayFilterChain;
import org.springframework.cloud.gateway.filter.GlobalFilter;
import org.springframework.core.Ordered;
import org.springframework.http.HttpStatus;
import org.springframework.stereotype.Component;
import org.springframework.web.server.ServerWebExchange;
import reactor.core.publisher.Mono;

@Component
public class CustomFilter implements GlobalFilter, Ordered {

    @Override
    public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
        // 在这里编写你的过滤器逻辑
        // 可以通过exchange对象获取请求和响应信息,并进行相关处理

        // 示例:检查请求头中是否包含特定的认证信息
        String authHeader = exchange.getRequest().getHeaders().getFirst("Authorization");
        if (authHeader == null || authHeader.isEmpty()) {
            exchange.getResponse().setStatusCode(HttpStatus.UNAUTHORIZED);
            return exchange.getResponse().setComplete();
        }

        // 继续执行后续的过滤器和路由处理
        return chain.filter(exchange);
    }

    @Override
    public int getOrder() {
        // 设置过滤器的执行顺序
        return Ordered.HIGHEST_PRECEDENCE;
    }
}

在上面的示例中,CustomFilter是一个自定义的过滤器类,实现了GlobalFilter接口和Ordered接口。你可以在filter方法中编写自己的过滤器逻辑,并在getOrder方法中设置过滤器的执行顺序。

这就是一个使用Spring Cloud Gateway的简单示例。通过配置路由规则和添加自定义过滤器,你可以实现请求的转发、负载均衡、路由过滤等功能。Spring Cloud Gateway还提供了许多其他功能,如断路器、限流、重试等,你可以根据具体需求进行配置和使用。


四、Spring Cloud Gateway负载均衡的简单示例

在Spring Cloud Gateway中,你可以使用LoadBalancerClient或DiscoveryClient来实现负载均衡。下面是一个使用LoadBalancerClient实现负载均衡的示例:

  1. 添加依赖:在你的Spring Boot项目中添加以下依赖。如果你使用的是Maven,可以在pom.xml文件中添加以下依赖:
<dependencies>
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-gateway</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-loadbalancer</artifactId>
    </dependency>
</dependencies>
  1. 配置路由规则:在application.properties或application.yml文件中配置Spring Cloud Gateway的路由规则,指定负载均衡的目标服务。例如:
spring:
  cloud:
    gateway:
      routes:
        - id: example-service
          uri: lb://example-service
          predicates:
            - Path=/api/**

在上面的示例中,example-service是一个服务的名称,lb://example-service表示通过负载均衡调用example-service服务。

  1. 创建一个自定义的LoadBalancerClient配置类:创建一个自定义的LoadBalancerClient配置类,用于配置负载均衡的策略。例如:
import org.springframework.cloud.client.loadbalancer.LoadBalancerClient;
import org.springframework.cloud.gateway.config.GatewayLoadBalancerProperties;
import org.springframework.cloud.gateway.filter.LoadBalancerClientFilter;
import org.springframework.cloud.gateway.support.ServerWebExchangeUtils;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class LoadBalancerConfig {

    @Bean
    public LoadBalancerClientFilter loadBalancerClientFilter(LoadBalancerClient loadBalancerClient,
                                                             GatewayLoadBalancerProperties loadBalancerProperties) {
        return new LoadBalancerClientFilter(loadBalancerClient, loadBalancerProperties);
    }

    @Bean
    public LoadBalancerClient loadBalancerClient() {
        return new MyLoadBalancerClient();
    }

    private static class MyLoadBalancerClient implements LoadBalancerClient {

        @Override
        public <T> T execute(String serviceId, LoadBalancerRequest<T> request) {
            // 在这里实现你的负载均衡逻辑
            // 可以使用负载均衡算法选择目标服务的实例
            // 这里的示例代码直接返回了固定的目标服务实例
            ServiceInstance serviceInstance = new DefaultServiceInstance(serviceId, "example-host", 8080, false);
            return request.apply(serviceInstance);
        }

        @Override
        public <T> T execute(String serviceId, ServiceInstance serviceInstance, LoadBalancerRequest<T> request) {
            return request.apply(serviceInstance);
        }

        @Override
        public URI reconstructURI(ServiceInstance instance, URI original) {
            return instance.getUri();
        }

        @Override
        public ServiceInstance choose(String serviceId) {
            // 在这里实现你的负载均衡逻辑
            // 可以使用负载均衡算法选择目标服务的实例
            // 这里的示例代码直接返回了固定的目标服务实例
            return new DefaultServiceInstance(serviceId, "example-host", 8080, false);
        }
    }
}

在上面的示例中,MyLoadBalancerClient是一个自定义的LoadBalancerClient实现,你可以在其中实现自己的负载均衡逻辑。示例代码中直接返回了固定的目标服务实例,你可以根据实际需求选择合适的负载均衡算法。

  1. 运行应用程序并访问Spring Cloud Gateway:启动你的应用程序,并使用Spring Cloud Gateway转发请求。根据负载均衡配置,请求将被转发到目标服务的不同实例上。

这就是一个使用LoadBalancerClient实现负载均衡的示例。你可以根据实际需求在自定义的LoadBalancerClient实现中选择合适的负载均衡算法,并根据服务实例的健康状态等信息进行动态调整。另外,你也可以使用DiscoveryClient来实现基于服务发现的负载均衡,它可以与服务注册中心(如Eureka、Consul)集成,自动获取可用的服务实例。


五、总结

  • 本文简述了Spring Cloud Zuul和Spring Cloud Gateway的简单示例,其中还有很多功能还是得靠大家自己动手去实践。
  • 欢迎大家提出建议以及批评,有任何问题可以私信。
本作品采用 知识共享署名 4.0 国际许可协议 进行许可
标签: Gateway SpringCloud Zuul 网关路由
最后更新:2023年 11月 29日

小呆呆

知足常乐,就会拥有幸福

点赞
< 上一篇

文章评论

razz evil exclaim smile redface biggrin eek confused idea lol mad twisted rolleyes wink cool arrow neutral cry mrgreen drooling persevering
取消回复

小呆呆

知足常乐,就会拥有幸福

最新 热点 随机
最新 热点 随机
数据库索引简析 Java多线程的使用场景以及线程的创建方式 Spring事务的使用示例和传播行为以及失效场景 Spring Boot使用JUnit和Mockito进行Service层单元测试 Spring Cloud Zuul和Gateway的简单示例(搭建方式) Spring Cloud的网关Zuul和Gateway
Java面试高频(五) 数据库索引简析 Vue项目快速搭建 Spring Cloud Feign的理解以及搭建方式(Feign调用简单示例) Java面试高频(一) Spring Security快速入门
标签聚合
Java Spring MySQL SpringCloud 后端 面试 SpringBoot 干货
最近评论
我是可是尼古拉斯·爱新觉·罗·G·钰豪啊 发布于 3 年前(04月08日) 我来注水了胜哥 :hehe:
鸟人金 发布于 3 年前(03月03日) v
鸟人金 发布于 3 年前(03月03日) 胜哥yyds
鸟人金 发布于 3 年前(03月03日) 我滴偶像!!!!!!!!!!!!!!!
水军2号 发布于 3 年前(03月03日) 胜哥tql
归档
  • 2024 年 2 月
  • 2024 年 1 月
  • 2023 年 12 月
  • 2023 年 11 月
  • 2023 年 10 月
  • 2023 年 8 月
  • 2023 年 6 月
  • 2022 年 11 月
  • 2022 年 8 月
  • 2022 年 6 月
  • 2022 年 4 月
  • 2022 年 3 月
  • 2022 年 1 月
  • 2021 年 12 月
  • 2021 年 9 月
  • 2021 年 8 月
  • 2021 年 6 月
  • 2021 年 4 月
  • 2020 年 10 月
  • 2020 年 9 月
  • 2020 年 8 月
  • 2020 年 7 月
  • 2020 年 6 月
  • 2020 年 5 月
  • 2020 年 4 月
  • 2020 年 3 月

COPYRIGHT © 2023 小呆呆的生活. ALL RIGHTS RESERVED.

Theme Kratos Made By Seaton Jiang

粤ICP备2020104583号

粤公网安备44011802000463号