springCloud路由网关zuul的配置升级
发布日期:2021-06-29 14:16:02 浏览次数:2 分类:技术文章

本文共 5435 字,大约阅读时间需要 18 分钟。

前言

主要功能,动态路由,过滤器,权限验证等。为什么使用路由网关自行百度。

下面几种配置主要的不同就是application.properties配置不一样。


初级配置

pom.xml引入zuul模块

org.springframework.cloud
spring-cloud-starter-zuul

开启zuul的功能

在其入口applicaton类加上注解@EnableZuulProxy,开启zuul的功能

该注解有服务注册断路保护功能

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

pathurl绑定

最简单的是pathurl绑定

配置application.properties
例如:

zuul.routes.hello.path=/test/**zuul.routes.hello.url=http://localhost:9000/

语法如下:

zuul.routes.
.path=路径zuul.routes.
.url=url地址

其中route是自定义的路由名,内部使用,,path是路径名,比如上面的hello,它就是网关路由名,当访问/test/**,请求会转发到url指定的地址上。

以上面的为便。

当前请求:http://ZUUL_HOST:ZUUL_PORT/test/**

最终请求路径如下:http://localhost:9000/test/**

这是最简单的配置,url与path绑定关系事先写死,但也同时失去了灵活配置的特性,特别在微服务集群时,绝对不会出现这种配置。


二次升级版

上面的缺点也说了,很少使用这种配置,做为升级版,path与微服务的serviceId绑定,实际上在实现微服务架构时,服务名与服务实例地址的关系在eureka server中已经存在了,所以只需要将Zuul注册到eureka server上去发现其他服务,就可以实现对serviceId的映射。

pom.xml引入模块

org.springframework.cloud
spring-cloud-starter-zuul
org.springframework.cloud
spring-cloud-starter-eureka

pathserviceId绑定

例如

spring.application.name=gateway-service-zuulserver.port=8888zuul.routes.api-a.path=/test/**zuul.routes.api-a.serviceId=producer-serviceeureka.client.serviceUrl.defaultZone=http://localhost:8000/eureka/

语法如下:

zuul.routes.
.path=路径zuul.routes.
.serviceId=url地址

eureka.client.serviceUrl.defaultZone:注册中心地址

api-a:是自定义的路由名。用于pathserviceId绑定
Zuul与Eureka整合,实现服务实例的自动化维护,所以不需要像传统路由配置方式那样为serviceId去指定具体的服务实例url,只需要通过一组zuul.routes.<route>.pathzuul.routes.<route>.serviceId参数对的方式配置即能实现路由。

当前请求:http://ZUUL_HOST:ZUUL_PORT/test/**

最终请求路径如下:http://producer-service/test/**

优化

对于面向服务的路由配置,除了使用path和serviceId映射的配置方式之外,还有一种更简洁的配置方式:zuul.routes.<serviceId>=<path>,其中<serviceId>用来指定路由的具体服务名,<path>用来配置匹配的请求表达式。

例如:

spring.application.name=gateway-service-zuulserver.port=8888zuul.routes.producer-service=/test/**eureka.client.serviceUrl.defaultZone=http://localhost:8000/eureka/

三次升级版

网关的默认路由规则

而且spring cloud zuul帮我们配置了网关的默认路由规则
由于默认情况下,Zuul会代理所有注册到Eureka Server的微服务,故spring cloud很容易帮我们配置了默认路由规则。
默认路由规则如下http://ZUUL_HOST:ZUUL_PORT/微服务在Eureka上的serviceId/**

去掉path与serviceId绑定配置

spring.application.name=gateway-service-zuulserver.port=8888eureka.client.serviceUrl.defaultZone=http://localhost:8000/eureka/

最终请求路径如下:http://ZUUL_HOST:ZUUL_PORT/serviceId/**

简化的配置过程,依赖serviceId找路径,即使服务达到上千个集群也没问题,因为微服务集群serviceId是一样的


过滤器

  1. 继承ZuulFilter类
  2. run方法实现具体过滤逻辑
  3. filterType方法指定过滤器触发时间,4种

    1. pre:路由之前,这种过滤器在请求被路由之前调用。我们可利用这种过滤器实现身份验证、在集群中选择请求的微服务、记录调试信息等。
      1. routing:路由之时,这种过滤器将请求路由到微服务。这种过滤器用于构建发送给微服务的请求,并使用Apache HttpClient或Netfilx Ribbon请求微服务。
      2. post: 路由之后, 这种过滤器在路由到微服务以后执行。这种过滤器可用来为响应添加标准的HTTP Header、收集统计信息和指标、将响应从微服务发送给客户端等。
    2. error:发送错误调用,在其他阶段发生错误时执行该过滤器。

    3. filterOrder方法:定义filter的顺序,数字越小表示顺序越高,越优先执行

    4. shouldFilter方法:是否启用Filter,没有默认值。

    掌握这5点即可。例如

import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import org.slf4j.Logger;import org.slf4j.LoggerFactory;import com.alibaba.fastjson.JSON;import com.gitee.myclouds.toolbox.util.MyUtil;import com.gitee.myclouds.toolbox.wrap.Dto;import com.gitee.myclouds.toolbox.wrap.Dtos;import com.netflix.zuul.ZuulFilter;import com.netflix.zuul.context.RequestContext;/** * 演示Filter基本用法 * 

*

* 基于网关系统的过滤器机制,可以实现动态路由、监控、授权、安全、请求统计等诸多功能。 * 大家尽情发挥即可。 * * @author xiongchun */public class MyDemoFilter extends ZuulFilter {

private static final Logger log = LoggerFactory.getLogger(MyDemoFilter.class); /** * Filter需要执行的动作 */ @Override public Object run() { //获取当前请求上下文,在这个上下文基础上可以做很多事情了。具体自己查看API。 RequestContext context = RequestContext.getCurrentContext(); //获取原始Htpp请求,有这个对象也可以做很多事情了。自己发挥吧。 HttpServletRequest request = context.getRequest(); //获取全部参数 Dto inDto = Dtos.newDto(request); log.info("Request请求参数列表:{}", JSON.toJSONString(inDto)); log.info("Request请求URL:{}", request.getRequestURL()); //获取指定参数,token之类的安全类参数也可以是在头信息中 String token = request.getParameter("token"); //Token的检验逻辑没这么简单,这里只是给大家举个栗子 if (MyUtil.isNotEmpty(token)) { context.setSendZuulResponse(true); //将请求往后转发 context.setResponseStatusCode(200); } else { HttpServletResponse response = context.getResponse(); response.setHeader("Content-Type", "application/json;charset=UTF-8"); context.setSendZuulResponse(false); //终止转发,返回响应报文 context.setResponseStatusCode(400); Dto responseDto = Dtos.newDto("code", -1); responseDto.put("msg", "请求被拦截"); context.setResponseBody(JSON.toJSONString(responseDto)); } return null; } /** * 是否启用Filter */ @Override public boolean shouldFilter() { return true; } /** * 优先级 *

定义filter的顺序,数字越小表示顺序越高,越优先执行 */ @Override public int filterOrder() { return 10; } /** * Filter类型 *

  • PRE: 这种过滤器在请求被路由之前调用。我们可利用这种过滤器实现身份验证、在集群中选择请求的微服务、记录调试信息等。 *
  • ROUTING:这种过滤器将请求路由到微服务。这种过滤器用于构建发送给微服务的请求,并使用Apache HttpClient或Netfilx Ribbon请求微服务。 *
  • POST:这种过滤器在路由到微服务以后执行。这种过滤器可用来为响应添加标准的HTTP Header、收集统计信息和指标、将响应从微服务发送给客户端等。 *
  • ERROR:在其他阶段发生错误时执行该过滤器。 */ @Override public String filterType() { return "pre"; }}
  • 转载地址:https://chenyuan.blog.csdn.net/article/details/80360656 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

    上一篇:SpringBoot配置属性之Server
    下一篇:jenkins持续化部署docker容器

    发表评论

    最新留言

    初次前来,多多关照!
    [***.217.46.12]2024年04月21日 14时00分13秒

    关于作者

        喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
    -- 愿君每日到此一游!

    推荐文章