Zuul 在云平台上提供动态路由,监控,弹性,安全等边缘服务的框架。Zuul 相当于是设备和 Netflix 流应用的 Web 网站后端所有请求的前门

Hystrix+Ribbon(不使用Feign)

一、构建Eureka Server

【基于第二章节创建的Eureka Server】

二、构建Eureka Client提供者

mhb-cloud-zuul-producer【端口:1002】

普通的Eureka Client项目 配置略......

com\applesnt\controller\ProducerController.java

package com.applesnt.controller;
import org.springframework.web.bind.annotation.*; @RestController
@RequestMapping("/producer")
public class ProducerController { @GetMapping("/get/web")
public String getId(){
return "返回值为:producer";
}
}

三、构建Eureka Client消费者集群

mhb-cloud-zuul-consumer 【端口:1000】

mhb-cloud-zuul-consumer2 【端口:1001】

1:pom文件

<!--eureka客户端环境支持-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>

2:application.yml

mhb-cloud-zuul-consumer和mhb-cloud-zuul-consumer2只有端口不一样

debug: false

spring:
application:
name: mhb-cloud-zuul-consumer #每一个微服务必须有这个应用名称 server:
port: 1000 #端口 eureka:
instance:
appname: zuul-consumer #eureka application的名称
prefer-ip-address: true #开启ip显示eureka的主机服务
#eureka仪表盘的Instances格式
instance-id: ${spring.application.name}:${spring.cloud.client.ip-address}:${server.port} client:
service-url:
defaultZone: http://admin:123456@eureka1.com:8761/eureka/,http://admin:123456@eureka2.com:8762/eureka/,http://admin:123456@eureka3.com:8763/eureka/
#从eureka服务器注册表中获取注册表信息的时间间隔,默认30s
registry-fetch-interval-seconds: 30
#客户端发送变化同步到eureka服务器的时间间隔 默认30s
instance-info-replication-interval-seconds: 30
#询问eureka服务url信息的变化的间隔时间 默认300s
eureka-service-url-poll-interval-seconds: 300
#最初同步到eureka服务器的时间 默认40s
initial-instance-info-replication-interval-seconds: 40
#注册表是否压缩
g-zip-content: true
#eureka等待超时时间 默认是5s
eureka-server-connect-timeout-seconds: 5
#eureka等待读取时间 默认是8s
eureka-server-read-timeout-seconds: 8

3:启动类

package com.applesnt;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.loadbalancer.LoadBalanced;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
import org.springframework.context.annotation.Bean;
import org.springframework.web.client.RestTemplate; @SpringBootApplication
@EnableEurekaClient
public class MhbCloudZuulConsumer2Application { public static void main(String[] args) {
SpringApplication.run(MhbCloudZuulConsumer2Application.class, args);
} @Bean
@LoadBalanced/* 负载均衡 */
public RestTemplate balanceRestTemplate(){
return new RestTemplate();
}
}

4:消费者controller

两个消费者controller 只有打印信息不同,为了看到集群效果

com\applesnt\controller\ConsumerController.java

package com.applesnt.controller;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate; @RestController
public class ConsumerController { @Autowired
private RestTemplate balanceRestTemplate; @GetMapping("/get/web")
public String getId(){
System.out.println("进入comsumer01");
//eureka方式 需要在启动类的RestTemplate加上@LoadBalanced负载均衡的注解
String returnId = balanceRestTemplate.getForObject("http://mhb-cloud-zuul-producer/producer/get/web",String.class);
System.out.println("returnId = "+returnId); return returnId;
}
}

四、构建Zuul网关项目

mhb-cloud-zuul 【提供者 端口:8080】

1:pom文件

<!--eureka客户端环境支持-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency> <!--zuul环境支持-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-zuul</artifactId>
</dependency>

2:启动类开启Zuul支持

@@EnableEurekaClient

@EnableZuulProxy

package com.applesnt;

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/*eureka支持*/
@EnableZuulProxy/*Zuul注解*/
public class MhbCloudZuulApplication { public static void main(String[] args) {
SpringApplication.run(MhbCloudZuulApplication.class, args);
} }

3:application.yml文件

debug: false

