当前位置: 首页 > news >正文

学习微服务的路由网关zuul——路由转发和过滤器

2019独角兽企业重金招聘Python工程师标准>>> hot3.png

zuul具有路由转发和过滤的功能,类似于nginx的功能。首先新建一个项目service-zuul来实现路由转发的功能。

1.路由转发功能

build.gradle文件

buildscript {
	ext {
		springBootVersion = '2.0.4.RELEASE'
	}
	repositories {
		mavenCentral()
	}
	dependencies {
		classpath("org.springframework.boot:spring-boot-gradle-plugin:${springBootVersion}")
	}
}

apply plugin: 'java'
apply plugin: 'eclipse'
apply plugin: 'org.springframework.boot'
apply plugin: 'io.spring.dependency-management'

group = 'com.example'
version = '0.0.1-SNAPSHOT'
sourceCompatibility = 1.8

repositories {
	mavenCentral()
}


ext {
	springCloudVersion = 'Finchley.SR1'
}

dependencies {
	compile('org.springframework.boot:spring-boot-starter-web')
	compile('org.springframework.cloud:spring-cloud-starter-netflix-eureka-client')
	compile('org.springframework.cloud:spring-cloud-starter-netflix-zuul')
	testCompile('org.springframework.boot:spring-boot-starter-test')
}

dependencyManagement {
	imports {
		mavenBom "org.springframework.cloud:spring-cloud-dependencies:${springCloudVersion}"
	}
}

application.yml文件

server:
  port: 8798

spring:
  application:
    name: service-zuul
eureka:
  client:
    service-url:
      defaultZone: http://localhost:8791/eureka/

zuul:
  routes:
    api-a:
      path: /api-a/*
      serviceId: service-ribbon
    api-b:
      path: /api-b/*
      serviceId: service-feign

主方法

package com.example.servicezuul;

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;

@EnableZuulProxy
@EnableEurekaClient
@SpringBootApplication
public class ServiceZuulApplication {

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

启动该项目,以及service-ribbon,service-feign项目,以及eureka-server项目,以及eureka-client-say-hi项目,此时的eureka注册中心是这样:

8224b499af1a464d216b293f07281b256ea.jpg

此时分别访问http://localhost:8798/api-a/hi;

以及http://localhost:8798/api-b/hi;

其响应页面都是:

07d8774eb3b6389b2b3b5c1d00313540395.jpg

0f3a1e3b713a9cd6b320dbdd62b19c0cde5.jpg

以上结果表明,zuul实现了路由转发的功能,只需加上注解@EnableZuulProxy以及路由转发相关策略即可。

 

2.过滤功能

在上面项目的基础上添加一个自定义的过滤组件

MyFilter.java

package com.example.servicezuul;

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

import javax.servlet.http.HttpServletRequest;
import java.io.IOException;

@Component
public class MyFilter extends ZuulFilter {
    @Override
    public String filterType() {  //过滤器类型,一共有4种不同周期的类型,pre:路由之前;routing:路由之时;post:代表路由之后;error:错误时调用
        return "pre";
    }

    @Override
    public int filterOrder() { //过滤器使用顺序
        return 0;
    }

    @Override
    public boolean shouldFilter() { //是否允许过滤,为true,即始终过滤
        return true;
    }

    @Override
    public Object run() throws ZuulException {  //过滤器的具体逻辑,以下的内容大致是,有test参数允许访问,没有test参数不允许访问

        RequestContext requestContext = RequestContext.getCurrentContext();
        HttpServletRequest request = requestContext.getRequest();
        Object o = request.getParameter("test");
        if (o == null) {
            requestContext.setSendZuulResponse(false);
            requestContext.setResponseStatusCode(401);
            try {
                requestContext.getResponse().getWriter().write("test is empty");
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        return null;
    }


}

运行结果比较:

efbc852cb3cc570321d65aa13182fa3333a.jpg

 

7edc7dc296b7002e3931bd3783c67e9cdcc.jpg

以上结果表明,过滤器已经产生作用了。

转载于:https://my.oschina.net/u/2263272/blog/1926799

相关文章:

  • 找一份好的前端工作,起点很重要
  • Docker镜像创建及建立私有仓库
  • RichTextBox简单扩展
  • 深入剖析Retrofit系列(一)来自官方的Retrofit开发手册(中英互译)
  • java编程——高并发大容量NoSQL解决方案探索
  • Android 模拟器下载、编译及调试
  • [译]常见网页设计错误一览
  • 面试官告诉你如何准备Java初级和高级的技术面试
  • Apache Pulsar 2.1 重磅发布
  • java监听器实现与原理
  • Jenkisn行RFS脚本问题汇总
  • 【模板】最小生成树
  • angular1.x 性能优化
  • sublime打开文本时会记忆上次关闭时鼠标停留的位置
  • 模板汇总——AC自动机
  • 【5+】跨webview多页面 触发事件(二)
  • 78. Subsets
  • gcc介绍及安装
  • HTTP 简介
  • Java 多线程编程之:notify 和 wait 用法
  • Quartz初级教程
  • react-native 安卓真机环境搭建
  • WePY 在小程序性能调优上做出的探究
  • Zepto.js源码学习之二
  • 阿里云Kubernetes容器服务上体验Knative
  • 后端_ThinkPHP5
  • 前端每日实战 2018 年 7 月份项目汇总(共 29 个项目)
  • 实现简单的正则表达式引擎
  • 思考 CSS 架构
  • 一个完整Java Web项目背后的密码
  • 译有关态射的一切
  • 【云吞铺子】性能抖动剖析(二)
  • 7行Python代码的人脸识别
  • 曾刷新两项世界纪录,腾讯优图人脸检测算法 DSFD 正式开源 ...
  • #经典论文 异质山坡的物理模型 2 有效导水率
  • $.ajax()方法详解
  • $.each()与$(selector).each()
  • (10)工业界推荐系统-小红书推荐场景及内部实践【排序模型的特征】
  • (分布式缓存)Redis哨兵
  • (一)插入排序
  • (转载)(官方)UE4--图像编程----着色器开发
  • **PyTorch月学习计划 - 第一周;第6-7天: 自动梯度(Autograd)**
  • .NET 中使用 Mutex 进行跨越进程边界的同步
  • .NET高级面试指南专题十一【 设计模式介绍,为什么要用设计模式】
  • .NET正则基础之——正则委托
  • /proc/interrupts 和 /proc/stat 查看中断的情况
  • /usr/bin/python: can't decompress data; zlib not available 的异常处理
  • [.net]官方水晶报表的使用以演示下载
  • []新浪博客如何插入代码(其他博客应该也可以)
  • [1181]linux两台服务器之间传输文件和文件夹
  • [android] 练习PopupWindow实现对话框
  • [AutoSar]状态管理(五)Dcm与BswM、EcuM的复位实现
  • [C#]winform部署yolov5-onnx模型
  • [C#]winform制作圆形进度条好用的圆环圆形进度条控件和使用方法
  • [C/C++随笔] char与unsigned char区别