• SpringCLoud之搭建Zuul网关集群


    1.使用技术

      Springboot,SpringCloud,Zuul,Nignx

    2.目的

      使用Zuul搭建微服务高可用的网关

    3.项目创建

    3.1 创建注册中心(略)

    3.2 创建一个hello-service的服务工程

    3.3 创建springcloud-zuul-ha网关服务

    3.3.1 创建工程(略)

    3.3.2 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 http://maven.apache.org/xsd/maven-4.0.0.xsd">
        <modelVersion>4.0.0</modelVersion>
    
        <groupId>qinfeng.zheng</groupId>
        <artifactId>springcloud-zuul-ha</artifactId>
        <version>0.0.1-SNAPSHOT</version>
        <packaging>jar</packaging>
    
        <name>springcloud-zuul-ha</name>
        <description>Demo project for Spring Boot</description>
    
        <parent>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-parent</artifactId>
            <version>1.4.2.RELEASE</version>
            <relativePath/> <!-- lookup parent from repository -->
        </parent>
    
        <properties>
            <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
            <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
            <java.version>1.8</java.version>
        </properties>
    
        <dependencies>
    
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-starter-zuul</artifactId>
            </dependency>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-starter-eureka</artifactId>
            </dependency>
    
        </dependencies>
        <dependencyManagement>
            <dependencies>
                <dependency>
                    <groupId>org.springframework.cloud</groupId>
                    <artifactId>spring-cloud-dependencies</artifactId>
                    <!--Dalston.RC1这个高版本的zuul依赖有问题-->
                    <version>Brixton.SR7</version>
                    <type>pom</type>
                    <scope>import</scope>
                </dependency>
            </dependencies>
        </dependencyManagement>
    
        <build>
            <plugins>
                <plugin>
                    <groupId>org.springframework.boot</groupId>
                    <artifactId>spring-boot-maven-plugin</artifactId>
                </plugin>
            </plugins>
        </build>
    </project>

    3.3.3 application.yml

    ###服务注册地址
    eureka:
      client:
        serviceUrl:
          defaultZone: http://localhost:8763/eureka/
    ###api网关端口号
    server:
      port: 82
    ###网关名称
    spring:
      application:
        name: service-zuul
    
    zuul:
      routes:
      ###定义转发服务规则
        api-a:
          path: /api-hello/**   #请求路径中含有api-hello,都会转发到hello-service服务
          ###服务别名  zuul网关默认整合ribbon 自动实现负载均衡轮训效果
          serviceId: hello-service

    3.3.4 定义一个过滤器

      qinfeng.zheng.filter.AccessFilter

    import com.netflix.zuul.ZuulFilter;
    import com.netflix.zuul.context.RequestContext;
    import org.apache.commons.lang.StringUtils;
    import org.springframework.beans.factory.annotation.Value;
    import org.springframework.stereotype.Component;
    
    import javax.servlet.http.HttpServletRequest;
    
    /**
    * 创建时间: 16:07 2018/7/16
    * 修改时间:
    * 编码人员: ZhengQf
    * 版 本: 0.0.1
    * 功能描述: 自定义一个Zuul Filter,它在请求路由之前进行过滤
    *
    * 补: zuul两大功能: 1.路由请求
    * 2.过滤
    */
    @Component
    public class AccessFilter extends ZuulFilter {
    
      @Value("${server.port}")
      private String serverPort;
    
    /**
    * 过滤器的类型,它决定过滤器在请求的哪个生命周期中执行,
    * pre:请求被路由之前做一些前置工作 ,比如请求和校验
    * routing : 在路由请求时被调用,路由请求转发,即是将请求转发到具体的服务实例上去.
    * post : 在routing 和 error过滤器之后被调用..所以post类型的过滤器可以对请求结果进行一些加工
    * error :处理请求发生错误时调用
    */
      @Override
      public String filterType() {
    
        return "pre"; //
      }
    
    /**
    *过滤器的执行顺序.
    *在一个阶段有多个过滤器时,需要用此指定过滤顺序
    * 数值越小优先级越高
    */
      @Override
      public int filterOrder() {
        return 0;
      }
    
    /**
    * 判断过滤器是否执行,直接返回true,代表对所有请求过滤
    * 此方法指定过滤范围
    * @return
    */
      @Override
      public boolean shouldFilter() {
        return true;
      }
    
    /**
    * 过滤的具体逻辑
    * @return
    */
      @Override
      public Object run() {
    
     
    
      // 1.获取上下文
      RequestContext currentContext = RequestContext.getCurrentContext();
      // 2.获取 Request
      HttpServletRequest request = currentContext.getRequest();
      // 3.获取token 的时候 从请求头中获取
      String token = request.getParameter("token");
      request.setAttribute("serverPort", serverPort);
      if (StringUtils.isEmpty(token)) {
          // 不会继续执行... 不会去调用服务接口,网关服务直接响应给客户端
          currentContext.setSendZuulResponse(false);
          currentContext.setResponseBody("token is null");
          currentContext.setResponseStatusCode(401);
          return null;
          // 返回一个错误提示
      }
      // 正常执行调用其他服务接口...
      System.out.println("网关执行端口号:" + serverPort);
      return null;
      }
    
    } 

    3.3.5 启动类

    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;
    
    @EnableZuulProxy
    @EnableEurekaClient
    @SpringBootApplication
    public class SpringcloudZuulHaApplication {
    
        public static void main(String[] args) {
            SpringApplication.run(SpringcloudZuulHaApplication.class, args);
        }
    }
     

    3.3.6  启动网关项目

    使用server.port模拟两个网关项目,端口号分别为81,82   -------> 测试网关高可用

    使用server.port模拟两个hello-service项目,端口号分别为8080,8081 ---->测试zuul的路由时,自动负载均衡

    查看注册中心,一共有四个服务:

       3.4 nginx配置负载均衡,然后 cmd ,start nginx.exe启动nginx服务

         upstream  backServer{
            server 127.0.0.1:81;
            server 127.0.0.1:82;
        }
        
        server {
            listen       80;
            server_name  qinfeng.zheng.com;

            location / {
                ### 指定上游服务器负载均衡服务器
                proxy_pass http://backServer/;
                index  index.html index.htm;
            }
        }

       3.5 在本地host文件中配置 qinfeng.zheng.com 的域名

    4.测试

      第一次请求: http://qinfeng.zheng.com/api-hello/hello/index?token=123

      

    第二次请求:http://qinfeng.zheng.com/api-hello/hello/index?token=123

    5.总结

      1.使用nignx负载均衡和反向代理技术可以实现网关的高可用

      2.zuul网关自动集成ribbon客户端,实现路由的负载均衡

    日拱一卒无有尽,功不唐捐终入海
  • 相关阅读:
    laravel生命周期
    工厂模式
    PHP保留两位小数的几种方法
    存储单位转换
    防盗链之URL参数签名
    redis基础
    Redis 如何实现持久化
    Python高级语法-私有属性-with上下文管理器(4.7.3)
    Python高级语法-私有属性-魔法属性(4.7.2)
    Python高级语法-私有属性-名字重整(4.7.1)
  • 原文地址:https://www.cnblogs.com/z-qinfeng/p/9668679.html
Copyright © 2020-2023  润新知