spring:
application:
name: mhb-cloud-zuul #每一个微服务必须有这个应用名称 server:
port: 8080 #端口 eureka:
instance:
appname: zuul #eureka application的名称
prefer-ip-address: true #开启ip显示eureka的主机服务
#eureka仪表盘的Instances格式
instance-id: ${spring.application.name}:${spring.cloud.client.ip-address}:${server.port}
client:
service-url:
defaultZone: http://admin:123456@eureka1.com:8761/eureka/,http://admin:123456@eureka2.com:8762/eureka/,http://admin:123456@eureka3.com:8763/eureka/ #zuul自定义写法
zuul:
routes:
zuul-consumer: #自定义名称 必须要写path和serviceId
path: /web/** #只要路径上有web 就会自动定位到mhb-cloud-zuul-consumer服务器上
serviceId: mhb-cloud-zuul-consumer #服务名称 默认就支持负载均衡

4:zuul测试访问

http://127.0.0.1:8080/web/get/web

请求从zuul网关服务器上转发到消费者服务器上,在远程调用提供者的controller

日志信息:负载均衡

5:zuul路由规则

1》精简写法:http://127.0.0.1:8080/web/get/web

#精简写法:
zuul:
routes:
mhb-cloud-zuul-consumer: /web/** #路由名称如果是服务器名 就可以不用写path和serviceId

2》静态路由:http://127.0.0.1:8080/web/get/web

#静态url
zuul:
routes:
my-routes: #名称自定义
path: /web/**
url: http://127.0.0.1:1000

3》静态路由负载均衡:http://127.0.0.1:8080/web/get/web

zuul:
routes:
my-routes: #名称自定义
path: /web/**
serviceId: myurl
ribbon:
eureka:
enabled: false
myurl:
ribbon:
listOfServers: http://127.0.0.1:1000,http://127.0.0.1:1001

4》忽略服务

zuul:
ignored-services: '*' #忽略所有默认的隐射机制 只路由指定的服务
ignored-services: mhb-cloud-zuul-producer #忽略指定的服务

5》忽略请求:http://127.0.0.1:8080/web/get/web (无法访问)

zuul:
ignoredPatterns: /**/get/** #过滤路径中有get请求的
routes:
zuul-consumer: #自定义名称 必须要写path和serviceId
path: /web/** #只要路径上有web 就会自动定位到mhb-cloud-zuul-consumer服务器上
serviceId: mhb-cloud-zuul-consumer

6》请求前缀

访问zuul网关:http://127.0.0.1:8080/api/web/get/web?token=123

转发后请求地址:http://mhb-cloud-zuul-consumer/web/get/web?token=123

strip-prefix: true 转发后会把前缀去掉

zuul:
routes:
zuul-consumer: #自定义名称 必须要写path和serviceId
path: /web/** #只要路径上有web 就会自动定位到mhb-cloud-zuul-consumer服务器上
serviceId: mhb-cloud-zuul-consumer
prefix: /api
strip-prefix: true

访问zuul网关:http://127.0.0.1:8080/api/web/get/web?token=123

转发后请求地址:http://mhb-cloud-zuul-consumer/api/web/get/web?token=123

strip-prefix: false 转发后会把前缀也一并带上

zuul:
routes:
zuul-consumer: #自定义名称 必须要写path和serviceId
path: /web/** #只要路径上有web 就会自动定位到mhb-cloud-zuul-consumer服务器上
serviceId: mhb-cloud-zuul-consumer
prefix: /api
strip-prefix: false

四:Zuul过滤器

mhb-cloud-zuul项目中构建AccessFilter 并继承 ZuulFilter

com\applesnt\filter\AccessFilter.java

示例:

访问网关请求的时候必须传递一个token,否则就返回拦截信息

package com.applesnt.filter;

import com.netflix.zuul.ZuulFilter;
import com.netflix.zuul.context.RequestContext;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang.StringUtils;
import org.springframework.stereotype.Component;
import javax.servlet.http.HttpServletRequest; @Component /*不要忘记此注解*/
@Slf4j
public class AccessFilter extends ZuulFilter{ /**
* 过滤器类型选择:
* pre 为路由前
* route 为路由过程中
* post 为路由过程后
* error 为出现错误的时候
*/
@Override
public String filterType() {
return "pre";
} /**
* 用来过滤器排序执行的
* @return 排序的序号
*/
@Override
public int filterOrder() {
return 0;
} /**
* 返回true表示执行这个过滤器
*/
@Override
public boolean shouldFilter() {
return true;
} /**
* 过滤器的逻辑
*/
@Override
public Object run() {
//获取当前请求上下文
RequestContext ctx = RequestContext.getCurrentContext();
//取出当前请求
HttpServletRequest request = ctx.getRequest();
String token = request.getParameter("token");
if(StringUtils.isEmpty(token)){
ctx.setSendZuulResponse(false);
ctx.setResponseStatusCode(401);
ctx.getResponse().setContentType("text/html;charset=UTF-8");
ctx.setResponseBody("请求异常 token为空");
}
log.info("进入访问过滤器,访问的url:{},访问的方法:{}",request.getRequestURL(),request.getMethod());
return null;
}
}

测试访问:

http://127.0.0.1:8080/web/get/web (不带token参数)

http://127.0.0.1:8080/web/get/web?token=123(带token参数)

