spring cloud的网关服务Zuul

简介: 微服务架构讲究系统的高内聚性,即只做该系统该做的事情,而其他的事情可以通过网关去做。spring cloud的zuul可以快速的搭建一个网关系统,其主要功能如下: 当加入了spring cloud的zuul后,架构图大致如下: 下面我们使用zuul来快速搭建一个官网系统1.

微服务架构讲究系统的高内聚性,即只做该系统该做的事情,而其他的事情可以通过网关去做。spring cloud的zuul可以快速的搭建一个网关系统,其主要功能如下:
这里写图片描述
当加入了spring cloud的zuul后,架构图大致如下:
这里写图片描述

下面我们使用zuul来快速搭建一个官网系统


1.添加依赖

<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>1.5.4.RELEASE</version>
</parent>

<!-- 导入Spring Cloud的依赖管理 -->
<dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-dependencies</artifactId>
            <version>Dalston.SR3</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
    </dependencies>
</dependencyManagement>

<dependencies>
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-zuul</artifactId>
    </dependency>
</dependencies>

<build>
    <finalName>${project.artifactId}</finalName>
    <plugins>
        <!-- 资源文件拷贝插件 -->
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-resources-plugin</artifactId>
            <configuration>
                <encoding>UTF-8</encoding>
            </configuration>
        </plugin>
        <!-- java编译插件 -->
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-compiler-plugin</artifactId>
            <configuration>
                <source>1.8</source>
                <target>1.8</target>
                <encoding>UTF-8</encoding>
            </configuration>
        </plugin>
    </plugins>
</build>

2.编写启动类

@EnableZuulProxy
@SpringBootApplication
public class ApiGatewayApplication {

    public static void main(String[] args) {
        SpringApplication.run(ApiGatewayApplication.class, args);
    }

}

3.编写yml配置文件

server:
  port: 6677 #服务端口

spring: 
  application:  
    name: spring-cloud-gateway #指定服务名
