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. LeetCode 46——全排列

    1. 题目 2. 解答 给定一个序列,序列中的任意一个数字都可以作为全排列的最后一位.然后,其余位置元素的确定便是剩余元素的一个全排列,也就是一个子问题. 例子中 [1, 2, 3] 的全排列,最后一 ...

  2. git 还原、恢复、回退

    通过git revert来实现线主干代码的回滚.如下命令 对于 merge类型的commit对象,还需要"-m"参数 git revert -m 1  commit-id 对于普通 ...

  3. spring的后置处理器——BeanPostProcessor以及spring的生命周期

    后置处理器的调用时机 BeanPostProcessor是spring提供的接口,它有两个方法——postProcessBeforeInitialization.postProcessAfterIni ...

  4. lombok 简化 get set toString hash equals等方法

    1.lombok 在项目中使用Lombok可以减少很多重复代码的书写.比如说getter/setter/toString等方法的编写. 2.安装 下载 https://projectlombok.or ...

  5. 16/7/8_PHP-单引号和双引号的区别

    在PHP中,字符串的定义可以使用英文单引号' ',也可以使用英文双引号" ". 但是必须使用同一种单或双引号来定义字符串,如:'Hello World"和"He ...

  6. DataGridView数值列和日期列

    本文转自:http://www.cnblogs.com/conexpress/p/5923324.html 在使用DataGridView编辑数据的时候,编辑的单元格一般会显示为文本框,逻辑值和图片会 ...

  7. hacker101----XSS Review

    所有你见过XSS行动在这一点上,但我们来回顾一下今天我们要讨论的XSS类型: 反射型XSS --  来自用户的输入将直接返回到浏览器,从而允许注入任意内容  [浏览器输入,马上到服务器上,再反射回来直 ...

  8. sql 查看表的记录数

    select a.name as 表名,max(b.rows) as 记录条数 from sysobjects a ,sysindexes b where a.id=b.id and a.xtype= ...

  9. [Python3] 015 冰冻集合的内置方法

    目录 0. 前言 英文名 元素要求 使用限制 返回 方法数量 1. 如何查看 frozenset() 的内置方法 2. 少废话,上例子 2.1 copy() 2.2 difference() 2.3 ...

  10. 剑指Offer编程题(Java实现)——替换空格

    题目描述 请实现一个函数,将一个字符串中的每个空格替换成“%20”.例如,当字符串为We Are Happy.则经过替换之后的字符串为We%20Are%20Happy. 解题思路1 在字符串尾部填充任 ...