zuul网关找不到服务_微服务编程:Zuul服务网关实现原理,这次为你讲透

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

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

Zuul服务网关介绍

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

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

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

创建Zuul模块项目

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

在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 @EnableZuulProxy public 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: 8907 spring: application: name: service-zuul zuul: routes: api-ribbon: path: /api-ribbon/** serviceId: cloud-ribbon api-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,浏览器显示如下:

由此可见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 @Slf4j public class TestFilter extends ZuulFilter { /** * filterType(pre:路由之前,routing:路由之时, * post:路由之后,error:发送错误调用, * filterOrder过滤的顺序,shouldFilter:逻辑判断是否过滤, * run:过滤器的逻辑实体) * @return */ @Override public String filterType() { return "pre"; } @Override public int filterOrder() { return 0; } @Override public boolean shouldFilter() { return true; } @Override public 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,浏览器会正确输出内容,如下图:

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值