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. python-笔记-内置函数

    ###内置函数 print(all([1,2,3,4]))判断可迭代的对象里面的值是否都为真 print(any([0,1,2,3,4]))判断可迭代的对象里面的值是否有一个为真 print(id(l ...

  2. day51—JavaScript绑定事件

    转换学开发,代码100天——2018-05-06 今天学习JavaScript的绑定事件.因为浏览器的原因绑定事件需要考虑兼容性问题. attachEvent     IE浏览器 ,ie9以上事件执行 ...

  3. oracle系统调优

    在Oracle数据库系统中,起到调节作用的参数叫初始化参数,在Oracle 8i及以前的版本中,这些初始化参数记录在INITsid.ora文件中:而Oracle 9i/10g/11g中将这些参数记录在 ...

  4. truncate()函数

    1 truncate()方法用于截断文件,如果指定了可选参数 size,则表示截断文件为 size 个字符,截断之后 size 后面的所有字符被删除. 参考: https://www.runoob.c ...

  5. delphi 静态3维数组。 严重占用堆栈 切记。 应该用动态数组, 非要用静态数组的话, 要在编译器里 把 堆栈 调大

    delphi 代码正确, 但是运行就崩溃. 原因为 定义了  一些   静态3维数组. 应该扩大 软件的 堆栈 设置.    然后正常解决问题 静态3维数组.   严重占用堆栈   切记. 应该用动态 ...

  6. python 安装成windows服务

    参考文档 https://blog.csdn.net/kongxx/article/details/65435076 https://www.cnblogs.com/lishuai0214/artic ...

  7. nginx 配置总结

    可以选择在http{ }中设置:client_max_body_size 20m; 也可以选择在server{ }中设置:client_max_body_size 20m; 还可以选择在locatio ...

  8. Java static关键字的重新思考

    上完Java课,虽然也写了不少的Java代码,但是一直有不少的疑惑,而static关键字一直困惑着我很久,今天无意探究竟,上知乎再仔细查了一下,发现了这个话题的优秀答案https://www.zhih ...

  9. 手动刷新客户端配置内容(Spring Cloud Config)

    手动刷新客户端配置内容 客户端项目增加依赖项 <dependency> <groupId>org.springframework.boot</groupId> &l ...

  10. Oracle数据库的发展历程

    前言 1970年的6月,IBM 公司的研究员埃德加·考特 (Edgar Frank Codd) 在 Communications of ACM 上发表了那篇著名的<大型共享数据库数据的关系模型& ...