SpringCloud Zuul 基础入门 - 《重新定义SpringCloud实战》读书笔记系列

Spring Cloud Zuul概述

随着微服务的流行,微服务架构将后端拆解为许多个单独的应用,可是这种方式在带来开发便捷的同时,也出现了新的问题:看起清晰的服务拆分,实则杂乱无章,有时候完成一个业务逻辑,需要到不用主机和不同端口上面调取接口,这是一件很痛苦的事情。于是一个面向服务治理、服务编排的组件出现了——微服务网关。由此,作为Netflix的早期服务化后端应用程序前门项目,Zuul应运而生。

Zuul是由Netflix孵化的一个致力于“网关”解决方案的开源组件。从2012年3月以来,其陆续发布了Zuul1.0与Zuul2.0版本,后经Pivotal公司发现并整合于Spring Cloud生态系统,即现在的Spring Cloud Zuul。在动态路由、监控、弹性、服务治理以及安全方面起着举足轻重的作用。

Zuul是设备和网站到后端应用程序所有请求的前门,为内部服务提供可配置的对外URL到服务的映射关系,基于JVM的后端路由器。其具备以下功能:

  • 认证与鉴权
  • 压力控制
  • 金丝雀测试
  • 动态路由
  • 负载削减
  • 静态响应处理
  • 主动流量控制

其底层基于Servlet,本质组件是一系列Filter所构成的责任链。

Spring Cloud Zuul入门案例

这里采用的是书中提供的源码,github地址:https://github.com/SpringCloud/spring-cloud-code

这里实现了一个Zuul的Hello World的入门程序,用到的Spring Cloud组件是Eureka与Zuul,另外使用了一个普通服务作为zuul路由的下级服务,来模拟真实开发中的一次路由过程。

这里用到的是源码中的ch7-2,导入idea中如图:

1.创建Maven父级pom工程

在父工程里面配置好工程需要的父级以来,目的是为了方便管理与简化配置,pom文件如下:

<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><groupId>cn.springcloud.book</groupId><artifactId>ch7-2</artifactId><version>0.0.1-SNAPSHOT</version><packaging>pom</packaging><modules><module>ch7-2-eureka-server</module><module>ch7-2-zuul-server</module><module>ch7-2-client-a</module></modules><parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.0.3.RELEASE</version></parent><!--  利用传递依赖,公共部分  --> <dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-actuator</artifactId></dependency><!-- springboot web --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency></dependencies><!-- 管理依赖 --><dependencyManagement><dependencies><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-dependencies</artifactId><version>Finchley.RELEASE</version><type>pom</type><scope>import</scope></dependency></dependencies></dependencyManagement><!--注意: 这里必须要添加,否则各种依赖有问题 --><repositories><repository><id>spring-milestones</id><name>Spring Milestones</name><url>https://repo.spring.io/libs-milestone</url><snapshots><enabled>false</enabled></snapshots></repository></repositories><build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId></plugin></plugins></build>
</project>

2. 创建Eureka组件工程

pom中引入Eureka Server依赖

<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>cn.springcloud.book</groupId><artifactId>ch7-2</artifactId><version>0.0.1-SNAPSHOT</version></parent><artifactId>ch7-2-eureka-server</artifactId><properties><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding><java.version>1.8</java.version></properties><dependencies><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-netflix-eureka-server</artifactId></dependency></dependencies><build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId></plugin></plugins></build>
</project>

启动类加上@EnableEurekaServer注解

@SpringBootApplication
@EnableEurekaServer
public class EurekaServerApplication {public static void main(String[] args) {SpringApplication.run(EurekaServerApplication.class, args);}
}

配置文件bootstrap.yml

server:port: 8888
eureka:instance:hostname: localhostclient:registerWithEureka: falsefetchRegistry: falseserviceUrl:defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/

3. 创建Zuul Server组件工程

pom文件中引入zuul依赖:

<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>cn.springcloud.book</groupId><artifactId>ch7-2</artifactId><version>0.0.1-SNAPSHOT</version></parent><artifactId>ch7-2-zuul-server</artifactId><properties><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding><java.version>1.8</java.version></properties><dependencies><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-netflix-zuul</artifactId></dependency><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-netflix-eureka-client</artifactId></dependency></dependencies><build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId></plugin></plugins></build>
</project>

启动类上加上相关注解

@SpringBootApplication
@EnableDiscoveryClient
@EnableZuulProxy
public class ZuulServerApplication {public static void main(String[] args) {SpringApplication.run(ZuulServerApplication.class, args);}
}

配置文件中设置eureka注册信息及zuul路由队则

