一、什么是Zuul 服务网关

Zuul 是 Netflix 提供的⼀个开源的 API ⽹关服务器,是客户端和⽹站后端所有请求的中间层,对外开放 ⼀个 API,将所有请求导⼊统⼀的⼊⼝,屏蔽了服务端的具体实现逻辑,Zuul 可以实现反向代理的功 能,在⽹关内部实现动态路由、身份认证、IP 过滤、数据监控等。Zuul也是Spring Cloud集成的组件,通过它来实现服务网关。

二、Zuul的功能列表

\1. 身份认证与安全:识别每个资源的验证要求,并拒绝那些与要求不符合的请求。

\2. 审查与监控:在边缘位置追踪有意义的数据和统计结果,从而带来精确的生产视图。

\3. 动态路由:动态的将请求路由到不同的后端集群。

\4. 压力测试:逐渐增加指向集群的流量,以了解性能。

\5. 负载分配:为每一种负载类型分配对应容量,并弃用超出限定值的请求。

\6. 静态响应处理:在边缘位置直接建立部分响应,从而避免其转发到内部集群。

\7. 多区域弹性:跨越AWS Region进行请求路由,旨在实现ELB(Elastic Load Balancing)使用的多样化,以及让系统的便越更贴近系统的使用者。

三、实战!

1.创建maven工程,pom.xml配置如下:

  1. <dependency>
  2. <groupId>org.springframework.cloud</groupId>
  3. <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
  4. <version>2.0.2.RELEASE</version>
  5. </dependency>
  6. <dependency>
  7. <groupId>org.springframework.cloud</groupId>
  8. <artifactId>spring-cloud-starter-netflix-zuul</artifactId>
  9. <version>2.0.2.RELEASE</version>
  10. </dependency>

