SpringCloud(六)学习笔记之Zuul
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的更多相关文章
- springcloud Eureka学习笔记
最近在学习springcloud,抽空记录下学习笔记;主要记录Eureka的实现过程和高可用性的实现 Eureka是一个服务治理框架,它提供了Eureka Server和Eureka Client两个 ...
- SpringCloud学习笔记(4)——Zuul
参考Spring Cloud官方文档第19章 19. Router and Filter: Zuul 路由是微服务架构的一部分.例如,"/"可能映射到你的web应用,"/ ...
- springcloud Ribbon学习笔记二
之前介绍了如何搭建eureka服务并开发了一个用户服务成功注册到了eureka中,接下来介绍如何通过ribbon来从eureka中获取用户服务: springcloud ribbon提供客户端的负载均 ...
- SpringCloud Alibaba学习笔记
目录 目录 目录 导学 为什么学 学习目标 进阶目标 思路 Spring Cloud Alibaba的重要组件 环境搭建 Spring Boot必知必会 Spring Boot特性 编写第一个Spri ...
- springcloud Ribbon学习笔记一
上篇已经介绍了如何开发eureka服务并让多个服务进行相互注册,接下来记录如何开发一个服务然后注册到eureka中并能通过ribbon成功被调用 开发一个用户服务并注册到eureka中,用户服务负责访 ...
- SpringCloud(四)学习笔记之Feign
Feign是一个声明式的Web服务客户端,可帮助我们更加便捷.优雅地调用HTTP API Feign可以与Eureka和Ribbon组合使用以支持负载均衡 一.构建Eureka Server [基于第 ...
- SpringCloud(三)学习笔记之Ribbon
spring Cloud Ribbon 是一个客户端的负载均衡器,它提供对大量的HTTP和TCP客户端的访问控制. 客户端负载均衡即是当浏览器向后台发出请求的时候,客户端会向 Eureka Serve ...
- SpringCloud(一)学习笔记之项目搭建
[springcloud项目名称不支持下划线] 一.创建父项目 File---new---project: 填写项目信息: 默认即可,点击finish创建完成: 由于父项目只用到pom文件 所以把sr ...
- 《Javascript权威指南》十六学习笔记:BOM资源---BOM基本应用
BOM基本应用包括:管理浏览器历史记录.得到处理和解决浏览器的信息.本文介绍了这些应用程序. 一.浏览历史管理 1.history对象的方法和属性 History 对象包括用户(在浏览器窗体中)訪问过 ...
随机推荐
- 洛谷 P2656 采蘑菇 树形DP+缩点+坑点
题目链接 https://www.luogu.com.cn/problem/P2656 分析 这其实是个一眼题(bushi 发现如果没有那个恢复系数,缩个点就完了,有恢复系数呢?你发现这个恢复系数其实 ...
- 好记性-烂笔头:JDK8流操作
1):对象 List<User> 转 Map<String,Object> 案例如下: public class User { private Integer id; priv ...
- Python python 函数参数:关键字参数
# 关键字参数 '''关键字参数代表传入任意个含参数名的参数,这些关键字参数在函数内部自动组装为一个dict ''' def student(name,sex,**keywords): print(' ...
- class-dump的安装和使用
安装步骤 1.下载地址:http://stevenygard.com/projects/class-dump/ 2.打开终端输入 open /usr/local/bin 3.把dmg文件中的class ...
- css 动画 transition和animation
本文参考:http://www.ruanyifeng.com/blog/2014/02/css_transition_and_animation.html 1. transition基本用法: < ...
- pycharm 秘籍:快捷键技巧等
Pycharm基本使用 安装 下载地址:https://www.jetbrains.com/pycharm/download 选择Professional 专业版 Comunnity社区版是免费的,但 ...
- 探秘 RocketMQ 消息持久化机制
我们知道 RocketMQ 是一款高性能.高可靠的分布式消息中间件,高性能和高可靠是很难兼得的.因为要保证高可靠,那么数据就必须持久化到磁盘上,将数据持久化到磁盘,那么可能就不能保证高性能了. Roc ...
- Java并发基础08. 造成HashMap非线程安全的原因
在前面我的一篇总结(6. 线程范围内共享数据)文章中提到,为了数据能在线程范围内使用,我用了 HashMap 来存储不同线程中的数据,key 为当前线程,value 为当前线程中的数据.我取的时候根据 ...
- 谷歌 MapReduce 初探
谷歌“三驾马车”的出现,才真正把我们带入了大数据时代,毕竟没有谷歌,就没有大数据. 上次的分享,我们对谷歌的其中一驾宝车 GFS 进行了管中窥豹,虽然只见得其中一斑,但是也能清楚的知道 GFS 能够把 ...
- 剖析手写Vue,你也可以手写一个MVVM框架
剖析手写Vue,你也可以手写一个MVVM框架# 邮箱:563995050@qq.com github: https://github.com/xiaoqiuxiong 作者:肖秋雄(eddy) 温馨提 ...