SpringCloud从零开始(八)之Zuul网关服务

前言:上一篇介绍了关于Cloud的应急保护机制 Hystrix,今天来介绍一下有关zuul的相关知识。

1、什么是服务网关?

服务网关充当着服务客户端和被调用的服务之间的中介。传统调用方式,客户端需要与每一个微服务联系,都得记住每一个微服务的服务名,端口号。如下图:
在这里插入图片描述
如果应用程序就几个微服务还不成什么大问题,当是当应用程序拥有越来越多的微服务的时候,就遍对开发人员造成了很大影响,这个时候,必须找出一个中介代理去寻找服务。转发请求。那么遍有了网关。如下图:
在这里插入图片描述
这样,我们只需要网关中配置相应的路径映射发送请求的时候,网关就会转发我们的请求到对应的 服务中。

2、 Zuul介绍

Zuul就充当了一个网关服务的角色,spring cloud 将他整合,我们只遇需要极少的配置就可以使用它了。Zuul提供了许多功能

  • 可以将一个微服务的所有服务都映射到一个url,值提供一个路口点就可以访问。
  • 可以对网关请求的时候,设置过滤器,添加额外的操作,下面都会介绍。

3、网关基础工程搭建。

目标:
1、创建网关模块microservice_zuul_9527

1、在父工程下面新建model

在这里插入图片描述

2、引入相关依赖

因为需要注册到Eureka中去,所以也要引入Eureka客户端的依赖

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-eureka</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-zuul</artifactId>
        </dependency>
    </dependencies>
3、编写配置文件application.yml
server:
  port: 9527
spring:
  application:
    name: microservice-zuul
eureka:  #设置eureka注册服务的地址
  client:
    service-url:
        defaultZone:  http://eureka7001:7001/eureka,http://eureka7003:7003/eureka,http://eureka7002:7002/eureka
  instance:
    instance-id: microservice-zuul-9527 #配置服务的别名
    prefer-ip-address: true # 注册的时候使用ip注册
zuul:	#配置路由规则
  routes: 
    microservice-product-provider8001:
      path: /provider/**
      serviceId: microservice-provider
      

在边配置了路由规则 意思是然后/privider/**的请求都会到microservice-provider中去找。

4、开始测试

启动服务
microservice_eureka_7001
microservice_eureka_7002
microservice_eureka_7003
microservice_zuul_9527
microservice_product_provider8001

服务启动成功之后,先是通过原生的url进行访问http://localhost:8001/product/list
返回:

[{"pid":1,"dbSource":"springcloud001","pname":"舒肤佳"},{"pid":2,"dbSource":"springcloud001","pname":"可口可乐"},{"pid":3,"dbSource":"springcloud001","pname":"百事可乐"},{"pid":4,"dbSource":"springcloud001","pname":"冰箱"},{"pid":5,"dbSource":"springcloud001","pname":"电视"},{"pid":6,"dbSource":"springcloud001","pname":"苹果"}]

通过网关访问 http://localhost:9527/provider/product/list
返回:

[{"pid":1,"dbSource":"springcloud001","pname":"舒肤佳"},{"pid":2,"dbSource":"springcloud001","pname":"可口可乐"},{"pid":3,"dbSource":"springcloud001","pname":"百事可乐"},{"pid":4,"dbSource":"springcloud001","pname":"冰箱"},{"pid":5,"dbSource":"springcloud001","pname":"电视"},{"pid":6,"dbSource":"springcloud001","pname":"苹果"}]

说明我们通过访问网关,通过也能访问到我们的微服务。这样网关起到了转发的作用。

5、网关的过滤器

Zuul网关代理的所有请求确实可以简化服务的调用,但是能在网关服务调用的时候,自定义逻辑时,Zuul的真正的作用才发挥出来。这种作用类似于拦截器的效果,可以在方法调用前后实现我们自定义的一些逻辑。

扫描二维码关注公众号,回复: 9091327 查看本文章
(1)创建过滤器

只需要继承一个类----ZuulFilter重写相关方法


    /**
     * 过滤器的类型
     * pre 请求之前
     * route 路由时
     * post rout和error之后
     * error 发生error时调用
     * @return
     */
    @Override
    public String filterType() {
        return "pre";
    }

    /**
     * 过滤器的优先级别 当有多个数值越小优先级越高
     * @return
     */
    @Override
    public int filterOrder() {
        return 0;
    }

    /**
     * 是否开启过滤器
     * true 开启
     * false 关闭
     * @return
     */
    @Override
    public boolean shouldFilter() {
        return true;
    }

    /**
     * 过滤器的主要执行方法
     * 返回然后object 代表继续执行
     * requestContext.setSendZuulResponse(false)//终止运行
     * @return
     * @throws ZuulException
     */
    @Override
    public Object run() throws ZuulException {
	/**
	* 这里就是编写逻辑的主要代码
	*用于判断哪种情况应该拦截
	*哪种情况放行
	*/
	//如果返回的只要是 object对象 就能继续执行
	//如果 requestContext.setSendZuulResponse(false)则代表这次执行不通过
	//1、需要放行一些最基本的请求比如:登录
	//放行网关转发的第一次请求 OPTIONS
        return null;
    }

当我们需要这个过滤器的时候,只要使用@Component注解 添加到容器即可。这里就不做演示

发布了98 篇原创文章 · 获赞 44 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/weixin_43732955/article/details/97821729
今日推荐