springcloud学习之路: (三) springcloud集成Zuul网关

网关就是做一下过滤或拦截操作 让我们的服务更加安全 用户访问我们服务的时候就要先通过网关 然后再由网关转发到我们的微服务

1. 新建一个网关服务Module

2. 依然选择springboot工程

3. 老规矩起个名字

4. 勾选注册中心客户端

5. 勾选zuul网关模块

6. 编写配置文件

server:
  # 服务端口号
  port: 8085
spring:
  application:
    # 服务名称 - 服务之间使用名称进行通讯
    name: service-zuul
eureka:
  client:
    service-url:
      # 填写注册中心服务器地址
      defaultZone: http://localhost:8081/eureka
zuul:
  routes:
    # 设置服务a 路径名称 随便起
    service-a:
      path: /service-a/**
      # 这里写a服务的注册名字
      serviceId: service-objcat-a
    # 设置服务b 路径名称 随便起
    service-b:
      path: /service-b/**
      # 这里写b服务的注册名字
      serviceId: service-objcat-b

7. 创建一个包 名字是com.objcat.filter, 创建一个类TokenFilter继承ZuulFilter 用来实现过滤规则

8. 重写ZuulFilter中的方法,在run()方法中编写过滤逻辑

import com.netflix.zuul.ZuulFilter;
import com.netflix.zuul.context.RequestContext;
import org.springframework.stereotype.Component;

import javax.servlet.http.HttpServletRequest;

public class TokenFilter extends ZuulFilter {
    /**
     * 过滤器类型 pre表示在请求之前进行逻辑操作
     */
    @Override
    public String filterType() {
        return "pre";
    }

    /**
     * 过滤器执行顺序
     * 当一个请求在同一个阶段存在多个过滤器的时候 过滤器的执行顺序
     */
    @Override
    public int filterOrder() {
        return 0;
    }

    /**
     * 是否开启过滤
     */
    @Override
    public boolean shouldFilter() {
        return true;
    }

    /**
     * 编写过滤器拦截业务逻辑代码
     */
    @Override
    public Object run() {
        RequestContext currentContext = RequestContext.getCurrentContext();
        HttpServletRequest request = currentContext.getRequest();
        String token = request.getParameter("token");
        if (token == null) {
            currentContext.setSendZuulResponse(false);
            currentContext.setResponseBody("token is null");
            currentContext.setResponseStatusCode(401);
        }
        return null;
    }
}

逻辑很简单 就是校验客户端发来的请求token是否为空 如果为空就不能通过 返回 token is null

9. 配置网关入口文件, 这个地方千万不要忘记实例化出来filter否则不生效

import com.example.servicezuul.filter.TokenFilter;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
import org.springframework.cloud.netflix.zuul.EnableZuulProxy;
import org.springframework.context.annotation.Bean;

@SpringBootApplication
// 添加注解声明是注册中心客户端
@EnableEurekaClient
// 开启网管
@EnableZuulProxy
public class ServiceZuulApplication {

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

    // 实例化tokenfilter,否则网管不生效
    @Bean
    TokenFilter tokenFilter(){
        return new TokenFilter();
    }

}

10. 通过网关访问a服务

只需要使用 网关的地址 + 网关的端口号 + 服务的别名路径(配置文件中配置) + api名称 就可以访问了

http://localhost:8085/service-a/testA

http://localhost:8085/service-a/testA?token=123

当没有token的时候返回就是 token is null,当token有值的时候就可以正常进行访问了

这种网关转发之后的请求 就叫做反向代理你可以隐藏你本地的服务器的真实地址只暴露给外界网关的地址 然后由网关转发给服务器 从而做到安全性更高

原文地址:https://www.cnblogs.com/zhainan-blog/p/11640094.html

时间: 2024-08-29 05:42:20

springcloud学习之路: (三) springcloud集成Zuul网关的相关文章

springcloud学习之路: (二) springcloud打jar包并批量运行

springcloud中内置了tomcat所以打包的时候是直接把tomcat打入jar包 之后就可以做到, 单独的服务, 独立的jar包, 独立运行的效果了. 一.打jar包 1. 在pom.xml文件中<build>标签中可以新增<finalName>标签自定义jar包名称 2. 点击idea操作界面右侧的"maven" 3. 对每个子工程分别打包, 父工程不需要打包 4. 打包成功 5. target文件夹下可以找到生成的jar包 6. 重复以上步骤生成其他

Jquery学习之路(三) 实现弹出层插件