zuul: 
  routes: 
    caclulate: #caclulate这个名字是任意写的
      path: /caclulate/** #配置请求URL的请求规则
      serviceId: com-spring-caclu #指定Eureka注册中心中的服务id

eureka:
  client:
    registerWithEureka: true #是否将自己注册到Eureka服务中,默认为true
    fetchRegistry: true #是否从Eureka中获取注册信息,默认为true
    serviceUrl: #Eureka客户端与Eureka服务端进行交互的地址
      defaultZone: http://cloud:cloud@127.0.0.1:6868/eureka/
  instance: 
    prefer-ip-address: true #将自己的ip地址注册到Eureka服务中

前往eureka的注册中心,我们发现该服务已经注册到该服务中心了。
此时,我们只需要访问/caclulate/**,该网关服务执行玩自己该做的事情之后,就会转发到对应的服务(com-spring-caclu)下面去执行目标代码。

上面配置文件中,转发路由的配置是比较常用的一种写法,也是比较好用的,它不会破坏Hystrix、Ribbon特性,下面还有几种配置路由的方式可以参考一下:

3.1 指定服务id

这里写图片描述

3.2 忽略指定服务

这里写图片描述

3.3 忽略所有服务,只是有路由指定

这里写图片描述

3.4 同时配置path和url

这里写图片描述

3.5 使用正则表达式指定路由规则

这里写图片描述

3.6 路由前缀

这里写图片描述

3.7 忽略某些路径

这里写图片描述


下面我们通过一个示例来演示一下zuul如何来使用
我们只需要创建一个类来继承ZuulFilter这个抽象类,并实现其4个抽象方法即可:

1、shouldFilter:返回一个Boolean值,判断该过滤器是否需要执行。返回true执行,返回false不执行。
2、run:过滤器的具体业务逻辑。
3、filterType:返回字符串代表过滤器的类型
    a)pre:请求在被路由之前执行
    b)routing:在路由请求时调用
    c)post:在routing和errror过滤器之后调用
    d)error:处理请求时发生错误调用
filterOrder:通过返回的int值来定义过滤器的执行顺序,数字越小优先级越高。

下面是一个实例代码:

@Component //加入到Spring容器
public class UserLoginZuulFilter extends ZuulFilter{

    @Override
    public boolean shouldFilter() {
        return true; // 该过滤器需要执行
    }

    @Override
    public Object run() { //编写业务逻辑
        RequestContext requestContext = RequestContext.getCurrentContext();
        HttpServletRequest request = requestContext.getRequest();
        String token = request.getParameter("token");
        if(StringUtils.isEmpty(token)){
            requestContext.setSendZuulResponse(false); // 过滤该请求,不对其进行路由
            requestContext.setResponseStatusCode(401); // 设置响应状态码
            return null;
        }
        return null;
    }

    @Override
    public String filterType() {
        return "pre"; // 设置过滤器类型为:pre
    }

    @Override
    public int filterOrder() {
        return 0;// 设置执行顺序
    }
}

这个时候,当我们再次访问的时候,如果没有token这个参数,那么就会直接返回,并抛出401状态码。

目录
相关文章
|
人工智能 Java Serverless
【MCP教程系列】搭建基于 Spring AI 的 SSE 模式 MCP 服务并自定义部署至阿里云百炼
本文详细介绍了如何基于Spring AI搭建支持SSE模式的MCP服务,并成功集成至阿里云百炼大模型平台。通过四个步骤实现从零到Agent的构建,包括项目创建、工具开发、服务测试与部署。文章还提供了具体代码示例和操作截图,帮助读者快速上手。最终,将自定义SSE MCP服务集成到百炼平台,完成智能体应用的创建与测试。适合希望了解SSE实时交互及大模型集成的开发者参考。
9627 60
|
4月前
|
应用服务中间件 网络安全 数据安全/隐私保护
网关服务器配置指南:实现自动DHCP地址分配、HTTP服务和SSH无密码登录。
哇哈哈,道具都准备好了,咱们的魔术秀就要开始了。现在,你的网关服务器已经魔法满满,自动分配IP,提供网页服务,SSH登录如入无人之境。而整个世界,只会知道效果,不会知道是你在幕后操控一切。这就是真正的数字世界魔法师,随手拈来,手到擒来。
203 14
|
3月前
|
Prometheus 监控 Cloud Native
Docker 部署 Prometheus 和 Grafana 监控 Spring Boot 服务
Docker 部署 Prometheus 和 Grafana 监控 Spring Boot 服务实现步骤
|
7月前
|
人工智能 自然语言处理 Java
对话即服务:Spring Boot整合MCP让你的CRUD系统秒变AI助手
本文介绍了如何通过Model Context Protocol (MCP) 协议将传统Spring Boot服务改造为支持AI交互的智能系统。MCP作为“万能适配器”,让AI以统一方式与多种服务和数据源交互,降低开发复杂度。文章以图书管理服务为例,详细说明了引入依赖、配置MCP服务器、改造服务方法(注解方式或函数Bean方式)及接口测试的全流程。最终实现用户通过自然语言查询数据库的功能,展示了MCP在简化AI集成、提升系统易用性方面的价值。未来,“对话即服务”有望成为主流开发范式。
5211 7
|
12月前
|
安全 5G 网络性能优化
深入理解5G中的SAEGW:服务网关边界
【10月更文挑战第9天】
381 0
|
8月前
|
网络协议 Java Shell
java spring 项目若依框架启动失败,启动不了服务提示端口8080占用escription: Web server failed to start. Port 8080 was already in use. Action: Identify and stop the process that’s listening on port 8080 or configure this application to listen on another port-优雅草卓伊凡解决方案
java spring 项目若依框架启动失败,启动不了服务提示端口8080占用escription: Web server failed to start. Port 8080 was already in use. Action: Identify and stop the process that’s listening on port 8080 or configure this application to listen on another port-优雅草卓伊凡解决方案
404 7
|
10月前
|
NoSQL 前端开发 测试技术
👀探秘微服务:从零开启网关 SSO 服务搭建之旅
单点登录(Single Sign-On,简称SSO)是一种认证机制,它允许用户只需一次登录就可以访问多个应用程序或系统。本文结合网关和SaToken快速搭建可用的Session管理服务。
525 8
|
11月前
|
负载均衡 Java 应用服务中间件
Gateway服务网关
Gateway服务网关
279 1
Gateway服务网关
|
10月前
|
消息中间件 监控 Java
如何将Spring Boot + RabbitMQ应用程序部署到Pivotal Cloud Foundry (PCF)
如何将Spring Boot + RabbitMQ应用程序部署到Pivotal Cloud Foundry (PCF)
147 6