SpringCloud(7)---网关概念、Zuul项目搭建

时间:2021-07-25 19:26:24

SpringCloud(7)---网关概念、Zuul项目搭建

 项目代码GitHub地址https://github.com/yudiandemingzi/spring-cloud-study

一、网关概念

1、什么是路由网关

网关是系统的唯一对外的入口,介于客户端和服务器端之间的中间层,处理非业务功能 提供路由请求、鉴权、监控、缓存、限流等功能。它将"1对N"问题转换成了"1对1”问题。

通过服务路由的功能,可以在对外提供服务时,只暴露 网关中配置的调用地址,而调用方就不需要了解后端具体的微服务主机。

2、为什么要使用微服务网关

不同的微服务一般会有不同的网络地址,而客户端可能需要调用多个服务接口才能完成一个业务需求,若让客户端直接与各个微服务通信,会有以下问题:

(1)客户端会多次请求不同微服务,增加了客户端复杂性

(2)存在跨域请求,处理相对复杂

(3)认证复杂,每个服务都需要独立认证

(4)难以重构,多个服务可能将会合并成一个或拆分成多个

SpringCloud(7)---网关概念、Zuul项目搭建

3、网关的优点

微服务网关介于服务端与客户端的中间层,所有外部服务请求都会先经过微服务网关客户只能跟微服务网关进行交互,无需调用特定微服务接口,使得开发得到简化

SpringCloud(7)---网关概念、Zuul项目搭建

总的理解网关优点

服务网关 = 路由转发 + 过滤器

(1)路由转发:接收一切外界请求,转发到后端的微服务上去。

(2)过滤器:在服务网关中可以完成一系列的横切功能,例如权限校验、限流以及监控等,这些都可以通过过滤器完成(其实路由转发也是通过过滤器实现的)。

4、服务网关技术选型

SpringCloud(7)---网关概念、Zuul项目搭建

引入服务网关后的微服务架构如上,总体包含三部分:服务网关、open-service和service。

(1)总体流程

服务网关、open-service和service启动时注册到注册中心上去;

用户请求时直接请求网关,网关做智能路由转发(包括服务发现,负载均衡)到open-service,这其中包含权限校验、监控、限流等操作

open-service聚合内部service响应,返回给网关,网关再返回给用户

(2)引入网关的注意点

增加了网关,多了一层转发(原本用户请求直接访问open-service即可),性能会下降一些(但是下降不大,通常,网关机器性能会很好,而且网关与open-service的访问通常

是内网访问,速度很快);

(3)服务网关基本功能

智能路由:接收外部一切请求,并转发到后端的对外服务open-service上去;

注意:我们只转发外部请求,服务之间的请求不走网关,这就表示全链路追踪、内部服务API监控、内部服务之间调用的容错、智能路由不能在网关完成;

当然,也可以将所有的服务调用都走网关,那么几乎所有的功能都可以集成到网关中,但是这样的话,网关的压力会很大,不堪重负。

权限校验:可在微服务网关上进行认证,然后在将请求转发给微服务,无须每个微服务都进行认证,不校验服务内部的请求。服务内部的请求有必要校验吗?

API监控:只监控经过网关的请求,以及网关本身的一些性能指标(例如,gc等);

限流:与监控配合,进行限流操作;

API日志统一收集:类似于一个aspect切面,记录接口的进入和出去时的相关日志。

二、Zuul项目搭建

SpringCloud(7)---网关概念、Zuul项目搭建

使用到的组件包括:Eureka、Feign、Zuul,包括以下四个项目:

(1)Eureka-server:   7001    注册中心

(2)product-server :8001   商品微服务

(3)order-server :   9001   订单微服务

(4)zuul-gateway :   6001   Zuul网关

注册中心、商品微服务、order在之前博客都已搭建,这里就不重复写。这里只写zuul-gateway微服务。

1、pom.xml

        <!--客户端jar包,这个在订单微服务,商品微服务都要添加-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency> <!--zuuljar包-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-zuul</artifactId>
</dependency>

2、application.yml