弹出层的应用还是比较多的,登陆,一些同页面的操作,别人的总归是别人的,自己的才是自己的,所以一直以来想写个弹出层插件.不多废话,直接开始吧! 不想看可以在这里直接下载源码xsPop.zip 1:遮罩层 要弹出层,先要用一个遮罩层挡在下面的页面,此遮罩层是全屏的,页面滚动也要有,所以设置 position: fixed;还要有透明效果,下面是我定义的遮罩层css,取名mask .mask { position: fixed; width: 100%; height: 100%; backgroun

Redis——学习之路三(初识redis config配置)

我们先看看config 默认情况下系统是怎么配置的.在命令行中输入 config get *(如图) 默认情况下有61配置信息,每一个命令占两行,第一行为配置名称信息,第二行为配置的具体信息. 我们就从上到下来理解一下这些配置信息中的某些配置: 1.dbfilename是本地持久化存储数据库文件名,默认为dump.rdb.我可以在安装目录文件夹下找到这个文件. 2.requirepass是密码,即连接服务器的密码,默认为空.下面我来设置一个密码然后用带密码的命令连接一遍. 3.msterauth

JAVA学习之路三 编程英文汇总学习

JAVA学习中的每个章节中都有许多英文,不断熟悉工作英语也是提高编程能力很重要的一块,对于IT行业,英语才是通用语. 记在<JAVA语言程序设计>学习的第一章英文学习之后 .class file(.class文件)                       javac command(javac命令)          .java file(.java文件)            java Development Toolkit(JDK,java开发工具包)          assembl

linux学习之路三------指令篇

为什么要学习Linux命令? 1.Linux的图形界面虽然使用简单.直观,但是会占用大量系统资源,降低运行效率,增加安全的隐患. 2.学习和工作中,应尽可能使用Linux系统的命令运行界面,通过命令来完成操作. 3.要熟练掌握Linux操作系统,就必须熟练运用Linux下的各种命令,因此介绍Linux命令的基本功能和使用. 命令的使用方式,在Linux系统中打开终端的方式有以下两种: 一种是在桌面上依次单击"主程序→系统工具→终端"可打开如下图的终端窗口: 另一种是在Linux桌面上单

spring boot 学习之路3( 集成mybatis )

下面就简单来说一下spring boot 与mybatiis的整合问题,如果你还没学习spring boot的注解的话,要先去看spring boot的注解 好了,现在让我们来搞一下与mybatis的整合吧,在整合过程中,我会把遇到的问题也说出来,希望可以让大家少走弯路! 首先,是在pom.xml中添加一些依赖 这里用到spring-boot-starter基础和spring-boot-starter-test用来做单元测试验证数据访问 引入连接mysql的必要依赖mysql-connector

rabbitmq学习之路(三)

今天继续学习rabbitmq 了解一下AMQP的一些基本概念 交换机: Direct exchange(直连交换机) Fanout exchange(扇型交换机) Topic exchange(主题交换机) Headers exchange(头交换机) 交换机有两个状态 持久和暂存,区别就是持久话的交换机在消息代理也就是broker重启后依旧存在 队列: 队列需要被声明之后才能使用,如果声明时,该队列不存在,就会新建,如果已经存在,且属性无变化,则没有关系,不影响,若属性有变化,则报错 队列和交

Spring学习之路三——第一个Spring程序(体会IoC)

体会IoC:Spring通过一种称作控制反转(IoC)的技术促进了松耦合.当应用了IoC,一个对象依赖的其它对象会通过被动的方式传递进来,而不是这个对象自己创建或者查找依赖对象.你可以认为IoC与JNDI相反——不是对象从容器中查找依赖,而是容器在对象初始化时不等对象请求就主动将依赖传递给它. 步骤如下: 1.建立web功能 2.导入jar包 3.配置applicationContext.xml 4.创建类 5.测试 具体代码如下 UserDao.java 1 package cn.itcast

Java学习之路(三):Java中的数组

数组的概述和定义的格式 数组的作用: 用来存储同种数据类型的多个值 数组的基本概念: 数组是存储同一种数据类型多个元素的集合.就相当于一个容器. 注意:数组既可以存储基本数据类型,也可以存储引用数据类型. 数组的定义格式: 数据类型[] 数组名 = new 数据类型[指定数组的长度] 数组的初始化 概念: 就是为数组开辟连续的内存空间,并且为每个数的元素赋值 如何初始化: 动态初始化:指定长度,有系统给出初始化值  int[] arr = new int[5] 静态初始化:给出初始化的值 格式: