精华内容
下载资源
问答
  • Zuul网关

    千次阅读 2019-08-13 14:32:05
    一、Zuul网关简介 zuul是spring cloud中的微服务网关。 网关: 是一个网络整体系统中的前置门户入口。请求首先通过网关,进行路径的路由,定位到具体的服务节点上。 Zuul是一个微服务网关,首先是一个微服务。也是...

    一、Zuul网关简介

    1. zuul是spring cloud中的微服务网关。
      网关: 是一个网络整体系统中的前置门户入口。请求首先通过网关,进行路径的路由,定位到具体的服务节点上。
    2. Zuul是一个微服务网关,首先是一个微服务。也是会在Eureka注册中心中进行服务的注册和发现。也是一个网关,请求应该通过Zuul来进行路由。
    3. Zuul网关不是必要的。是推荐使用的。
      使用Zuul,一般在微服务数量较多(多于10个)的时候推荐使用,对服务的管理有严格要求的时候推荐使用,当微服务权限要求严格的时候推荐使用。

    二、网关的作用

    在这里插入图片描述

    三、网关的应用

    1. 添加依赖
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
    </dependency>
            
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-netflix-zuul</artifactId>
     </dependency>
    
    1. 在main方法上添加@EnableZuulProxy
    import org.springframework.boot.SpringApplication;
    import org.springframework.boot.autoconfigure.SpringBootApplication;
    import org.springframework.cloud.netflix.zuul.EnableZuulProxy;
    
    @SpringBootApplication
    @EnableZuulProxy
    public class Application {
        public static void main(String[] args) {
            SpringApplication.run(Application.class, args);
        }
    }
    
    1. 修改application.yml配置文件
    server:
      port: 8000
    spring:
      application:
        name: zuul
    zuul:
      routes:
        # 标识你服务的名字,这里可以自己定义,一般方便和规范来讲还是跟自己服务的名字一样
        EUREKA-CLIENT-PRODUCER:
          #服务映射的路径,通过这路径就可以从外部访问你的服务了,目的是为了不爆露你机器的IP
          #这里zuul是自动依赖hystrix,ribbon的,不是面向单机
          path: /EUREKA-CLIENT-PROVIDER/**
          #这里一定要是你Eureka注册中心的服务的名称,是因为这里配置serviceId因为跟eureka结合了,
          serviceId: EUREKA-CLIENT-PROVIDER
    eureka:
      client:
        service-url:
          defaultZone: http://admin:123456@127.0.0.1:8761/eureka/
    
    1. 相关说明

    a. 通过zuul访问服务的,URL地址默认格式为:http://zuulHostIp:port/服务名称/服务中的URL

    例如:http://127.0.0.1:8000/EUREKA-CLIENT-PROVIDER/get?name=123
    b. 服务名称就是配置文件中的spring.application.name。
    c. 服务的URL,就是对应的服务对外提供的URL路径

    URL匹配 - URL pattern
    使用路径方式匹配路由规则。
    参数key结构: zuul.routes.customName.path=xxx
    用于配置路径匹配规则。
    其中customName自定义。通常使用要调用的服务名称,方便后期管理
    可使用的通配符有: * ** ?
    ? 单个字符
    * 任意多个字符,不包含多级路径
    ** 任意多个字符,包含多级路径
    zuul.routes.eureka-application-service.path=/api/**
    #参数key结构: zuul.routes.customName.url=xxx
    #用于配置符合path的请求路径路由到的服务地址。
    zuul.routes.eureka-application-service.url=http://127.0.0.1:8080/

    服务名称匹配 - service id pattern 通过服务名称路由
    key结构 : zuul.routes.customName.path=xxx
    #路径匹配规则
    zuul.routes.eureka-application-service.path=/api/**
    key结构 : zuul.routes.customName.serviceId=xxx
    #用于配置符合path的请求路径路由到的服务名称。
    zuul.routes.eureka-application-service.serviceId=eureka-application-service
    simple service id pattern 简化配置方案
    #如果只配置path,不配置serviceId。则customName相当于服务名称。
    #符合path的请求路径直接路由到customName对应的服务上。
    zuul.routes.eureka-application-service.path=/api/**

    路由排除设置 - ignored service id pattern
    #配置不被zuul管理的服务列表。多个服务名称使用逗号’,'分隔。
    #配置的服务将不被zuul代理。
    zuul.ignored-services=eureka-application-service
    #通配方式配置排除列表。
    zuul.ignored-services=*
    #使用服务名称匹配规则配置路由列表,相当于只对已配置的服务提供网关代理。
    zuul.routes.eureka-application-service.path=/api/**
    #通配方式配置排除网关代理路径。所有符合ignored-patterns的请求路径都不被zuul网关代理。
    zuul.ignored-patterns=//test/
    zuul.routes.eureka-application-service.path=/api/**

    路由前缀配置
    #prefix URL pattern 前缀路由匹配
    #配置请求路径前缀,所有基于此前缀的请求都由zuul网关提供代理。
    zuul.prefix=/api
    #使用服务名称匹配方式配置请求路径规则。
    #这里的配置将为:http://ip:port/api/appservice/**的请求提供zuul网关代理。
    #并将请求路由到服务eureka-application-service中。
    zuul.routes.eureka-application-service.path=/appservice/**

    zuul网关配置总结

    网关配置方式有多种,默认、URL、服务名称、排除|忽略、前缀。
    网关配置没有优劣好坏,应该在不同的情况下选择合适的配置方案。
    zuul网关其底层使用ribbon来实现请求的路由,并内置Hystrix,可选择性提供网关fallback逻辑。使用zuul的时候,并不推荐使用Feign作为application client端的开发实现。毕竟Feign技术是对ribbon的再封装,使用Feign本身会提高通讯消耗,降低通讯效率,只在服务相互调用的时候使用Feign来简化代码开发就够了。而且商业开发中,使用Ribbon+RestTemplate来开发的比例更高。

    展开全文
  • zuul网关

    2019-11-26 18:37:04
    zuul网关 Zuul路由网关简介及基本使用 简介 Zuul API路由网关服务简介 zuul是spring cloud中的微服务网关。 网关: 是一个网络整体系统中的前置门户入口。请求首先通过网关,进行路径的路由,定位到具体的服务节点上...

    zuul网关

    Zuul路由网关简介及基本使用

    简介

    Zuul API路由网关服务简介

    zuul是spring cloud中的微服务网关。
    网关: 是一个网络整体系统中的前置门户入口。请求首先通过网关,进行路径的路由,定位到具体的服务节点上。

    Zuul是一个微服务网关,首先是一个微服务。也是会在Eureka注册中心中进行服务的注册和发现。也是一个网关,请求应该通过Zuul来进行路由。

    Zuul网关不是必要的。是推荐使用的。
    使用Zuul,一般在微服务数量较多(多于10个)的时候推荐使用,对服务的管理有严格要求的时候推荐使用,当微服务权限要求严格的时候推荐使用。

    在这里插入图片描述

    请看上图,这里的API 路由网关服务 由Zuul实现,主要就是对外提供服务接口的时候,起到了请求的路由和过滤作用,也因此能够隐藏内部服务的接口细节,从来有利于保护系统的安全性;

    路由配置
    Zuul 路由配置

    我们新建一个module microservice-zuul-3001
    在这里插入图片描述
    这里我们的zuul也注册到eureka服务里,端口3001;

    我们修改下Hosts,专门为zuul搞个本地域名映射
    hosts文件 加下:

    127.0.0.1 zuul.xzy.com

    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.xzy</groupId>
            <artifactId>springcloud</artifactId>
            <version>1.0-SNAPSHOT</version>
        </parent>
        <artifactId>microservice-zuul-3001</artifactId>
    
        <properties>
            <java.version>1.8</java.version>
        </properties>
    
        <dependencies>
            <dependency>
                <groupId>com.xzy</groupId>
                <artifactId>microservice-common</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>
            </dependency>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-starter-eureka</artifactId>
            </dependency>
            <!-- actuator监控 -->
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-actuator</artifactId>
            </dependency>
            <!-- hystrix容错 -->
            <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>
            <!--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>
    
    

    application.yml

    server:
      port: 3001
      context-path: /
    spring:
      application:
        name: microservice-zuul
    eureka:
      instance:
        instance-id: microservice-zuul:3001
        prefer-ip-address: true
      client:
        service-url:
          defaultZone: http://eureka2001.xzy.com:2001/eureka/,http://eureka2002.xzy.com:2002/eureka/,http://eureka2003.xzy.com:2003/eureka/
    info:
      groupId: com.xzy.springcloud
      artifactId: microservice-zuul-3001
      version: 1.0-SNAPSHOT
      userName: http://xzy.com
      phone: 7758258
    
    

    启动类
    加上 @EnableZuulProxy 注解

    package com.xzy.microservicezuul3001;
    
    import org.springframework.boot.SpringApplication;
    import org.springframework.boot.autoconfigure.SpringBootApplication;
    import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration;
    import org.springframework.boot.autoconfigure.orm.jpa.HibernateJpaAutoConfiguration;
    import org.springframework.cloud.netflix.zuul.EnableZuulProxy;
    
    @SpringBootApplication(exclude={DataSourceAutoConfiguration.class, HibernateJpaAutoConfiguration.class})
    @EnableZuulProxy
    public class MicroserviceZuul3001Application {
    
        public static void main(String[] args) {
            SpringApplication.run(MicroserviceZuul3001Application.class, args);
        }
    
    }
    
    

    我们测试下:
    启动三个eureka 然后再启动下一个1004,1006服务,以及 zuul网关服务;
    在这里插入图片描述

    这里有两个服务;

    我们直接请求:http://localhost/student/hystrix能获取到数据;
    在这里插入图片描述
    在这里插入图片描述

    我们用 http://zuul.xzy.com:3001/microservice-student/student/hystrix 域名+端口+服务名称+请求地址 也能请求到数据;
    在这里插入图片描述
    说明我们的路由基本配置OK

    Zuul路由映射配置

    上面是zuul的简单使用,从接口地址很轻易的就暴露了服务提供者的唯一标识名microservice-student;有安全风险,我们需要将其隐藏;

    ignored-services的作用是将原来的服务提供者唯一标识名禁用;
    Prefix的作用是给服务加前缀

    zuul:
      routes:
        studentServer.serviceId: microservice-student
        studentServer.path: /studentServer/**
      ignored-services: "*"
      prefix: /xzy
    

    配置完毕后可通过以下链接做测试
    http://zuul.xzy.com:3001/microservice-student/student/list
    http://zuul.xzy.com:3001/studentServer/student/list
    http://zuul.xzy.com:3001/xzy/microservice-student/student/list
    http://zuul.xzy.com:3001/xzy/studentServer/student/list

    在这里插入图片描述

    对应的配置会出现上面的错误页面,这是正常现象。

    Zuul请求过滤配置

    比如我们登录某个系统 需要身份验证,用户名密码啥的;

    我们请求服务,也可以来设置身份验证,也就是过滤非法请求;Zuul通过ZuulFilter过滤器实现;
    一般具体实现的话 每次经过Zuul服务网关 我们都对带来的token进行有效性验证;

    我们先定义一个 AccessFilter类:

    package com.xzy.microservicezuul3001.filter;
    
    import com.netflix.zuul.ZuulFilter;
    import com.netflix.zuul.context.RequestContext;
    import com.netflix.zuul.exception.ZuulException;
    import org.apache.log4j.Logger;
    
    import javax.servlet.http.HttpServletRequest;
    
    /**
     * @author XZY
     * @site www.Xzy.com
     * @company
     * @create  2019-11-26 11:35
     */
    public class AccessFilter extends ZuulFilter {
    
        Logger logger=Logger.getLogger(AccessFilter.class);
    
        /**
         * 判断该过滤器是否要被执行
         */
        @Override
        public boolean shouldFilter() {
            return true;
        }
    
        /**
         * 过滤器的具体执行逻辑
         */
        @Override
        public Object run() throws ZuulException {
            RequestContext ctx = RequestContext.getCurrentContext();
            HttpServletRequest request = ctx.getRequest();
            String parameter = request.getParameter("accessToken");
            logger.info(request.getRequestURL().toString()+" 请求访问");
            if(parameter==null){
                logger.error("accessToken为空!");
                ctx.setSendZuulResponse(false);
                ctx.setResponseStatusCode(401);
                ctx.setResponseBody("{\"result\":\"accessToken is empty!\"}");
                return null;
            }
            //  token判断逻辑
            logger.info(request.getRequestURL().toString()+" 请求成功");
            return null;
        }
    
        /**
         * 过滤器的类型 这里用pre,代表会再请求被路由之前执行
         */
        @Override
        public String filterType() {
            return "pre";
        }
    
        /**
         * 过滤器的执行顺序
         */
        @Override
        public int filterOrder() {
            return 0;
        }
    
    }
    

    然后再开启下 Filter配置:

    package com.xzy.microservicezuul3001.config;
    
    import com.xzy.microservicezuul3001.filter.AccessFilter;
    import org.springframework.context.annotation.Bean;
    import org.springframework.context.annotation.Configuration;
    
    @Configuration
    public class ZuulConfig {
    
        @Bean
        public AccessFilter accessFilter(){
            return new AccessFilter();
        }
    }
    
    

    在这里插入图片描述

    浏览器输入地址进行测试

    http://zuul.xzy.com:3001/xzy/studentServer/student/list

    http://zuul.xzy.com:3001/xzy/studentServer/student/list?accessToken=1
    在这里插入图片描述

    在这里插入图片描述

    zuul网关配置总结

    网关配置方式有多种,默认、URL、服务名称、排除|忽略、前缀。
    网关配置没有优劣好坏,应该在不同的情况下选择合适的配置方案。
    zuul网关其底层使用ribbon来实现请求的路由,并内置Hystrix,可选择性提供网关fallback逻辑。使用zuul的时候,并不推荐使用Feign作为application client端的开发实现。毕竟Feign技术是对ribbon的再封装,使用Feign本身会提高通讯消耗,降低通讯效率,只在服务相互调用的时候使用Feign来简化代码开发就够了。而且商业开发中,使用Ribbon+RestTemplate来开发的比例更高。

    over~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

    展开全文

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 9,916
精华内容 3,966
关键字:

zuul网关