代码参考:https://github.com/HCJ-shadow/Zuul-Gateway-Cluster-Nginx

Zuul的路由转发功能

前期准备

  • 搭建Eureka服务注册中心

  • 服务提供者msc-provider-5001【提供一个hello请求做测试】

    创建gateway-7001

  • pom依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-zuul</artifactId>
</dependency>
  • yaml
server:
port: 7001
spring:
application:
name: zuul-gateway eureka:
client:
service-url:
defaultZone: http://eureka2001.com:2001/eureka/,http://eureka2002.com:2002/eureka/,http://eureka2003.com:2003/eureka/
  • 主类{注解@EnableZuulProxy}
package zkrun.top;

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

测试

依次运行Eureka,provider和gateway

访问:http://localhost:2001/

访问提供者的hello路径:http://localhost:5001/hello

网关默认的映射路径:http://localhost:7001/msc-provider/hello

默认路由规则:http://zuulhost:zuulport/微服务在Eureka上的serviceId/路径

serviceId小写即可。

自定义路由规则

默认的路由规则是通过服务名称来路由的,也可以自定义路由的名称,增强服务的安全性。

zuul:
routes:
api-a:
path: /api-a/**
serviceId: msc-provider
# api-b:
# path: /api-b/**
# serviceId: service-feign

用户访问:

http://localhost:7001/api-a/hello

也可达到上述效果。本质上就是隐藏了微服务名称。

Zuul的过滤器功能

zuul的过滤器主要用在身份验证上。

创建一个简单的过滤器:

package zkrun.top.filter;

import com.netflix.zuul.ZuulFilter;
import com.netflix.zuul.context.RequestContext;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component; import javax.servlet.http.HttpServletRequest; @Component
public class MyFilter extends ZuulFilter { private static Logger log = LoggerFactory.getLogger(MyFilter.class); /**
* filterType:返回一个字符串代表过滤器的类型,在zuul中定义了四种不同生命周期的过滤器类型,具体如下:
* pre:路由之前
* routing:路由之时
* post: 路由之后
* error:发送错误调用
* @return
*/
@Override
public String filterType() {
return "pre";
} /**
* filterOrder:过滤的顺序
* @return
*/
@Override
public int filterOrder() {
return 0;
} /**
* shouldFilter:这里可以写逻辑判断,是否要过滤,本文true,永远过滤。
* @return
*/
@Override
public boolean shouldFilter() {
return true;
} /**
* run:过滤器的具体逻辑。可用很复杂,包括查sql,nosql去判断该请求到底有没有权限访问。
* @return
*/
@Override
public Object run() {
RequestContext ctx = RequestContext.getCurrentContext();
HttpServletRequest request = ctx.getRequest();
System.out.println(request); Object token = request.getParameter("token");
System.out.println(token);
if(token == null) {
log.info("fail");
ctx.setSendZuulResponse(false);
ctx.setResponseStatusCode(401);//401表示无权限
try {
ctx.getResponse().getWriter().write("token is empty");
}catch (Exception e)
{}
return null;
}
log.info("pass");
return null; }
}

如果不加token的话:

加了token:

http://localhost:7001/api-a/hello?token=1234

在实际开发中,从数据库中取出用户信息和表单信息进行匹配,实现鉴权功能。

Nginx+Zuul集群实现高可用网关

两个作用:

  • Nginx通过轮询实现负载均衡
  • Zuul通过集群实现高可用

大致是这样一个图:

实现思路:

zuul网关每个除了端口的差异之外,其他的过滤器,路由都相同。

创建7001,7002,7003端口的网关。

nginx配置:

下载:

http://nginx.org/en/download.html

修改

  #配置上游服务器网关端口集群,默认轮询机制
upstream backServer{
server 127.0.0.1:7001 weight=1;
server 127.0.0.1:7002 weight=1;
server 127.0.0.1:7003 weight=1; } server {
listen 80;
server_name nginxtest.com; #charset koi8-r; #access_log logs/host.access.log main; location / {
### 指定上游服务器负载均衡服务器
proxy_pass http://backServer/;
index index.html index.htm;
}

测试

启动Eureka

启动Provider

启动Zuul网关集群

启动Nginx

Nginx启动:(双击)

访问

轮询到7002

http://nginxtest.com/api-a/hello?token=2

轮询到7001