2.创建配置文件application.yml配置如下:

  1. server:
  2. port: 8030
  3. spring:
  4. application:
  5. name: gateway
  6. eureka:
  7. client:
  8. service-url:
  9. defaultZone: http://localhost:8761/eureka/
  10. zuul:
  11. routes:
  12. provider: /p/**

属性说明

* zuul.routes.provider: 给服务提供者 provider 设置映射,可以不需要再记住服务提供者的端口

3.创建启动类,代码如下:

  1. package com.zing;
  2. import org.springframework.boot.SpringApplication;
  3. import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
  4. import org.springframework.cloud.netflix.zuul.EnableZuulProxy;
  5. @EnableZuulProxy
  6. @EnableAutoConfiguration
  7. public class ZuulApplication {
  8. public static void main(String[] args) throws Exception {
  9. SpringApplication.run(ZuulApplication.class, args);
  10. }
  11. }

注解说明

* @EnableZuulProxy : 包含了 @EnableZuulServer ,设置该类是⽹关的启动类。

* @EnableAutoConfiguration :可以帮助 Spring Boot 应⽤将所有符合条件的 @Configuration 配置加载到当前 Spring Boot 创建并使⽤的 IOC 容器中。

四、Zuul的负载均衡

1.修改服务提供者的 controller 层代码,具体如下:

  1. package com.zing.controller;
  2. import java.util.Collection;
  3. import org.springframework.beans.factory.annotation.Autowired;
  4. import org.springframework.beans.factory.annotation.Value;
  5. import org.springframework.web.bind.annotation.DeleteMapping;
  6. import org.springframework.web.bind.annotation.GetMapping;
  7. import org.springframework.web.bind.annotation.PathVariable;
  8. import org.springframework.web.bind.annotation.PostMapping;
  9. import org.springframework.web.bind.annotation.PutMapping;
  10. import org.springframework.web.bind.annotation.RequestBody;
  11. import org.springframework.web.bind.annotation.RequestMapping;
  12. import org.springframework.web.bind.annotation.RestController;
  13. import com.zing.entity.Student;
  14. import com.zing.repository.StudentRepository;
  15. @RestController //在Spring中@RestController的作用等同于@Controller + @ResponseBody。
  16. @RequestMapping("/student")
  17. public class StudentHandler {
  18. @Autowired
  19. private StudentRepository studentRepository;
  20. @Value("${server.port}")
  21. private String port;
  22. @GetMapping("/findAll")
  23. public Collection<Student> findAll(){
  24. return studentRepository.findAll();
  25. }
  26. @GetMapping("/findById/{id}")
  27. public Student findById(@PathVariable("id") long id) {
  28. return studentRepository.findById(id);
  29. }
  30. @PostMapping("/save")
  31. public void save(@RequestBody Student s) {
  32. studentRepository.saveOrUpdate(s);
  33. }
  34. @PutMapping("/Update")
  35. public void Update(@RequestBody Student s) {
  36. studentRepository.saveOrUpdate(s);
  37. }
  38. @DeleteMapping("/deleteById/{id}")
  39. public void deleteById(@PathVariable("id") long id) {
  40. studentRepository.deleteById(id);
  41. }
  42. @GetMapping("/index")
  43. public String index() {
  44. return "当前端口:" + this.port;
  45. }
  46. }

注解说明

* @Value("${server.port}"):获取当前项目application.yml配置文件中的server.port属性值。

2.首先启动注册中心,然后启动服务提供者,修改端口为8011后,再建一个启动类再次启动,我们就可以在注册中心看到两个prider服务,如图:

3.启动zuul的启动类,我们可以访问 http://localhost:8030/p/student/index查看调用服务的端口,我们不断的刷新,可以看到端口是交替出现的:

五、总结

zuul 服务网关是微服务架构中不可或缺的的部分。通过服务网关统一向外系统提供REST API的过程中,除了具备服务路由、负载均衡之外,它还具备了权限控制等功能。

Spring Cloud05: Zuul 服务网关的更多相关文章

  1. Spring Cloud 系列之 Netflix Zuul 服务网关

    什么是 Zuul Zuul 是从设备和网站到应用程序后端的所有请求的前门.作为边缘服务应用程序,Zuul 旨在实现动态路由,监视,弹性和安全性.Zuul 包含了对请求的路由和过滤两个最主要的功能. Z ...

  2. spring cloud: zuul: 微网关-简单使用与路由配置

    spring cloud: zuul: 微网关-简单使用与路由配置 首先引入依赖 <dependency> <groupId>org.springframework.cloud ...

  3. Spring Cloud (14) 服务网关-过滤器

    Spring Cloud Zuul作为网关所具备的最基本的功能:路由,还具备另外一个核心的功能:过滤器. 过滤器 通过Spring Cloud Zuul实现的路由功能,我们的微服务可以通过统一的API ...

  4. Spring Cloud Gateway 服务网关快速上手

    Spring Cloud Gateway 服务网关 API 主流网关有NGINX.ZUUL.Spring Cloud Gateway.Linkerd等:Spring Cloud Gateway构建于 ...

  5. Spring Cloud Zuul与网关中间件

    Spring Cloud Zuul与网关中间件_网易订阅 http://dy.163.com/v2/article/detail/DC7L8UV10511HSJK.html

  6. spring cloud 系列第6篇 —— zuul 服务网关 (F版本)

    源码Gitub地址:https://github.com/heibaiying/spring-samples-for-all 一.zuul简介 1.1 API 网关 api 网关是整个微服务系统的门面 ...

  7. Spring Cloud (13) 服务网关-路由配置

    传统路由配置 所谓传统路由配置方式就是在不依赖于服务发现机制情况下,通过在配置文件中具体制定每个路由表达式与服务实例的映射关系来实现API网关对外部请求的路由.没有Eureka服务治理框架帮助的时候, ...

  8. Spring Cloud (12) 服务网关-基础

    通过前几篇介绍,已经可以构建一个简单的微服务架构了,如下图: 通过eureka实现服务注册中心以及服务注册发现,通过ribbon或feign实现服务的消费以及负载均衡,通过spring cloud c ...

  9. Spring Cloud 之 服务网关

    在微服务架构体系中,使用API 服务网关后的系统架构图如下: API服务网关的主要作用如下: 服务访问的统一入口 服务访问的负载均衡功能 服务访问的路由功能 在SpringCloud中,基于Netfl ...

随机推荐

  1. poj2418map或者字典树

    题意:      给你一些串,然后求出每个串出现的概率. 思路:      简单题目,做法也很多,我用字典树做了下,然后又用map做了下,其实这个题目我感觉直接排序一遍之后线性输出应该是最简单最快的( ...

  2. POJ1018贪心(多路归并的想法)

    题意:      有n个服务器,每个服务器都要安装网线(必须也只能安装一个),然后每个服务器都有mi种选择网线的方式,每种方式两个参数,一个是速度b,另一个是价钱p,然后让你找到一个最大的比值 min ...

  3. markdown 实现代码折叠效果

    展开:我是一个挑山工,仙人跳 #include int main() { printf("挑山工,快乐加倍"); } 展开:我是一个挑山工,仙人跳 #include int mai ...

  4. mongoDB常用

    登陆{ 本地的话直接mongo,如果是docker直接就这样docker exec -it 2d71a13e3128 mongo 或者直接这样 mongo 127.0.0.1:27017 } 退出是 ...

  5. Windows PE 第十二章 PE变形技术

    PE变形技术 这章东西太多,太细了.这里我只记录了一些重点概念.为后面学习做铺垫. PE变形:改变PE结构之后,PE加载器依然可以成功加载运行我们的程序. 一 变形常用技术: 结构重叠技术.空间调整技 ...

  6. springmvc Date类型转换

    有时候我们会碰到这么一个问题,有一个实体类,里面有一个Date类型的数据,jsp页面传递的时间参数是String的,这就导致无法对应,springmvc无法帮我们自动封装参数到实体类中了,这里我解决的 ...

  7. sqlyog报错2058

    报错描述 SQLyog连接mysql8.0时,SQLyog Ultimate显示报错信息并附带乱码 "错误号码2058,Plugin caching--sha2_passward could ...

  8. Java 中 RMI 的使用

    RMI 介绍 RMI (Remote Method Invocation) 模型是一种分布式对象应用,使用 RMI 技术可以使一个 JVM 中的对象,调用另一个 JVM 中的对象方法并获取调用结果.这 ...

  9. 浅析DDD——领域驱动设计的理解

    浅析DDD--领域驱动设计的理解 我觉得领域驱动设计概念的提出,是为了更清晰的区分边界.这里的边界包括业务边界和功能的边界,每个边界都包含具体的领域对象,当业务和功能的领域对象一一对应上之后,业务的变 ...

  10. c#基于supersocket的简单websocket服务端收发消息实现

    using log4net; using SuperSocket.SocketBase; using SuperSocket.WebSocket; using System; using System ...