spring:application:name: zuul-server
server:port: 5555
eureka:client:serviceUrl:defaultZone: http://${eureka.host:127.0.0.1}:${eureka.port:8888}/eureka/instance:prefer-ip-address: true
zuul:routes:client-a:path: /client/**serviceId: client-a

在上面的配置文件中,设置Zuul组件的端口为5555,指定注册中心,最后5行是本例的核心,它的意思是,将所有/client开头的URL映射到client-a这个服务中去。我们在请求的时候就可以不用请求实际的服务,转而请求这个5555端口的Zuul服务组件,/client即一次服务路由的规则。

4. 创建普通下游服务client-a

创建一个下游普通服务,来测试Zuul Server路由的路由功能。

pom:

<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>cn.springcloud.book</groupId><artifactId>ch7-2</artifactId><version>0.0.1-SNAPSHOT</version></parent><artifactId>ch7-2-client-a</artifactId><properties><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding><java.version>1.8</java.version></properties><dependencies><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-netflix-eureka-client</artifactId></dependency></dependencies><build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId></plugin></plugins></build>
</project>

启动类:

@SpringBootApplication
@EnableDiscoveryClient
public class ClientAApplication {public static void main(String[] args) {SpringApplication.run(ClientAApplication.class, args);}
}

配置:

server:port: 7070
spring:application:name: client-a
eureka:client:serviceUrl:defaultZone: http://${eureka.host:127.0.0.1}:${eureka.port:8888}/eureka/instance:prefer-ip-address: true

测试接口:

@RestController
public class TestController {@GetMapping("/add")public Integer add(Integer a, Integer b){return a + b;}
}

在普通服务中做了一个很简单的get接口,接受两个参数a和b,返回和。

5. 效果展示

依次启动Eureka、Zuul、普通服务client-a,使用postman分两次调取接口。

直接调取接口:

经过Zuul网关调取接口:

由此可知当我们哎Zuul配置文件指定了路由规则后,当向Zuul Server发起请求的时候,它会去Eureka注册中心拉取服务列表,如果发现有指定的路由映射规则,就会按照规则路由到相应的服务接口上去。

SpringCloud Zuul 基础入门相关推荐

  1. SpringCloud Alibaba 从入门到精通(精选)

    SpringCloud Alibaba 从入门到精通 一. 课程介绍 1.1 课程导学 1.2 项目环境搭建 二. SpringBoot基础 2.1 本章概述 2.2 Spring Boot是什么?能 ...

  2. Springboot 集成Springcloud gateway的入门

    最近做项目使用到了springcloude gateway作为网关,因此在此记录下springcloud gateway的入门操作,后续再将源码解读写出来,先立个flag. 回归正题,Springcl ...

  3. Java基础入门:IDEA软件安装和软件初始化设置

    IDEA是一个专门针对Java的集成开发工具(IDE),由Java语言编写.所以,需要有JRE运行环境并配置好环境变量. 它可以极大地提升我们的开发效率.可以自动编译,检查错误.在公司中,使用的就是I ...

  4. SpringCloud从入门到精通教程/SpringCloud Alibaba从入门到精通教程

    对于SpringCloud,很多小伙伴问到了我的研究学习资料来源,除官方文档外,特例完整整理一下自己的平时参考学习其他资料,以及分享实战项目源码和代码资源,供大家参考学习 主要教程:SpringClo ...

  5. Spring Cloud Alibaba基础入门,一周学会基操!

    Spring Cloud Alibaba基础入门,一周学会基操! 服务拆分: 1.不同微服务,不要重复开发相同业务 2.微服务数据独立,不要访问其它微服务的数据库 3.微服务可以将自己的业务暴露为接口 ...

  6. 经典再现,看到就是赚到。尚硅谷雷神 - SpringBoot 2.x 学习笔记 - 基础入门篇

    SpringBoot 2.x 时代 – 基础入门篇 视频学习地址:https://www.bilibili.com/video/BV1Et411Y7tQ?p=112&spm_id_from=p ...

  7. SpringCoud - 基础入门(服务注册与发现、服务调用、服务降级与熔断篇)

    SpringCloud:是一系列框架的有序集合,也是一套完整的微服务解决方案.利用SpringBoot的开发便利巧妙的简化了分布式系统基础设施的开发,如发现注册.配置中心.消息总线.负载均衡.断路器. ...

  8. 五万字15张导图Java自学路线,小白零基础入门,程序员进阶,收藏这篇就够了

    本文收录于<技术专家修炼> 文中配套资料合集 路线导图高清源文件 点击跳转到文末点击底部卡片回复「资料」领取 哈喽,大家好,我是一条~ 最近粉丝问我有没有Java自学路线,有了方向才能按图 ...

  9. 用python循环语句求素数_Python基础入门_3条件语句和迭代循环

    Python 基础入门前两篇: Python 基础入门--简介和环境配置 Python基础入门_2基础语法和变量类型 这是第三篇内容,主要简单介绍条件语句和迭代循环语句,内容也比较简单,目录如下: 条 ...

最新文章

  1. Python3 reversed 函数
  2. Windows下适用于PHP 7.1的memcache扩展工具编译
  3. POJ1284:Primitive Roots——题解
  4. Webpack基础学习
  5. arduino 嗡鸣器 音乐_arduino蜂鸣器怎么输出指定的音乐
  6. 论文Chinese Relation Extraction with Multi-Grained Information and External Linguistic Knowledge阅读笔记
  7. 怎么让图片一直转圈_半夜跟着导航开进山路,货车绕了3小时仍原地转圈,小两口快急哭...
  8. Java实现经典坦克大战及源代码下载
  9. Android MTK修改手机型号
  10. 《电磁学》学习笔记1——电场
  11. macd的python代码同花顺_MACD最全的运用方法!
  12. 30. 人类将如何变革--走出金字塔模型(下)
  13. 据说这是国外最火的55套PS实用教程!
  14. unity android 播放器,Unity3D 安卓视频播放插件 WRP Android Video Player Pro
  15. 硬盘坏了,如何检测与修复。
  16. 全球及中国激光粉尘传感器行业投资前景与运营潜力研究报告2022版
  17. App启动优化-一顿操作猛如虎
  18. 杰理之 高低速(HSB/LSB)时钟硬件模块【篇】
  19. [Jim Jey]JavaScript Closures
  20. 如何解决数据关联查询

热门文章

  1. 直线的Bresenham算法c语言,Bresenham算法
  2. java贪心算法实现找钱问题
  3. 【Linux】Ubuntu 可以不用安装 yum
  4. 能够努力学习的三大原因
  5. Yum,搭建软件仓库
  6. 140-商城业务-认证服务-一篇文章带你解决单点登录+流程演示+源码提供
  7. UWPWP8.1 基础控件——Border
  8. Redis 学习笔记(一)
  9. c语言用printf画熊猫,STM32重定向printf()和scanf()到UART
  10. 最新2020JAVA社招面试问题总结