Spring Cloud(6):Zuul的基本使用

网关:API Gateway

系统对外唯一入口,介于客户端和服务端之间,处理非业务功能

提供路由请求,鉴权,监控,缓存,限流等功能

简单理解:小区门卫,防止非法人员入内,居民也可以问路

实际理解:假设我部署完成一个电商网站,网关的作用如下

1.前端发起的请求都会发送到网关,比如URL是/api/user,网关判断后跳转到用户服务模块的服务器

2.双十一等时期高并发访问,网关可以做负载均衡,或者对访问进行限流降级

3.对权限进行限制,比如用户不能修改商品库存,于是网关限制用户访问商品编辑模块服务器

Zuul不能凭空使用,至少要有服务模块以及Eureka Server

这里我就不重复写了,使用前文中提到的:

搭建Eureka Server和Product-Service:https://www.cnblogs.com/xuyiqing/p/10861541.html

使用Feign搭建Order-Service:https://www.cnblogs.com/xuyiqing/p/10869026.html

新建Zuul项目:

Project->New Project->Spring Initializr->命名为api-gateway

依赖Eureka和Zuul

然后是配置文件:前文都是yml格式的,感觉用不惯,还是继续用properties吧

主要是配置服务名称和Eureka Server地址

server.port=9000
spring.application.name=api-gateway
eureka.client.service-url.defaultZone=http://localhost:8761/eureka/

在启动类中加入注解:

package org.dreamtech.apigateway;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.zuul.EnableZuulProxy;

@SpringBootApplication
@EnableZuulProxy
public class ApiGatewayApplication {

    public static void main(String[] args) {
        SpringApplication.run(ApiGatewayApplication.class, args);
    }

}

依次启动Eureka Server->Product-Service->Order-Service->Api-Gateway项目

Eureka Server:

注册成功

Zuul的规则是:

