spring boot      1.5.9.RELEASE

spring cloud    Dalston.SR1

1.前言

什么是 Zuul?

  Zuul是微服务网关,与Gateway类似 ,根据请求的url不同,路由到不同的服务上去,同时入口统一了,还能进行统一的身份鉴权、日志记录、分流等操作。也称为API网关 ,API是应用程序接口的意思 。

2.操作

(1)引入依赖

  <!-- zuul路由网关 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-zuul</artifactId>
</dependency>

完整pom.xml

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>com.atguigu.springcloud</groupId>
<!-- 父级maven模块的工程名字-->
<artifactId>microservicecloud</artifactId>
<version>0.0.1-SNAPSHOT</version>
</parent>
<groupId>com.example</groupId>
<artifactId>demo-my-cen-zuul</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>demo-my-cen-zuul</name>
<description>Demo project for Spring Boot</description> <properties>
<java.version>1.8</java.version>
</properties> <dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency> <dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
<exclusions>
<exclusion>
<groupId>org.junit.vintage</groupId>
<artifactId>junit-vintage-engine</artifactId>
</exclusion>
</exclusions>
</dependency> <dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-eureka</artifactId>
</dependency> <dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-hystrix</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-config</artifactId>
</dependency> <!-- actuator监控 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency> <!-- zuul路由网关 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-zuul</artifactId>
</dependency> </dependencies> <build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build> </project>

(2)启动类开启 zuul网关

//注解@EnableZuulProxy是 @EnableZuulServer 的加强版 ,是个组合注解,包括了@EnableZuulServer 和@EnableEurekaClient 的功能,

//当然 ,添加@EnableEurekaClient也是没问题的,也可以不加

(3)application.properties文件配置信息