Nginx+Zuul集群实现高可用网关的更多相关文章

  1. 15套java架构师、集群、高可用、高可扩展、高性能、高并发、性能优化、Spring boot、Redis、ActiveMQ、Nginx、Mycat、Netty、Jvm大型分布式项目实战视频教程

    * { font-family: "Microsoft YaHei" !important } h1 { color: #FF0 } 15套java架构师.集群.高可用.高可扩展. ...

  2. 15套java架构师、集群、高可用、高可扩 展、高性能、高并发、性能优化Redis、ActiveMQ、Nginx、Mycat、Netty、Jvm大型分布式项目实战视频教程

    * { font-family: "Microsoft YaHei" !important } h1 { color: #FF0 } 15套java架构师.集群.高可用.高可扩 展 ...

  3. 浅谈web应用的负载均衡、集群、高可用(HA)解决方案(转)

    1.熟悉几个组件 1.1.apache     —— 它是Apache软件基金会的一个开放源代码的跨平台的网页服务器,属于老牌的web服务器了,支持基于Ip或者域名的虚拟主机,支持代理服务器,支持安 ...

  4. hadoop 集群HA高可用搭建以及问题解决方案

    hadoop 集群HA高可用搭建 目录大纲 1. hadoop HA原理 2. hadoop HA特点 3. Zookeeper 配置 4. 安装Hadoop集群 5. Hadoop HA配置 搭建环 ...

  5. Rabbitmq安装、集群与高可用配置

    历史: RabbitMQ是一个由erlang开发的AMQP(Advanced Message Queue )的开源实现.AMQP 的出现其实也是应了广大人民群众的需求,虽然在同步消息通讯的世界里有很多 ...

  6. 11.Redis 哨兵集群实现高可用

    作者:中华石杉 Redis 哨兵集群实现高可用 哨兵的介绍 sentinel,中文名是哨兵.哨兵是 redis 集群机构中非常重要的一个组件,主要有以下功能: 集群监控:负责监控 redis mast ...

  7. Quartz学习笔记:集群部署&高可用

    Quartz学习笔记:集群部署&高可用 集群部署 一个Quartz集群中的每个节点是一个独立的Quartz应用,它又管理着其他的节点.这就意味着你必须对每个节点分别启动或停止.Quartz集群 ...

  8. K8S集群Master高可用实践

    K8S集群Master高可用实践    https://blog.51cto.com/ylw6006/2164981 本文将在前文基础上介绍k8s集群的高可用实践,一般来讲,k8s集群高可用主要包含以 ...

  9. Dubbo入门到精通学习笔记(十五):Redis集群的安装(Redis3+CentOS)、Redis集群的高可用测试(含Jedis客户端的使用)、Redis集群的扩展测试

    文章目录 Redis集群的安装(Redis3+CentOS) 参考文档 Redis 集群介绍.特性.规范等(可看提供的参考文档+视频解说) Redis 集群的安装(Redis3.0.3 + CentO ...

随机推荐

  1. exe崩溃用windbgattach后有宝贵现场,可看程序退出线程等,千万不要清屏

    exe崩溃用windbgattach后有宝贵现场,可看程序退出线程等,千万不要清屏

  2. 使用DQL查询数据库

    DQL ( Data Query Language) 是数据查询语言,如 Select 语句#### 一.DQL 语法 ```sqlSELECT [ALL | DISTINCT]{* | table. ...

  3. Hadoop值Partition分区

    分区操作 为什么要分区? 要求将统计结果按照条件输出到不同文件中(分区).比如:将统计结果按 照手机归属地不同省份输出到不同文件中(分区) 默认 partition 分区 /** 源码中:numRed ...

  4. C语言入门7-程序设计方法基础-循环结构

    程序设计方法基础-循环结构 循环三要素: 初值   循环判断条件   步长(循环增量) 循环结构在有些书籍上也称为重复结构,  即反复执行某一部分的操作. 循环三要素: 初值   循环判断条件   步 ...

  5. ASP.NET Core系列(三):启动类Startup

    前面讲了ASP.NET Core 的项目结构,查看完整的ASP.NET Core系列文章:https://www.cnblogs.com/zhangweizhong/category/1477144. ...

  6. Envoy 源码分析--LDS

    Envoy 源码分析--LDS LDS 是 Envoy 用来自动获取 listener 的 API. Envoy 通过 API 可以增加.修改或删除 listener. 先来总结下 listener ...

  7. css关于flex布局下不能实现text-overflow: ellipsis的解决办法

    摘录自 https://segmentfault.com/q/1010000011115918

  8. mysql 不同版本下 group by 组内排序的差异

    最近发现网上找的 group by 组内排序语句在不同的mysql版本中结果不一样.   建表语句:   SET FOREIGN_KEY_CHECKS=0;   -- ---------------- ...

  9. Presto Event Listener开发

    简介 同Hive Hook一样,Presto也支持自定义实现Event Listener,用于侦听Presto引擎执行查询时发生的事件,并作出相应的处理.我们可以利用该功能实现诸如自定义日志记录.调试 ...

  10. isMemberOfClass、isKindOfClass原理分析

    isMemberOfClass - 调用者必须是传入的类的实例对象才返回YES- 判断调用者是否是传入对象的实例,别弄反了,如 [s1 isMemberOfClass:p1] ,意思是s1是否是p1的 ...