服务器之家:专注于服务器技术及软件下载分享
分类导航

PHP教程|ASP.NET教程|JAVA教程|ASP教程|编程技术|正则表达式|C/C++|IOS|C#|Swift|Android|JavaScript|易语言|

服务器之家 - 编程语言 - JAVA教程 - 浅谈Spring Cloud中的API网关服务Zuul

浅谈Spring Cloud中的API网关服务Zuul

2021-01-28 11:51_江南一点雨 JAVA教程

这篇文章主要介绍了浅谈Spring Cloud中的API网关服务Zuul,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧

到目前为止,我们spring cloud中的内容已经介绍了很多了,ribbon、hystrix、feign这些知识点大家都耳熟能详了,我们在前文也提到过微服务就是把一个大的项目拆分成很多小的独立模块,然后通过服务治理让这些独立的模块配合工作等。那么大家来想这样两个问题:1.如果我的微服务中有很多个独立服务都要对外提供服务,那么对于开发人员或者运维人员来说,他要如何去管理这些接口?特别是当项目非常大非常庞杂的情况下要如何管理?2.权限管理也是一个老生常谈的问题,在微服务中,一个独立的系统被拆分成很多个独立的模块,为了确保安全,我难道需要在每一个模块上都添加上相同的鉴权代码来确保系统不被非法访问?如果是这样的话,那么工作量就太大了,而且维护也非常不方便。

为了解决上面提到的问题,我们引入了api网关的概念,api网关是一个更为智能的应用服务器,它有点类似于我们微服务架构系统的门面,所有的外部访问都要先经过api网关,然后api网关来实现请求路由、负载均衡、权限验证等功能。spring cloud中提供的spring cloud zuul实现了api网关的功能,本文我们就先来看看spring cloud zuul的一个基本使用。

构建网关

网关的构建我们通过下面三个步骤来实现。

1.创建spring boot工程并添加依赖

首先我们创建一个普通的spring boot工程名为api-gateway,然后添加相关依赖,这里我们主要添加两个依赖spring-cloud-starter-zuul和spring-cloud-starter-eureka,spring-cloud-starter-zuul依赖中则包含了ribbon、hystrix、actuator等,如下:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
<parent>
  <groupid>org.springframework.boot</groupid>
  <artifactid>spring-boot-starter-parent</artifactid>
  <version>1.5.7.release</version>
  <relativepath/> <!-- lookup parent from repository -->
</parent>
<properties>
  <project.build.sourceencoding>utf-8</project.build.sourceencoding>
  <project.reporting.outputencoding>utf-8</project.reporting.outputencoding>
  <java.version>1.8</java.version>
  <spring-cloud.version>dalston.sr3</spring-cloud.version>
</properties>
<dependencies>
  <dependency>
    <groupid>org.springframework.boot</groupid>
    <artifactid>spring-boot-starter</artifactid>
  </dependency>
  <dependency>
    <groupid>org.springframework.cloud</groupid>
    <artifactid>spring-cloud-starter-zuul</artifactid>
  </dependency>
  <dependency>
    <groupid>org.springframework.cloud</groupid>
    <artifactid>spring-cloud-starter-eureka</artifactid>
  </dependency>
</dependencies>
<dependencymanagement>
  <dependencies>
    <dependency>
      <groupid>org.springframework.cloud</groupid>
      <artifactid>spring-cloud-dependencies</artifactid>
      <version>${spring-cloud.version}</version>
      <type>pom</type>
      <scope>import</scope>
    </dependency>
  </dependencies>
</dependencymanagement>

2.添加注解

然后在入口类上添加@enablezuulproxy注解表示开启zuul的api网关服务功能,如下:

?
1
2
3
4
5
6
7
8
@springbootapplication
@enablezuulproxy
public class apigatewayapplication {
 
  public static void main(string[] args) {
    springapplication.run(apigatewayapplication.class, args);
  }
}

3.配置路由规则

application.properties文件中的配置可以分为两部分,一部分是zuul应用的基础信息,还有一部分则是路由规则,如下:

