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. MySQL5.6 选项和变量整理

    MySQL5.6 选项和变量整理  --allow-suspicious-udfs 这个选项控制是否用户定义函数只有一个xxx符号用于主函数加载.默认,该选项是关闭并且只具有至少一个辅助符号的UDFs ...

  2. Building Applications with Force.com and VisualForce(Dev401)(十):Designing Applications for Multiple Users: Building Business Processes that You Want

    Dev401-011: Building Business Processes that You Want Course Objectives1.Describe the capabilities o ...

  3. SpringCloud服务的注册发现--------consul实现服务与发现

    1,consul也可以替代Eureka实现注册和发现的功能,即注册中心. 之前在linux环境通过consul + upsync + nginx 实现nginx 的动态负载均衡 https://www ...

  4. Cygwin工具编译Ardupilot方法

    注意:该编译方法生成的固件基于Chibios系统,如果想要Nuttx系统固件,需采用make编译,步骤见make编译说明部分. 软件安装准备 安装Cygwin 打开链接www.cygwin.com/i ...

  5. [noip模拟]B<构造>

    [题目描述] 在两个n*m的网格上染色,每个网格中被染色的格子必须是一个四联通块(没有任何格子被染色也可以),四联通块是指所有染了色的格子可以通过网格的边联通,现在给出哪些格子在两个网格上都被染色了, ...

  6. canvas 实现手机图案解锁

    参考☞: https://www.cnblogs.com/chenyingying0/ 先上效果图: 我是在 vue 里面实现js 文件 ,所以如果需要在vue 里面使用 可以将以下内容import  ...

  7. Mac 开发工具信息的备份

    相信大部分程序员都对开发环境的工具都有一些特殊的执念(???),如果在自己不习惯的环境中工作完全无法开展,怎么这个工具没有那个字体难受,我本人就是,换了新的 Mac 电脑后如何快速恢复到之前的开发工具 ...

  8. 1012 The Best Rank (25 分)

    To evaluate the performance of our first year CS majored students, we consider their grades of three ...

  9. Go gRPC教程-服务端流式RPC(三)

    前言 上一篇介绍了简单模式RPC,当数据量大或者需要不断传输数据时候,我们应该使用流式RPC,它允许我们边处理边传输数据.本篇先介绍服务端流式RPC. 服务端流式RPC:客户端发送请求到服务器,拿到一 ...

  10. Java第三十一天,用Properties集合操作IO

    一.Properties 这个类是线程安全的:多个线程可以共享一个Properties对象,而不需要外部同步 1.常用方法 Object setProperty(String key, String ...