前言:
在微服务架构中,需要几个基础的服务治理组件,包括服务注册与发现、服务消费、负载均衡、断路器、智能路由、配置管理等,由这几个基础组件相互协作,共同组建了一个简单的微服务系统。

在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相关推荐

  1. 第四篇:断路器(Hystrix)(Finchley版本)V2.0_dev

    前言: 在微服务架构中,根据业务来拆分成一个个的服务,服务与服务之间可以相互调用(RPC),在Spring Cloud可以用RestTemplate+Ribbon和Feign来调用.为了保证其高可用, ...

  2. 第二篇 服务消费者(rest ribbon)(Finchley版本)V2.0_dev

    前言: 在微服务架构中,业务都会被拆分成一个独立的服务,服务与服务的通讯是基于http restful的. Spring cloud有两种服务调用方式: 第一种 ribbon+restTemplate ...

  3. 第一篇:服务的注册与发现Eureka(Finchley版本)V2.0_dev

    Eureka 简介: Eureka是Netflix 开源的服务发现组件, Spring Cloud 将其集成在 Spring Cloud Netflix 中,实现服务的注册和发现.Eureka 主要包 ...

  4. 第十篇: 高可用的服务注册中心(Finchley版本)V2.0_dev

    一.准备工作 Eureka通过运行多个实例,使其更具有高可用性.事实上,这是它默认的熟性,你需要做的就是给对等的实例一个合法的关联serviceurl. 二.创建eureka-server 引入依赖 ...

  5. 第八篇: 消息总线(Spring Cloud Bus)(Finchley版本)V2.0_dev

    前言: Spring Cloud Bus 将分布式的节点用轻量的消息代理连接起来. 它可以用于广播配置文件的更改或者服务之间的通讯,也可以用于监控. 本文要讲述的是用Spring Cloud Bus实 ...

  6. 第七篇: 高可用的分布式配置中心(Spring Cloud Config)(Finchley版本)V2.0_dev

    前言: 上一篇文章讲述了一个服务如何从配置中心读取文件,配置中心如何从远程git读取配置文件,当服务实例很多时,都从配置中心读取文件,这时可以考虑将配置中心做成一个微服务,将其集群化,从而达到高可用. ...

  7. 第六篇: 分布式配置中心(Spring Cloud Config)(Finchley版本)V2.0_dev

    一.简介 在分布式系统中,由于服务数量巨多,为了方便服务配置文件统一管理,实时更新,所以需要分布式配置中心组件. 在Spring Cloud中,有分布式配置中心组件spring cloud confi ...

  8. 第三篇:服务消费者(Feign)(Finchley版本)V2.0_dev

    一.Feign简介 Feign是一个声明式的伪Http客户端,它使得写Http客户端变得更简单.使用Feign,只需要创建一个接口并注解.它具有可插拔的注解特性,可使用Feign 注解和JAX-RS注 ...

  9. SpringCloud实战(五)-路由网关(zuul)

    本文是SpringCloud实战(五)-路由网关(zuul),若要关注前文,请点击传送门: SpringCloud实战(四)-断路器(Hystrix) 前文我们介绍了Hystrix断路器.在平常工作中 ...

最新文章

  1. Apache Shiro和Spring Security的详细对比
  2. [BOI2019][第K大问题][暴力剪枝]D2T1 Olympiads
  3. C++学习笔记30:模板与型式参数化
  4. 我常用的python函数(part3)--time.sleep方法
  5. 位域 内存 字节序_C语言中的位域、字节序、比特序、大小端(转)
  6. word List28
  7. Android开发:调用camera API 创建MediaRecorder
  8. keepalived实现双机备份
  9. java6特性_Java开发者:你应该远离的6个Java特性
  10. 13款宝马x5质量到底怎么样_2020款宝马X5价格新变化 都市越野绝佳之选_搜狐汽车...
  11. 80后智能科技公司诚聘业务人员
  12. 苹果Mac从睡眠模式唤醒后 Wi-Fi 无法连接如何解决?
  13. CentosOS 7: 创建Nginx+Https网站
  14. 【发表案例】JCR1区计算机测量类SCI,仅3个月录用
  15. 【最全解决方案】WPS软件复制PDF后粘贴到Word格式混乱,如图,如何解决?
  16. 自然语言处理——基于预训练模型的方法——第3章 基础工具集与常用数据集
  17. java 怎么使用 设计模式对业务进行解耦(一)
  18. 【vue3】vue3+ts+vite项目设置路径别名
  19. ChatGPT官宣数学能力再升级,网友:终于精通十以内加减法了
  20. 《高性能MySQL》 第三章 服务器性能剖析 读书笔记

热门文章

  1. wxpython有哪些基本功能_用Python中的wxPython实现最基本的浏览器功能
  2. Kubernetes各个组件的概念
  3. Java8 Optional类
  4. 【转载】向量空间模型VSM及余弦计算
  5. hdu1257 最少拦截系统【想了好久】
  6. 从 Flink Forward Asia 2021,看Flink未来开启新篇章
  7. 基于 Scheduled SQL 对 VPC FlowLog 实现细粒度时间窗口分析
  8. 一篇小文带你走进RabbitMQ的世界
  9. 美甲帮:数加平台打造大数据架构
  10. DLedger —基于 raft 协议的 commitlog 存储库