#本服务端口
server.port=114
# 本服务在服务注册中心的注册应用名
spring.application.name=service-zuul
#全局添加前缀,如 localhost:114/myzuul/test/bb ,用于识别是否需要转发路由操作
zuul.prefix=/myzuul
#//默认是false,这里是全局配置
#zuul.strip-prefix: //是否将这个代理前缀去掉
#
#忽略所有的,表示禁用默认路由,只认我们自己配置的路由.
zuul.ignored-services="*"
#
#忽略某些路径,起过略路径含有/admin/的请求
#zuul.ignoredPatterns= /**/admin/**
#
#设置路由,转接到分布式服务的消费者
zuul.routes.api-a.path=/test/**
zuul.routes.api-a.service-id=DEMO-MY-CEN-TEST
#zuul.routes.api-a.strip-prefix: //是否将这个代理前缀去掉,这里是局部设置,访问test服务可以不添加全局前缀
zuul.routes.api-b.path=/feign/**
zuul.routes.api-b.service-id=520LOVE
#
#向服务注册中心注册自己为服务,默认是注册,因此可以不写
#eureka.client.register-with-eureka=true
# 服务注册中心节点地址
eureka.client.service-url.defaultZone=http://localhost:7001/eureka/
设置路由 zuul.routes.api-a.path 里的 api-a是可以随便写的,但是只有不与其他的路由设置不重复就可以,一般会写成对应的服务名字

注意,/** 不是乱写的
看图

(4)到了关键性一步,写 拦截过滤的具体逻辑类

先看看目录结构

名字随意,但是,需要继承父类 ZuulFilter ,然后重写方法

完成源码

package com.example.demomycenzuul.myFilter;

import com.netflix.zuul.ZuulFilter;
import com.netflix.zuul.context.RequestContext;
import org.apache.commons.lang.StringUtils; import org.slf4j.LoggerFactory;
import org.springframework.cloud.netflix.zuul.filters.support.FilterConstants;
import org.springframework.context.annotation.Bean;
import org.springframework.stereotype.Component; import javax.servlet.http.HttpServletRequest;
import java.util.logging.Logger; //重写zuulFilter类,有四个重要的方法
@Component
public class AccessFilter extends ZuulFilter { //`filterType`:返回字符串,代表过滤器的类型。包含以下4种:
// - `pre`:请求在被路由之前执行
// - `routing`:在路由请求时调用
// - `post`:在routing和errror过滤器之后调用
// - `error`:处理请求时发生错误调用
@Override
public String filterType() {
return FilterConstants.PRE_TYPE;
} // `filterOrder`:通过返回的int值来定义过滤器的执行顺序,数字越小优先级越高
@Override
public int filterOrder() {
return 0;
} // `shouldFilter`:返回一个`Boolean`值,判断该过滤器是否需要执行。返回true执行,返回false不执行。
@Override
public boolean shouldFilter() { return true;
} // `run`:过滤器的具体业务逻辑。
@Override
public Object run() {
System.out.println("进入zuul拦截");
//获取上下文
RequestContext ctx = RequestContext.getCurrentContext();
//获取Request
HttpServletRequest request = ctx.getRequest();
//获取请求参数accessToken
String accessToken = request.getParameter("accessToken");
//使用String工具类
if (StringUtils.isBlank(accessToken)) {
ctx.setSendZuulResponse(false); //进行拦截
ctx.setResponseStatusCode(401);
try {
ctx.getResponse().getWriter().write("accessToken is empty,-------401");
} catch (Exception e) {
}
return null;
}
return null;
} }

记住了啊,注解@Component 必须加上,不然因为没有注册bean导致找不到 ,@Component的使用可以看我的另一篇随笔

3.测试

(1)提前注备一个注册中心端口7001 ,2 个服务提供者端口 8001、8003  ,2个服务消费者端口520 、565 ,以及这个zuul网关 端口114

需要注意的是 ,这些 端口都需要注册到 eureka 服务注册中心 7001里面 ,不然zuul找不到消费者实例

(2)输入网址 http://localhost:114/myzuul/test/bb ,/myzuul是zuul网关前缀,test是拦截路径,对应了服务消费者 DEMO-MY-CEN-TEST,

这都是在zuul的application 配置文件设置的

浏览器响应

被网关拦截,因为没有认证参数,被拒绝了路由

输入网址 http://localhost:114/myzuul/test/bb?accessToken=666

(3)因为8001、8003是集群 ,消费者565 的客户端均衡策略默认是轮询策略,

再次输入网址 http://localhost:114/myzuul/test/bb?accessToken=666

(4)访问消费者端口520 , 输入网址 http://localhost:114/myzuul/feign/bb?accessToken=666

消费者520 的客户端均衡策略默认是最佳空闲策略BestAvailableRule, 因此让其调用服务提供者端口8003就不演示了

zuul网关成功拦截请求并做逻辑业务,然后成功转发相应的微服务并获取到结果

完美,撒花

--------------------------------------------

参考博文原址:

https://blog.csdn.net/weixin_41133233/article/details/85166383?utm_medium=distribute.pc_relevant.none-task-blog-baidujs-1

https://blog.csdn.net/JinXYan/article/details/90736561

  

spring cloud --- Zuul --- 心得的更多相关文章

  1. Spring Cloud Zuul 添加 ZuulFilter

    紧接着上篇随笔Spring Cloud Zuul写,添加过滤器,进行权限验证 1.添加过滤器 package com.dzpykj.filter; import java.io.IOException ...

  2. Spring Cloud Zuul网关 Filter、熔断、重试、高可用的使用方式。

    时间过的很快,写springcloud(十):服务网关zuul初级篇还在半年前,现在已经是2018年了,我们继续探讨Zuul更高级的使用方式. 上篇文章主要介绍了Zuul网关使用模式,以及自动转发机制 ...

  3. 笔记:Spring Cloud Zuul 快速入门

    Spring Cloud Zuul 实现了路由规则与实例的维护问题,通过 Spring Cloud Eureka 进行整合,将自身注册为 Eureka 服务治理下的应用,同时从 Eureka 中获取了 ...

  4. Spring Cloud Zuul 限流详解(附源码)(转)

    在高并发的应用中,限流往往是一个绕不开的话题.本文详细探讨在Spring Cloud中如何实现限流. 在 Zuul 上实现限流是个不错的选择,只需要编写一个过滤器就可以了,关键在于如何实现限流的算法. ...

  5. Spring Cloud Zuul 中文文件上传乱码

    原文地址:https://segmentfault.com/a/1190000011650034 1 描述 使用Spring Cloud Zuul进行路由转发时候吗,文件上传会造成中文乱码“?”.1. ...

  6. spring cloud zuul参数调优

    zuul 内置参数 zuul.host.maxTotalConnections 适用于ApacheHttpClient,如果是okhttp无效.每个服务的http客户端连接池最大连接,默认是200. ...

  7. Spring Cloud Zuul 网关使用与 OAuth2.0 认证授权服务

    API 网关的出现的原因是微服务架构的出现,不同的微服务一般会有不同的服务地址,而外部客户端可能需要调用多个服务的接口才能完成一个业务需求,如果让客户端直接与各个微服务通信,会有以下的问题: 客户端会 ...

  8. spring cloud: zuul(四): 正则表达式匹配其他微服务(给其他微服务加版本号)

    spring cloud: zuul(四): 正则表达式匹配其他微服务(给其他微服务加版本号) 比如我原来有,spring-boot-user微服务,后台进行迭代更新,另外其了一个微服务: sprin ...

  9. spring cloud: zuul(二): zuul的serviceId/service-id配置(微网关)

    spring cloud: zuul(二): zuul的serviceId/service-id配置(微网关) zuul: routes: #路由配置表示 myroute1: #路由名一 path: ...

随机推荐

  1. 【kafka学习笔记】kafka的基本概念

    在了解了背景知识后,我们来整体看一下kafka的基本概念,这里不做深入讲解,只是初步了解一下. kafka的消息架构 注意这里不是设计的架构,只是为了方便理解,脑补的三层架构.从代码的实现来看,kaf ...

  2. [特征工程] GBDT

  3. C语言实现鼠标绘图

    使用C语言+EGE图形库(Easy Graphics Engine).思路是通过不断绘制直线来实现鼠标绘图的功能,前一个时刻鼠标的坐标作为直线的起点,现在时刻的坐标作为终点(严格意义是线段而不是直线) ...

  4. ORA-31633:unable to create master table "DP.SYS_EXPORT_FULL_11" ORA-01658

    问题描述:在进行数据泵进行数据库备份的时候,但是导出命令报错,环境是19C 4节点的rac 一体机.目前磁盘空间需要清理,清理之前先备份一下数据库 ORA-31626:job does not exi ...

  5. Node.js 中文乱码解决

    Node.js 中文乱码解决 Node.js 支持中文不太好(实际上是Javascript支持),见<Node.js开发指南>. 要想Node.js正常显示中文,需要两点: 1.js文件保 ...

  6. LuoguP6904 [ICPC2015 WF]Amalgamated Artichokes 题解

    Content 已知常数 \(p,a,b,c,d\),我们知道,第 \(k\) 天的股价公式为 \(price_k=p\times(\sin(a\times k+b)+\cos(c\times k+d ...

  7. Vue2使用Axios发起请求教程详细

    当你看到该文章时希望你已知晓什么是跨域请求以及跨域请求的处理,本文不会赘述 本文后台基于Springboot2.3进行搭建,Controller中不会写任何业务逻辑仅用于配合前端调试 Controll ...

  8. Flutter学习(9)——Flutter插件实现(Flutter调用Android原生

    原文地址: Flutter学习(9)--Flutter插件实现(Flutter调用Android原生) | Stars-One的杂货小窝 最近需要给一个Flutter项目加个apk完整性检测,需要去拿 ...

  9. c++设计模式概述之观察者

    代码写的不够规范,目的是缩短篇幅,实际情况请不要这样做 1.概述 观察者模式,类比生活中的场景,比如看电影,观众对播放的内容有不同的反应, 再比如订阅,公众号订阅,只要你订阅了其公众号,你就会收到其推 ...

  10. nim_duilib(8)之combo

    introduction 更多控件用法,请参考 here 和 源码. 本文的代码基于这里 combo的更多用法,请参考源码中combo.h提供的函数,文末添加其提供的公有函数 xml文件添加代码 基于 ...