server:
port: 6001 #服务的名称
spring:
application:
name: zuul-gateway #指定注册中心地址
eureka:
client:
serviceUrl:
defaultZone: http://localhost:7001/eureka/ #自定义路由映射
zuul:
routes:
order-service: /apigateway/order/**
product-service: /apigateway/product/**
#统一入口为上面的配置,其他入口忽略
ignored-patterns: /*-service/**
#忽略整个服务,对外提供接口
ignored-services: order-service

3、SpringBoot启动类

@SpringBootApplication
//加上网关注解
@EnableZuulProxy
public class ZuulServerApplication {
public static void main(String[] args) {
SpringApplication.run(ZuulServerApplication.class, args);
}
}

4、测试

(1)直接订单服务调商品服务

SpringCloud(7)---网关概念、Zuul项目搭建

 (2)通过Zuul网关实现订单接口调商品服务

SpringCloud(7)---网关概念、Zuul项目搭建

5、注意些细节

(1)url不能重复,否则会覆盖

    order-service:    /apigateway/order/**
product-service: /apigateway/product/**

(2)通过zuul后,request中的cookie值获取不到,那是因为网关给过滤掉了。

    @RequestMapping("list")
public void list(@RequestParam("user_id")int userId, @RequestParam("product_id") int productId, HttpServletRequest request){
String token = request.getHeader("token");
String cookie = request.getHeader("cookie");
//会发现token值能够获取,cookie无法获取,原因是因为网关会过滤掉敏感词
System.out.println("token="+token);
System.out.println("cookie="+cookie);
}

想要不过滤掉cookie值那么在配置里配置

zuul:
#处理http请求头为空的问题
sensitive-headers:

6、问题

自己遇到两个问题记录下,后期再来思考解决。

1、现在通过订单服务地址可以直接访问订单微服务,如何配置成订单微服务不能直接服务,只能通过网关访问。

思考,是不是以后订单微服务配置到内网就不会有这个问题了。

2、当我的订单服务调商品服务异常时,直接访问订单微服务熔断降级能够完成,通过网关竟然直接报异常了。

我在商品微服务相关接口添加:

//睡眠两秒,微服务默认一秒就超时,所以会到降级方法
TimeUnit.SECONDS.sleep(2);

SpringCloud(7)---网关概念、Zuul项目搭建

直接调订单服务,降级信息返回正常。如果通过网关访问。

SpringCloud(7)---网关概念、Zuul项目搭建

返回的是异常,这不是很蛋疼吗,总是有解决办法让降级信息返回来的,以后解决来再来写。

参考

Spring Cloud:服务网关 Zuul

我只是偶尔安静下来,对过去的种种思忖一番。那些曾经的旧时光里即便有过天真愚钝,也不值得谴责。毕竟,往后的日子,还很长。不断鼓励自己,

天一亮,又是崭新的起点,又是未知的征程(上校9)

SpringCloud(7)---网关概念、Zuul项目搭建的更多相关文章

  1. SpringCloud(六)之 网关概念、Zuul项目搭建-(利用Zuul 实现鉴权和限流实战)

    一.网关概念 1.什么是路由网关 网关是系统的唯一对外的入口,介于客户端和服务器端之间的中间层,处理非业务功能 提供路由请求.鉴权.监控.缓存.限流等功能.它将"1对N"问题转换成 ...

  2. SpringCloud---网关概念、Zuul项目搭建(六)

    SpringCloud---网关概念.Zuul项目搭建(六) 一.网关概念 1.什么是路由网关 网关是系统的唯一对外的入口,介于客户端和服务器端之间的中间层,处理非业务功能 提供路由请求.鉴权.监控. ...

  3. SpringCloud&lpar;一&rpar;学习笔记之项目搭建

    [springcloud项目名称不支持下划线] 一.创建父项目 File---new---project: 填写项目信息: 默认即可,点击finish创建完成: 由于父项目只用到pom文件 所以把sr ...

  4. Vuex的基本概念、项目搭建、入坑点

    前言:Vuex是一个专门为Vue.js应用程序开发的状态管理模式, 它采用集中式存储管理所有组件的公共状态, 并以相应的规则保证状态以一种可预测的方式发生变化. Vuex的四大核心 1.state 驱 ...

  5. 小D课堂 - 新版本微服务springcloud&plus;Docker教程&lowbar;6-02 springcloud网关组件zuul

    笔记 2.SpringCloud的网关组件zuul基本使用     简介:讲解zuul网关基本使用 1.加入依赖 2.启动类加入注解 @EnableZuulProxy         默认集成断路器 ...

  6. SpringCloud之网关zuul

    1.微服务网关介绍和使用场景 1)什么是网关 API Gateway,是系统的唯一对外的入口,介于客户端和服务器端之间的中间层,处理非业务功能 提供路由请求.鉴权.监控.缓存.限流等功能 统一接入 智 ...

  7. Day04&lowbar;乐优商城项目搭建

    学于黑马和传智播客联合做的教学项目 感谢 黑马官网 传智播客官网 微信搜索"艺术行者",关注并回复关键词"乐优商城"获取视频和教程资料! b站在线视频 0.学习 ...

  8. 小D课堂 - 新版本微服务springcloud&plus;Docker教程&lowbar;6-06 zuul微服务网关集群搭建

    笔记 6.Zuul微服务网关集群搭建     简介:微服务网关Zull集群搭建 1.nginx+lvs+keepalive      https://www.cnblogs.com/liuyisai/ ...

  9. soul开源网关项目搭建学习

    1. soul开源网关项目搭建学习 1.1. 地址 https://gitee.com/shuaiqiyu/soul 1.2. 介绍 官方介绍:这是一个异步的,高性能的,跨语言的,响应式的API网关. ...

随机推荐

  1. IIS 7&period;5 发布Web 网站步骤

    1. 添加删除程序中,点击打开或关闭Window 功能 , 如图 , 勾选: 2. 打开 vs开发工具 控置台程序 , 注册 aspnet_regiis -i 3.设置应用程序域为指定版本 4.设置应 ...

  2. 未在本地计算机上注册&OpenCurlyDoubleQuote;microsoft&period;ACE&period;oledb&period;12&period;0”提供程序

    这种错误的可能性有几种,比如: 1.没有安装数据访问组件,需要安装相应版本的数据访问组件: 2.没有安装相应版本的Office客户端,需要安装相应版本的Office客户端: 3.Microsoft.J ...

  3. 【QT】C&plus;&plus; GUI Qt4 学习笔记1

    Find对话框实现 平台 Qt5.3.2 MinGW4.8.2 注意创建时用QDialog finddialog.h #ifndef FINDDIALOG_H #define FINDDIALOG_H ...

  4. SPOJ SUBST1 后缀数组

    题目链接:http://www.spoj.com/problems/SUBST1/en/ 题意:给定一个字符串,求不相同的子串个数. 思路:直接根据09年oi论文<<后缀数组——出来字符串 ...

  5. &lbrack;转&rsqb;非OpenVZ下利用谷歌TCP-BBR协议单边加速你的VPS

    前段时间谷歌推出了新的 TCP-BBR 开源算法,可以起到单边加速 TCP 连接的效果,也就是不用客户端的配合,用来替代收费的锐速再合适不过,毕竟开源免费.TCP-BBR 的目的是要尽量跑满带宽,并且 ...

  6. JQuery的ajax登录案例

    1.简单版AjaxLogin.html代码: <head> <title></title> <script src="jquery-1.8.3.js ...

  7. MVC 局部加载页面的实例

    我们在做MVC 进行某一块的局部刷新,有的使用AJAX 请求,有的使用局部页: 下面我给大家推荐一种使用局部页面实现的这种方式: 第一步: 嵌套视图页 <div id="showAud ...

  8. cocos2d-x CCSpriteBatchNode

    转自:http://www.cnblogs.com/jiackyan/archive/2013/04/14/3019880.html 1.先说下渲染批次:这是游戏引擎中一个比较重要的优化指标,指的是一 ...

  9. Php之Http请求urlencode&sol;rawurlencode

    在http请求中,如果参数值带中文最好使用urlencode/rawurlencode函数. 如果参数值中带加号也最好使用,否则后台接收时,+号变成空格,引起不必要的麻烦. 注:urlencode和r ...

  10. 加载dll、lib库

    2.是关于如何加载dll或lib库的.可以看这篇bog   Qt调用dll中的功能函数点击打开链接 ************************************************** ...