SpringCloud(六)学习笔记之Zuul的更多相关文章

  1. springcloud Eureka学习笔记

    最近在学习springcloud,抽空记录下学习笔记;主要记录Eureka的实现过程和高可用性的实现 Eureka是一个服务治理框架,它提供了Eureka Server和Eureka Client两个 ...

  2. SpringCloud学习笔记(4)——Zuul

    参考Spring Cloud官方文档第19章 19. Router and Filter: Zuul 路由是微服务架构的一部分.例如,"/"可能映射到你的web应用,"/ ...

  3. springcloud Ribbon学习笔记二

    之前介绍了如何搭建eureka服务并开发了一个用户服务成功注册到了eureka中,接下来介绍如何通过ribbon来从eureka中获取用户服务: springcloud ribbon提供客户端的负载均 ...

  4. SpringCloud Alibaba学习笔记

    目录 目录 目录 导学 为什么学 学习目标 进阶目标 思路 Spring Cloud Alibaba的重要组件 环境搭建 Spring Boot必知必会 Spring Boot特性 编写第一个Spri ...

  5. springcloud Ribbon学习笔记一

    上篇已经介绍了如何开发eureka服务并让多个服务进行相互注册,接下来记录如何开发一个服务然后注册到eureka中并能通过ribbon成功被调用 开发一个用户服务并注册到eureka中,用户服务负责访 ...

  6. SpringCloud(四)学习笔记之Feign

    Feign是一个声明式的Web服务客户端,可帮助我们更加便捷.优雅地调用HTTP API Feign可以与Eureka和Ribbon组合使用以支持负载均衡 一.构建Eureka Server [基于第 ...

  7. SpringCloud(三)学习笔记之Ribbon

    spring Cloud Ribbon 是一个客户端的负载均衡器,它提供对大量的HTTP和TCP客户端的访问控制. 客户端负载均衡即是当浏览器向后台发出请求的时候,客户端会向 Eureka Serve ...

  8. SpringCloud(一)学习笔记之项目搭建

    [springcloud项目名称不支持下划线] 一.创建父项目 File---new---project: 填写项目信息: 默认即可,点击finish创建完成: 由于父项目只用到pom文件 所以把sr ...

  9. 《Javascript权威指南》十六学习笔记:BOM资源---BOM基本应用

    BOM基本应用包括:管理浏览器历史记录.得到处理和解决浏览器的信息.本文介绍了这些应用程序. 一.浏览历史管理 1.history对象的方法和属性 History 对象包括用户(在浏览器窗体中)訪问过 ...

随机推荐

  1. PHP7内核(一):发展史

    PHP1 1994年,一位名叫Rasmus lerdorf的兄台为了在网上展示自己的履历和网页流量的统计,用Perl开发了一套脚本,后来因与日俱增的需求无法得到满足,lerdorf便使用c语言进行了重 ...

  2. BP神经网络及异或实现

    BP神经网络是最简单的神经网络模型了,三层能够模拟非线性函数效果. 难点: 如何确定初始化参数? 如何确定隐含层节点数量? 迭代多少次?如何更快收敛? 如何获得全局最优解? ''' neural ne ...

  3. What is MongoDB and For What?

    1.MongoDB是什么? MongoDB是一款为web应用程序和互联网基础设施设计的数据库管理系统.没错MongoDB就是数据库,是NoSQL类型的数据库 2.为什么要用MongoDB? (1)Mo ...

  4. Mac OSX安装 Django MySQL mysqlclient

    Python3.6 $ brew install mysql-connector-c # 如果没有安装brew,先安装:# 安装可以查看:https://www.cnblogs.com/Jokergu ...

  5. Centos7 中打开和关闭防火墙及端口

    1.firewalld的基本使用 启动: systemctl start firewalld 关闭: systemctl stop firewalld 查看状态: systemctl status f ...

  6. Ubuntu 18 安装MySQL 5.7

    1.首先把系统换到阿里云的镜像源,需要等待一会 2.系统更新完毕后执行MySQL安装命令:sudo apt install mysql-server 3.查看MySQL服务状态:sudo servic ...

  7. Mac OS安装Go语言及配置VSCode开发环境:一个工具(gopls)解千愁

    前言 截止到目前为止,Go语言已经更新到1.14.1,网上的很多教程均已经过时,我在此汇总并整理一下相关的教程,提供一个适合当下的Mac OS教程. 教程中使用了Go在1.11之后推出的依赖包管理工具 ...

  8. CodeForces 506B/505D Mr. Kitayuta's Technology

    Portal:http://codeforces.com/problemset/problem/506/B http://codeforces.com/problemset/problem/505/D ...

  9. storm学习初步

    本文根据自己的了解,对学习storm所需的一些知识进行汇总,以备之后详细了解. maven工具 参考书目 Maven权威指南 官方文档 Vagrant 分布式开发环境 博客 storm 参考书目 Ge ...

  10. 2019NYIST计科第七次周赛总结

    2019NYIST计科第七次周赛总结 文章目录 2019NYIST计科第七次周赛总结 [秤取物体重量( 二进制枚举法)](https://blog.csdn.net/qq_34261446/artic ...