zuul-host:zuul-port/service-name/**

我要访问的是Order-Service的/api/order/save路径

根据规则应该访问的是:

http://localhost:9000/order-service/api/order/save?user_id=1&product_id=1:

{"code":0,"data":{"id":0,"productName":"\"iPhone1 data from port=8771\"","tradeNo":"fe70c5d4-7467-43c6-902b-870bb8e763ed","price":1111,"createTime":"2019-05-18T03:16:32.165+0000","userId":1,"userName":null}}

成功

或者访问:http://localhost:9000/product-service/api/product/find?id=1

{"id":1,"name":"iPhone1 data from port=8771","price":1111,"store":10}

成功

一般情况下不会用/product-service和/order-service这种路径,于是想到自定义访问路径:

zuul.routes.order-service=/order/**

访问:http://localhost:9000/order/api/order/save?user_id=1&product_id=1即可

同时,原来的路径也没有失效

如果想让用户只能通过自定义路径访问,而不允许访问/product-service等路径

zuul.routes.order-service=/order/**
zuul.routes.product-service=/product/**
zuul.ignored-patterns=/*-service/**

如果不想开放某服务(不对某服务进行路由)

zuul.ignored-services=order-service

实际部署情况:各种服务通常在内网中,无法拿到IP,因此无法直接访问

用户通过公网IP只能访问到Api-Gateway,通过通过网关访问服务

就是下图这种方式

常见的问题解决:

1.多个服务的自定义路径不能设置成一样的

2.关于HTTP请求头的信息的问题

实验

    @RequestMapping("/save")
    @HystrixCommand(fallbackMethod = "saveOrderFail")
    public Object save(@RequestParam("user_id") int userId, @RequestParam("product_id") int productId, HttpServletRequest request) {

        String token = request.getHeader("token");
        String cookie = request.getHeader("cookie");
        System.out.println(token+" : "+cookie);

        Map<String, Object> data = new HashMap<>();
        data.put("code", 0);
        data.put("data", productOrderService.save(userId, productId));
        return data;
    }

通过网关来访问Order-Service(Postman工具):

打印情况:

hrvboenoiqnjvbwo : null

可以得出结论:获取Cookie失败

原因:Zuul过滤了请求头中的Cookie信息

源码:

    private Set<String> sensitiveHeaders = new LinkedHashSet(Arrays.asList("Cookie", "Set-Cookie", "Authorization"));
    public void setSensitiveHeaders(Set<String> sensitiveHeaders) {
        this.sensitiveHeaders = sensitiveHeaders;
    }

处理:

zuul.sensitive-headers=

注意:不要感觉奇怪,这里就是这么写,看源码set方法置空即可

原文地址:https://www.cnblogs.com/xuyiqing/p/10884860.html

时间: 2024-10-05 09:50:14

Spring Cloud(6):Zuul的基本使用的相关文章

Spring Cloud 之 Zuul.

一.概述 ?API 网关是一个更为智能的应用服务器,它的定义类似于面向对象设计模式中的 Facade 模式,它的存在就像是整个微服务架构系统的门面一样,所有的外部客户端访问都需要经过它来进行调度和过滤.它除了要实现请求路由.负载均衡.校验过滤等功能之外,还需要更多能力,比如与服务治理框架的结合.请求转发时的熔断机制.服务的聚合等一系列高级功能. ?在 Spring Cloud 中了提供了基于 Net?ix Zuul 实现的 API 网关组件 Spring Cloud Zuul. 二.准备阶段 S

Spring Cloud系列-Zuul网关集成JWT身份验证

前言 这两三年项目中一直在使用比较流行的spring cloud框架,也算有一定积累,打算有时间就整理一些干货与大家分享. 本次分享zuul网关集成jwt身份验证 业务背景 项目开发少不了身份认证,jwt作为当下比较流行的身份认证方式之一主要的特点是无状态,把信息放在客户端,服务器端不需要保存session,适合分布式系统使用. 把jwt集成在网关的好处是业务工程不需要关心身份验证,专注业务逻辑(网关可验证token后,把解析出来的身份信息如userId,放在请求头传递给业务工程). 顺便分享下

(四)Spring Cloud教程——Zuul(F版本)

参考:方志鹏的专栏 在微服务架构中,需要几个基础的服务治理组件,包括服务注册与发现.服务消费.负载均衡.断路器.智能路由.配置管理等,由这几个基础组件相互协作,共同组建了一个简单的微服务系统.一个简单的微服务系统如下图: 注意:A服务和B服务是可以相互调用的,作图的时候忘记了.并且配置服务也是注册到服务注册中心的. 在Spring Cloud微服务系统中,一种常见的负载均衡方式是,客户端的请求首先经过负载均衡(zuul.Ngnix),再到达服务网关(zuul集群),然后再到具体的服.,服务统一注

Spring Cloud之Zuul负载均衡

Zuul网关默认是实现负载均衡的,不需要任何配置.默认开启ribbon效果的 可以启启动两个服务端口,访问下. 原文地址:https://www.cnblogs.com/toov5/p/9972466.html

spring cloud 学习笔记--网关zuul学习

微服务是多个服务共同完成一件事情,那么"一致对外"就很有必要,就像我们去买面包,不可能先去找农民买小麦,再.... 盗图 spring cloud 引入zuul方式来实现这一功能 添加依赖 <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-zuul</artifactId> </depend

Spring Cloud(Dalston.SR5)--Zuul 网关-路由配置

Spring Cloud 在 Zuul 的 routing 阶段实现了几个过滤器,这些过滤器决定如何进行路由工作. 简单路由(SimpleHostRoutingFilter) 该过滤器运行后,会将 HTTP 请求全部转发到"源服务器",简单路由的配置如下: #zuul路由配置 zuul: routes: #表示http://localhost:9100/person/speaks地址,路由到http://localhost:8080/speaks person: path:/perso

API网关性能比较:NGINX vs. ZUUL vs. Spring Cloud Gateway vs. Linkerd(转)

前几天拜读了 OpsGenie 公司(一家致力于 Dev & Ops 的公司)的资深工程师 Turgay ?elik 博士写的一篇文章(链接在文末),文中介绍了他们最初也是采用 Nginx 作为单体应用的网关,后来接触到微服务架构后开始逐渐采用了其他组件. 我对于所做的工作或者感兴趣的技术,喜欢刨根问底,所以当读一篇文章时发现没有看到我想要看到的设计思想,我就会四处搜集资料,此外这篇文章涉及了我正在捣鼓的 Spring Cloud,所以我就决定写一篇文章,争取能从设计思路上解释为什么会有这样的性

Spring Boot + Spring Cloud 构建微服务系统(七):API服务网关(Zuul)

技术背景 前面我们通过Ribbon或Feign实现了微服务之间的调用和负载均衡,那我们的各种微服务又要如何提供给外部应用调用呢. 当然,因为是REST API接口,外部客户端直接调用各个微服务是没有问题的,但出于种种原因,这并不是一个好的选择. 让客户端直接与各个微服务通讯,会有以下几个问题: 客户端会多次请求不同的微服务,增加了客户端的复杂性. 存在跨域请求,在一定场景下处理会变得相对比较复杂. 实现认证复杂,每个微服务都需要独立认证. 难以重构,项目迭代可能导致微服务重新划分.如果客户端直接

Zuul &amp; Spring Cloud Gateway &amp; Linkerd性能对比

Spring Cloud从一开始最受大家质疑的就是网关性能,那是由于Spring Cloud最初选择了使用Netflix几年前开源的Zuul作为基础,而高性能版的Zuul 2在经过了多次跳票之后,对于Spring这样的整合专家可能也不愿意再继续等待,Spring Cloud Gateway应运而生,那么这个由Spring社区自己开发推出的网关又如何呢?最近一篇<实测 | 转型微服务,这4大工具谁是API网关性能最优?>的翻译中对比了NGINX.ZUUL.Spring Cloud Gateway

Spring Cloud Netflix子模块综合整理-Zuul

路由器和过滤器:Zuul 路由是微服务架构的组成部分. 例如,/ 可以映射到您的Web应用程序,/api /users映射到用户服务,/api/ shop映射到购物服务. Zuul是Netflix基于JVM的路由器和服务器端负载均衡器. Netflix使用Zuul进行以下操作: ? 配置属性zuul.max.host.connections已被两个新属性替换,zuul.host.maxTotalConnections和zuul.host.maxPerRouteConnections,分别默认为2