第五篇:路由网关(zuul) zuul路由 服务过滤 (Finchley版本)V2.0_dev
前言:
在微服务架构中,需要几个基础的服务治理组件,包括服务注册与发现、服务消费、负载均衡、断路器、智能路由、配置管理等,由这几个基础组件相互协作,共同组建了一个简单的微服务系统。
在Spring Cloud微服务系统中,一种常见的负载均衡方式是,客户端的请求首先经过负载均衡(zuul、Ngnix),再到达服务网关(zuul集群),然后再到具体的服。,服务统一注册到高可用的服务注册中心集群,服务的所有的配置文件由配置服务管理(下一篇文章讲述),配置服务的配置文件放在git仓库,方便开发人员随时改配置。
一、Zuul简介
Zuul的主要功能是路由转发和过滤器。路由功能是微服务的一部分,比如/api/user转发到到user服务,/api/shop转发到到shop服务。zuul默认和Ribbon结合实现了负载均衡的功能。
二、准备工作
继续使用上一节的工程。在原有的工程上,创建一个新的工程。
三、创建service-zuul工程
- 其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><parent><groupId>com.gblfy</groupId><artifactId>sc-f-chapter5</artifactId><version>0.0.1-SNAPSHOT</version></parent><groupId>com.gblfy</groupId><artifactId>service-zuul</artifactId><version>0.0.1-SNAPSHOT</version><name>service-zuul</name><description>Demo project for Spring Boot</description><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-netflix-eureka-client</artifactId></dependency><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-netflix-zuul</artifactId></dependency></dependencies>
</project>
- 在其入口applicaton类加上注解@EnableZuulProxy,开启zuul的功能:
@SpringBootApplication
@EnableEurekaClient
@EnableDiscoveryClient
@EnableZuulProxy
public class ServiceZuulApplication {public static void main(String[] args) {SpringApplication.run(ServiceZuulApplication.class, args);}}
- 加上配置文件application.yml加上以下的配置代码:
eureka:client:serviceUrl:defaultZone: http://localhost:8761/eureka/
server:port: 8769
spring:application:name: service-zuul
zuul:routes:api-a:path: /api-a/**serviceId: service-ribbonapi-b:path: /api-b/**serviceId: service-feign
首先指定服务注册中心的地址为http://localhost:8761/eureka/,服务的端口为8769,服务名为service-zuul;
以/api-a/ 开头的请求都转发给service-ribbon服务;
以/api-b/开头的请求都转发给service-feign服务;
依次运行这五个工程;打开浏览器访问:http://localhost:8769/api-a/hi?name=gblfy;浏览器显示:
hi gblfy,i am from port:8762
打开浏览器访问:http://localhost:8769/api-b/hi?name=gblfy;浏览器显示:
hi gblfy,i am from port:8762
这说明zuul起到了路由的作用
四、服务过滤
zuul不仅只是路由,并且还能过滤,做一些安全验证。继续改造工程;
@Component
public class MyFilter extends ZuulFilter {private static Logger log = LoggerFactory.getLogger(MyFilter.class);@Overridepublic String filterType() {return "pre";}@Overridepublic int filterOrder() {return 0;}@Overridepublic boolean shouldFilter() {return true;}@Overridepublic Object run() throws ZuulException {RequestContext ctx = RequestContext.getCurrentContext();HttpServletRequest request = ctx.getRequest();log.info(String.format("%s >>> %s", request.getMethod(), request.getRequestURL().toString()));Object accessToken = request.getParameter("token");if (accessToken == null) {log.warn("token is empty");ctx.setSendZuulResponse(false);ctx.setResponseStatusCode(401);try {ctx.getResponse().getWriter().write("token is empty");} catch (Exception e) {}return null;}log.info("ok");return null;}
}
- filterType:返回一个字符串代表过滤器的类型,在zuul中定义了四种不同生命周期的过滤器类型,具体如下:
- pre:路由之前
- routing:路由之时
- post: 路由之后
- error:发送错误调用
- filterOrder:过滤的顺序
- shouldFilter:这里可以写逻辑判断,是否要过滤,本文true,永远过滤。
- run:过滤器的具体逻辑。可用很复杂,包括查sql,nosql去判断该请求到底有没有权限访问。
这时访问:http://localhost:8769/api-a/hi?name=gblfy;网页显示:
token is empty
访问 http://localhost:8769/api-a/hi?name=gblfy&token=22 ;
网页显示:
hi gblfy,i am from port:8762
本文源码下载:
dev分支(最新企业实战版本):
https://github.com/gb-heima/springcloud-practical-column/tree/dev/sc-f-chapter5
master分支(入门版本):
https://github.com/gb-heima/springcloud-practical-column/tree/master/sc-f-chapter5
第五篇:路由网关(zuul) zuul路由 服务过滤 (Finchley版本)V2.0_dev相关推荐
- 第四篇:断路器(Hystrix)(Finchley版本)V2.0_dev
前言: 在微服务架构中,根据业务来拆分成一个个的服务,服务与服务之间可以相互调用(RPC),在Spring Cloud可以用RestTemplate+Ribbon和Feign来调用.为了保证其高可用, ...
- 第二篇 服务消费者(rest ribbon)(Finchley版本)V2.0_dev
前言: 在微服务架构中,业务都会被拆分成一个独立的服务,服务与服务的通讯是基于http restful的. Spring cloud有两种服务调用方式: 第一种 ribbon+restTemplate ...
- 第一篇:服务的注册与发现Eureka(Finchley版本)V2.0_dev
Eureka 简介: Eureka是Netflix 开源的服务发现组件, Spring Cloud 将其集成在 Spring Cloud Netflix 中,实现服务的注册和发现.Eureka 主要包 ...
- 第十篇: 高可用的服务注册中心(Finchley版本)V2.0_dev
一.准备工作 Eureka通过运行多个实例,使其更具有高可用性.事实上,这是它默认的熟性,你需要做的就是给对等的实例一个合法的关联serviceurl. 二.创建eureka-server 引入依赖 ...
- 第八篇: 消息总线(Spring Cloud Bus)(Finchley版本)V2.0_dev
前言: Spring Cloud Bus 将分布式的节点用轻量的消息代理连接起来. 它可以用于广播配置文件的更改或者服务之间的通讯,也可以用于监控. 本文要讲述的是用Spring Cloud Bus实 ...
- 第七篇: 高可用的分布式配置中心(Spring Cloud Config)(Finchley版本)V2.0_dev
前言: 上一篇文章讲述了一个服务如何从配置中心读取文件,配置中心如何从远程git读取配置文件,当服务实例很多时,都从配置中心读取文件,这时可以考虑将配置中心做成一个微服务,将其集群化,从而达到高可用. ...
- 第六篇: 分布式配置中心(Spring Cloud Config)(Finchley版本)V2.0_dev
一.简介 在分布式系统中,由于服务数量巨多,为了方便服务配置文件统一管理,实时更新,所以需要分布式配置中心组件. 在Spring Cloud中,有分布式配置中心组件spring cloud confi ...
- 第三篇:服务消费者(Feign)(Finchley版本)V2.0_dev
一.Feign简介 Feign是一个声明式的伪Http客户端,它使得写Http客户端变得更简单.使用Feign,只需要创建一个接口并注解.它具有可插拔的注解特性,可使用Feign 注解和JAX-RS注 ...
- SpringCloud实战(五)-路由网关(zuul)
本文是SpringCloud实战(五)-路由网关(zuul),若要关注前文,请点击传送门: SpringCloud实战(四)-断路器(Hystrix) 前文我们介绍了Hystrix断路器.在平常工作中 ...
最新文章
- Apache Shiro和Spring Security的详细对比
- [BOI2019][第K大问题][暴力剪枝]D2T1 Olympiads
- C++学习笔记30:模板与型式参数化
- 我常用的python函数(part3)--time.sleep方法
- 位域 内存 字节序_C语言中的位域、字节序、比特序、大小端(转)
- word List28
- Android开发:调用camera API 创建MediaRecorder
- keepalived实现双机备份
- java6特性_Java开发者:你应该远离的6个Java特性
- 13款宝马x5质量到底怎么样_2020款宝马X5价格新变化 都市越野绝佳之选_搜狐汽车...
- 80后智能科技公司诚聘业务人员
- 苹果Mac从睡眠模式唤醒后 Wi-Fi 无法连接如何解决?
- CentosOS 7: 创建Nginx+Https网站
- 【发表案例】JCR1区计算机测量类SCI,仅3个月录用
- 【最全解决方案】WPS软件复制PDF后粘贴到Word格式混乱,如图,如何解决?
- 自然语言处理——基于预训练模型的方法——第3章 基础工具集与常用数据集
- java 怎么使用 设计模式对业务进行解耦(一)
- 【vue3】vue3+ts+vite项目设置路径别名
- ChatGPT官宣数学能力再升级,网友:终于精通十以内加减法了
- 《高性能MySQL》 第三章 服务器性能剖析 读书笔记