?
1
2
3
4
5
6
7
8
9
# 基础信息配置
spring.application.name=api-gateway
server.port=2006
# 路由规则配置
zuul.routes.api-a.path=/api-a/**
zuul.routes.api-a.serviceid=feign-consumer
 
# api网关也将作为一个服务注册到eureka-server上
eureka.client.service-url.defaultzone=http://localhost:1111/eureka/

我们在这里配置了路由规则所有符合/api-a/**的请求都将被转发到feign-consumer服务上,至于feign-consumer服务的地址到底是什么则由eureka-server去分析,我们这里只需要写上服务名即可。以上面的配置为例,如果我请求 http://localhost:2006/api-a/hello1 接口则相当于请求 http://localhost:2005/hello1 (我这里feign-consumer的地址为 http://localhost:2005 ),我们在路由规则中配置的api-a是路由的名字,可以任意定义,但是一组path和serviceid映射关系的路由名要相同。

ok,做好这些之后,我们依次启动我们的eureka-server、provider和feign-consumer,然后访问如下地址 http://localhost:2006/api-a/hello1 ,访问结果如下:

浅谈Spring Cloud中的API网关服务Zuul

看到这个效果说明我们的api网关服务已经构建成功了,我们发送的符合路由规则的请求自动被转发到相应的服务上去处理了。

请求过滤

构建好了网关,接下来我们就来看看如何利用网关来实现一个简单的权限验证。这里就涉及到了spring cloud zuul中的另外一个核心功能:请求过滤。请求过滤有点类似于java中filter过滤器,先将所有的请求拦截下来,然后根据现场情况做出不同的处理,这里我们就来看看zuul中的过滤器要如何使用。很简单,两个步骤:

1.定义过滤器

首先我们定义一个过滤器继承自zuulfilter,如下:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
public class permisfilter extends zuulfilter {
  @override
  public string filtertype() {
    return "pre";
  }
 
  @override
  public int filterorder() {
    return 0;
  }
 
  @override
  public boolean shouldfilter() {
    return true;
  }
 
  @override
  public object run() {
    requestcontext ctx = requestcontext.getcurrentcontext();
    httpservletrequest request = ctx.getrequest();
    string login = request.getparameter("login");
    if (login == null) {
      ctx.setsendzuulresponse(false);
      ctx.setresponsestatuscode(401);
      ctx.addzuulresponseheader("content-type","text/html;charset=utf-8");
      ctx.setresponsebody("非法访问");
    }
    return null;
  }
}

关于这个类我说如下几点:

1.filtertype方法的返回值为过滤器的类型,过滤器的类型决定了过滤器在哪个生命周期执行,pre表示在路由之前执行过滤器,其他可选值还有post、error、route和static,当然也可以自定义。

2.filterorder方法表示过滤器的执行顺序,当过滤器很多时,这个方法会有意义。

3.shouldfilter方法用来判断过滤器是否执行,true表示执行,false表示不执行,在实际开发中,我们可以根据当前请求地址来决定要不要对该地址进行过滤,这里我直接返回true。

4.run方法则表示过滤的具体逻辑,假设请求地址中携带了login参数的话,则认为是合法请求,否则就是非法请求,如果是非法请求的话,首先设置ctx.setsendzuulresponse(false);表示不对该请求进行路由,然后设置响应码和响应值。这个run方法的返回值在当前版本(dalston.sr3)中暂时没有任何意义,可以返回任意值。

2.配置过滤器bean

然后在入口类中配置相关的bean即可,如下:

?
1
2
3
4
@bean
permisfilter permisfilter() {
  return new permisfilter();
}

此时,如果我们访问 http://localhost:2006/api-a/hello1 ,结果如下:

浅谈Spring Cloud中的API网关服务Zuul

如果给请求地址加上login参数,则结果如下:

浅谈Spring Cloud中的API网关服务Zuul

总结

到这里小伙伴们应该已经见识到spring cloud zuul的强大之处了吧,api网关作为系统的的统一入口,将微服务中的内部细节都屏蔽掉了,而且能够自动的维护服务实例,实现负载均衡的路由转发,同时,它提供的过滤器为所有的微服务提供统一的权限校验机制,使得服务自身只需要关注业务逻辑即可。

zuul的入门知识我们就先介绍到这里,小伙伴们有问题欢迎留言讨论。以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持服务器之家。

原文链接:http://blog.csdn.net/u012702547/article/details/78391052?utm_source=tuicool&utm_medium=referral

延伸 · 阅读

精彩推荐
  • JAVA教程java中的i++和++i的区别详解

    java中的i++和++i的区别详解

    这篇文章主要介绍了java中的i++和++i的区别详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随...

    冷囧囧4432020-08-04
  • JAVA教程Java访问Hadoop分布式文件系统HDFS的配置说明

    Java访问Hadoop分布式文件系统HDFS的配置说明

    Hadoop的能提供高吞吐量的数据访问,是集群式服务器的上的数据操作利器,这里就来为大家分享Java访问Hadoop分布式文件系统HDFS的配置说明: ...

    zhangzhaokun2132020-05-09
  • JAVA教程springMVC的生命周期详解

    springMVC的生命周期详解

    本篇文章主要介绍了springMVC的生命周期详解,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧...

    l_blackeagle1282020-08-28
  • JAVA教程hibernate5.2的基本配置方法(详解)

    hibernate5.2的基本配置方法(详解)

    下面小编就为大家带来一篇hibernate5.2的基本配置方法(详解)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧...

    Java之家1542020-11-12
  • JAVA教程Java日期时间使用方法汇总

    Java日期时间使用方法汇总

    这篇文章主要针对Java日期时间使用方法进行汇总,感兴趣的朋友可以参考一下 ...

    ngulc2872020-04-08
  • JAVA教程java 动态加载的实现代码

    java 动态加载的实现代码

    这篇文章主要介绍了java 动态加载的实现代码的相关资料,Java动态加载类主要是为了不改变主程序代码,通过修改配置文件就可以操作不同的对象执行不同的...

    jianshu3552020-12-07
  • JAVA教程详解spring注解配置启动过程

    详解spring注解配置启动过程

    这篇文章主要为大家详细介绍了详解spring注解配置启动过程,具有一定的参考价值,感兴趣的小伙伴们可以参考一下 ...

    暮夜望日4472020-06-23
  • JAVA教程Java parseInt解释加方法示例

    Java parseInt解释加方法示例

    使用此方法得到的原始数据类型的一个特定的字符串。 parseXxx()是一个静态方法,可以有一个参数或两个 ...

    java教程网5102019-10-18