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客户端,实现路由的负载均衡

SpringCLoud之搭建Zuul网关集群的更多相关文章

  1. Spring Cloud之Zuul网关集群

    Nginx+Zuul 一主一备 或者 轮训多个 在微服务中,所有服务请求都会统一到Zuul网关上. Nginx 配置: #user nobody; worker_processes 1; #error ...

  2. 《springcloud 二》微服务动态网关,网关集群

    动态网关    实际上是网关和分布式配置中心的整合,通过post手动刷新,生效 动态网关 传统方式将路由规则配置在配置文件中,如果路由规则发生了改变,需要重启服务器.结合整合SpringCloud C ...

  3. 庐山真面目之六微服务架构Consul集群、Ocelot网关集群和Nginx版本实现

    庐山真面目之六微服务架构Consul集群.Ocelot网关集群和Nginx版本实现 一.简介      在上一篇文章<庐山真面目之五微服务架构Consul集群.Ocelot网关和Nginx版本实 ...

  4. 小D课堂 - 新版本微服务springcloud+Docker教程_6-06 zuul微服务网关集群搭建

    笔记 6.Zuul微服务网关集群搭建     简介:微服务网关Zull集群搭建 1.nginx+lvs+keepalive      https://www.cnblogs.com/liuyisai/ ...

  5. 庐山真面目之十二微服务架构基于Docker搭建Consul集群、Ocelot网关集群和IdentityServer版本实现

    庐山真面目之十二微服务架构基于Docker搭建Consul集群.Ocelot网关集群和IdentityServer版本实现 一.简介      在第七篇文章<庐山真面目之七微服务架构Consul ...

  6. 超详细!CentOS 7 + Hadoop3.0.0 搭建伪分布式集群

    超详细!CentOS 7 + Hadoop3.0.0 搭建伪分布式集群 ps:本文的步骤已自实现过一遍,在正文部分避开了旧版教程在新版使用导致出错的内容,因此版本一致的情况下照搬执行基本不会有大错误. ...

  7. springcloud微服务基于redis集群的单点登录

    springcloud微服务基于redis集群的单点登录 yls 2019-9-23 简介 本文介绍微服务架构中如何实现单点登录功能 创建三个服务: 操作redis集群的服务,用于多个服务之间共享数据 ...

  8. centos7搭建伪分布式集群

    centos7搭建伪分布式集群 需要 centos7虚拟机一台: jdk-linux安装包一个 hadoop-2.x安装包1个(推荐2.7.x) 一.设置虚拟机网络为静态IP(最好设成静态,为之后编程 ...

  9. 庐山真面目之七微服务架构Consul集群、Ocelot网关集群和IdentityServer4版本实现

    庐山真面目之七微服务架构Consul集群.Ocelot网关集群和IdentityServer4版本实现 一.简介      在上一篇文章<庐山真面目之六微服务架构Consul集群.Ocelot网 ...

随机推荐

  1. Vue知识整理5:v-bind绑定属性(Class 与 Style 绑定)

    通过v-bind实现Class 与 Style 绑定,方便调整属性的值

  2. sync_binlog innodb_flush_log_at_trx_commit 深入理解

    innodb_flush_log_at_trx_commit和sync_binlog 两个参数是控制MySQL 磁盘写入策略以及数据安全性的关键参数.本文从参数含义,性能,安全角度阐述两个参数为不同的 ...

  3. Android安全测试(一)数字签名检测

    1.测试环境 SDK: Java JDK, Android SDK. 下图为利用中间人攻击的手段,将智能电视上所有影片的封面图替换的实际效果图 利用中间人攻击还可以进行token获取等,所以不要轻易使 ...

  4. vue登录注册实践

    步骤一 1.安装脚手架:npm install vue-cli -g2.wepack生成html模版:vue init webpack ' 文件名'3.安装axios.js-cookie.elemen ...

  5. [Git] 006 在本地新建一个仓库

    1. 方法一 1.1 思路 在 GitHub 上新建一个仓库 clone 到本地 1.2 行动 1.2.1 在 GitHub 上选好自己已有的仓库 点击 "Clone or download ...

  6. 对第一个HelloWorld程序的总结:

    /* 注释的作用 :提高了代码的阅读性:调试程序的重要方法 对第一个程序的总结: 创建:创建一个以.java结尾的文件叫做源文件 编译:(javac 源文件名.java) 会生成一个或多个字节码(.c ...

  7. linux内核的gpiolib详解

    #include <linux/init.h> // __init __exit #include <linux/module.h> // module_init module ...

  8. Fiddler用法整理

    目 录 1 Fiddler的基本介绍 1.1 下载安装 1.2 适用平台 2 Fiddler的工作原理 3 同类工具 4 捕获非IE浏览器的会话 5 捕获不同请求的设置方法 5.1 Web HTTPS ...

  9. 利用 Python 进行批量更改文件后缀

    利用 Python 进行批量更改文件后缀 代码 import os files = os.listdir('.') for file_name in files: portion = os.path. ...

  10. OtterTune配置记录

    0. 准备两台Ubuntu 18.04的虚拟机,安装mysql(供server-side存储调优数据用)和postgresql(供client-side存储业务数据用,这里以PostgreSQL为例. ...