java 网关正则表达式_微服务编程:Zuul服务网关实现原理,这次为你讲透

4a25b0260d7aa55634de70e8d89bfc1c.png

关注程序员7歌,一起用技术改变世界

大家好,我是程序员7歌,今天为大家讲解SpringCloud Zuul服务网关,想要深入学习微服务开发的小伙伴赶紧收藏本专栏吧!

Zuul服务网关介绍

SpringCloud Zuul类似于第三方App/PC和服务提供方之间的保护罩,作为前端的服务,Zuul可以实现动态路由/监控/安全性等功能。Zuul具备根据实际需求将请求路由到多个AWS自动弹性组的能力。

在微服务开发架构中,我们需要几个基础的服务组件,其中包含:服务注册与发现/服务消费/负载均衡/路由/配置管理等,由以上服务组件相互协作,共同发挥其作用实现微服务系统,如下图:

cf5a823cb410fc73134d922e7b5d371f.png

在微服务系统中,常见的负载均衡方式为:客户端请求先经过负载均衡,到达服务网关,再到服务统一注册的服务中心。客户端想要请求到后台服务,首先请求到Zuul网关,然后Zuul网关将请求负载均衡分发到对应的服务。

创建Zuul模块项目

我们继续在Maven聚合项目下面新增cloud-zuul module模块项目,新建完成的项目结构如下图:

ef81e915aec88c431b65b4c89800fc2f.png

在cloud-zuul的启动类CloudZuulApplication上添加注解@EnableEurekaClient和@EnableZuulProxy,用来开启zuul功能,代码如下:

package com.july.cloudzuul;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;/*** 测试zuul路由* @author zqk* @since 2019/11/18*/@SpringBootApplication@EnableEurekaClient@EnableZuulProxypublic class CloudZuulApplication{public static void main(String[] args){SpringApplication.run(CloudZuulApplication.class, args);}}

然后我们修改cloud-zuul的配置文件bootstra.yml,添加服务中心地址:http://localhost:8902/eureka/,添加服务名:cloud-zuul,标注请求转发给ribbon还是feign,配置如下:

eureka:client:serviceUrl:defaultZone: http://127.0.0.1:8902/eureka/server:port: 8907spring:application:name: service-zuulzuul:routes:api-ribbon:path: /api-ribbon/**serviceId: cloud-ribbonapi-feign:path: /api-feign/**serviceId: cloud-feign

zuul配置表示:请求为/api-ribbon/的分发到cloud-ribbon服务,请求为/api-feign/的分发到cloud-feign服务。接下来我们依次启动聚合项目的五个服务:cloud-server/cloud-client/cloud-ribbon/cloud-feign/cloud-zuul,打开浏览器访问服务注册中心地址:http://localhost:8902,我们可以看到五个服务都注册成功,新开浏览器窗口访问地址:http://localhost:8907/api-ribbon/test?msg=123456和http://localhost:8907/api-feign/test?msg=123456,浏览器显示如下:

56a5218c0ec9c27af5b49ab24c3b6a3a.png

55a516e6714f78a758abb19753dd29e3.png

由此可见SpringCloud Zuul已经实现路由功能。

Zuul实现服务过滤功能

以上就是我对Zuul实现路由功能的教程讲解,接下来我们讲解Zuul实现服务过滤功能,在cloud-zuul模块项目里面创建TestFilter测试类,此类需要继承ZuulFilter,实现它的方法,代码如下:

package com.july.cloudzuul.webconfig;import com.netflix.zuul.ZuulFilter;import com.netflix.zuul.context.RequestContext;import com.netflix.zuul.exception.ZuulException;import lombok.extern.slf4j.Slf4j;import org.springframework.stereotype.Component;import org.springframework.util.StringUtils;import javax.servlet.http.HttpServletRequest;/*** 测试服务过滤信息* @author zqk* @since 2019/11/18*/@Component@Slf4jpublic class TestFilter extends ZuulFilter{/*** filterType(pre:路由之前,routing:路由之时,* post:路由之后,error:发送错误调用,* filterOrder过滤的顺序,shouldFilter:逻辑判断是否过滤,* run:过滤器的逻辑实体)* @return*/@Overridepublic String filterType(){return "pre";}@Overridepublic int filterOrder(){return 0;}@Overridepublic boolean shouldFilter(){return true;}@Overridepublic Object run() throws ZuulException{RequestContext ctx = RequestContext.getCurrentContext();HttpServletRequest request = ctx.getRequest();log.info(String.format("%s >>> %s", request.getMethod(), request.getRequestURL().toString()));String filter = request.getParameter("filter");if(StringUtils.isEmpty(filter)) {log.warn("filter is empty");ctx.setSendZuulResponse(false);ctx.setResponseStatusCode(401);try {ctx.getResponse().getWriter().write("filter is empty!!!");}catch (Exception e){e.printStackTrace();}return null;}log.info("测试成功");return null;}}

然后我们再次启动cloud-zuul项目,访问浏览器:http://localhost:8907/api-ribbon/test?msg=123456&filter=123456,浏览器会正确输出内容,如下图:

d05f8a9a6f5bfcee91216d0e2e7f410f.png

如果我们去掉&filter=123456,重新访问浏览器会输出以下内容,如下图:

6daf2977c245fc056611ce4f6f0d8414.png

那么我们可以得出结论是zuul实现服务过滤功能了,根据自定义属性访问相关服务。好了,以上就是SpringCloud Zuul的实现教程,小伙伴有不懂的私信我吧,感谢大家观看喔~~❤️

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值