SpringCloud Alibaba实战(11:引入服务网关Gateway)
源码地址:https://gitee.com/fighter3/eshop-project.git
持续更新中……
大家好,我是三分恶。
在前面的章节中,我们已经完成了服务间的调用、统一配置等等,在这一章节里,我们会引入微服务体系的一个重要组件——网关。
网关概述
为什么要引入网关
大家都知道,我们服务端的各个服务调用是从服务注册中心拉取服务列表,再由负载均衡策略去调用对应的服务提供方。
那么,在什么都不做的情况下,看看我们的客户端,包括PC、移动端等等是怎么访问我们的服务端的呢?
这么办有什么问题呢?
客户端需要维护后端服务的地址,如果我们集群部署,一个服务有数十上百个节点呢?
日志、鉴权等等逻辑,我们每个服务都得搞一套。
服务端的服务都得能被客户端访问,所以需要外网ip,但是ip资源实在太宝贵了。
……
这时候就需要在客户端和服务端之间加一个统一的入口,而在微服务的体系中,承担这个角色的就是网关。
我们加入一个网关,来作为请求的统一接入。我们只需要将网关的机器ip配置到DNS,或者接入层负载,那么客户端的服务最终通过我们的网关,再转发给对应的服务端服务。
常见微服务网关
目前市面上根据技术栈实现的不同大概有如下一些网关:
简单介绍一下这些网关:
- Nginx: Nginx由内核和模块组成,内核的设计非常微小和简洁,完成的工作也非常简单,仅仅通过查找配置文件与客户端请求进行 URL 匹配,用于启动不同的模块去完成相应的工作。
- Kong: Kong是一款基于OpenResty(Nginx + Lua模块)编写的高可用、易扩展的,由Mashape公司开源的API Gateway项目。Kong是基于NGINX和Apache Cassandra或PostgreSQL构建的,能提供易于使用的RESTful API来操作和配置API管理系统,所以它可以水平扩展多个Kong服务器,通过前置的负载均衡配置把请求均匀地分发到各个Server,来应对大批量的网络请求。
- Netfilx Zuul:Zuul 是 Netflix 开源的微服务网关组件,它可以和 Eureka、Ribbon、Hystrix 等组件配合使用。社区活跃,融合于 SpringCloud 完整生态,是构建微服务体系前置网关服务的最佳选型之一。
- Spring Cloud GetWay:Spring Cloud Gateway 是Spring Cloud的一个全新的API网关项目,目的是为了替换掉Zuul1。Gateway可以与Spring Cloud Discovery Client(如Eureka)、Ribbon、Hystrix等组件配合使用,实现路由转发、负载均衡、熔断等功能,并且Gateway还内置了限流过滤器,实现了限流的功能。
Spring Cloud GetWay实践
在上面我们已经简单介绍了各种常见的微服务网关,接下来引入我们今天的主角——SpringCloud Gateway。
创建网关服务
- 创建网关子module
esop-gateway
- 引入相关依赖,注意啊,因为网关服务作为一个服务,同样需要配置中心和注册中心,所以,我们也引入了相关依赖
<!--Spring Cloud Alibaba-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
<version>0.2.2.RELEASE</version>
</dependency>
<dependency>
<groupId>com.alibaba.nacos</groupId>
<artifactId>nacos-client</artifactId>
</dependency>
<!-- spring cloud alibaba nacos config 依赖 -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
<!--gateway网关-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-gateway</artifactId>
</dependency>
- bootstap.yml:在配置文件里除了应用名称,我们还配置了Nacos的相关配置,不太清楚的同学可以查看上一节。
spring:
application:
name: gateway-service # 应用名称
profiles:
active: dev # 当前环境对应的 profile
cloud:
nacos:
config:
enabled: true # 如果不想使用 Nacos 进行配置管理,设置为 false 即可
server-addr: 127.0.0.1:8848 # Nacos Server 地址
group: DEFAULT_GROUP # 组,默认为 DEFAULT_GROUP
file-extension: yaml # 配置内容的数据格式,默认为 properties
namespace: dev_space # 指定命名空间,默认为public
路由配置
我们在nacos中来完成gateway的相关路由的配置。
server:
port: 9000
spring:
cloud:
nacos:
discovery:
server-addr: 127.0.0.1:8848
gateway:
discovery:
locator:
enabled: true
routes:
- id: user-service
uri: lb://user-service
predicates:
- Path=/user/**
filters:
- StripPrefix=1
我们在里面进行了路由转发的配置,也就是routes
,我们来看一看这些配置项都是什么意思:
- id: 路由的
唯一
标识,用以和其它Route区分 - uri: 请求要转发到的地址,lb 指的是从nacos中按照名称获取微服务,并遵循负载均衡策略
- predicates: 路由需要满足的条件,也是个数组(这里是
或
的关系) - filters: 过滤器,请求在传递过程中可以通过过滤器对其进行一定的修改
在这个配置项里,我们定义了user
开头的请求,分发到user-service
这个服务。
接下来我们看看效果吧!
路由转发效果
回忆一下,在用户服务里有一个get请求的根据 id 获取用户的接口,访问一下:
OK,我们现在不直接访问用户服务的接口,而是改成访问网关服务,我们来看看效果:
我们访问的地址是:http://localhost:9000/user/shop-user/user/get-by-id?id=1 ,简单解析一下:
到此,我们已经引入了Spring Cloud Gateway作为微服务网关,并完成了基本的路由转发的功能。
除了基本的路由转发,服务网关还可以完成权限校验、限流、API校验等功能,后续我们会继续深入,敬请期待!
"简单的事情重复做,重复的事情认真做,认真的事情有创造性地做!"——
我是三分恶,可以叫我老三/三分/三哥/三子,一个能文能武的全栈开发,咱们下期见!
参考:
【1】:SpringCloud Cloud Gateway官方文档
【2】:微服务下的网关如何选择
【3】:小专栏 SpringCloudAlibaba微服务实战
【4】: SpringCloud gateway (史上最全)
【5】:SpringCloud Alibaba微服务实战十 - 服务网关
SpringCloud Alibaba实战(11:引入服务网关Gateway)的更多相关文章
- SpringCloud之服务网关Gateway,入门+实操
SpringCloudAlibaba微服务实战教程系列 Spring Cloud 微服务架构学习记录与示例 一. GateWay简介 Spring Cloud GateWay是Spring Cloud ...
- SpringCloud Alibaba实战(6:nacos-server服务搭建)
源码地址:https://gitee.com/fighter3/eshop-project.git 持续更新中-- 大家好,我是三分恶. 这一节我们来学习SpringCloud Alibaba体系中一 ...
- SpringCloud Alibaba实战(7:nacos注册中心管理微服务)
源码地址:https://gitee.com/fighter3/eshop-project.git 持续更新中-- 在上一节我们已经完成了Nacos Server的本地部署,这一节我们学习如何将Nac ...
- SpringCloud Alibaba实战(8:使用OpenFeign服务调用)
源码地址:https://gitee.com/fighter3/eshop-project.git 持续更新中-- 在上一个章节,我们已经成功地将服务注册到了Nacos注册中心,实现了服务注册和服务发 ...
- 跟我学SpringCloud | 第十七篇:服务网关Zuul基于Apollo动态路由
目录 SpringCloud系列教程 | 第十七篇:服务网关Zuul基于Apollo动态路由 Apollo概述 Apollo相比于Spring Cloud Config优势 工程实战 示例代码 Spr ...
- SpringCloud Alibaba实战(3:存储设计与基础架构设计)
1.存储设计 在上一章中,我们已经完成了基本业务流程的梳理和服务模块的划分,接下来,开始设计数据存储. 虽然在微服务的理论中,没有对数据库定强制性的规范,但一般,服务拆分之后,数据库也会对应的拆分. ...
- 跟我学SpringCloud | 第十篇:服务网关Zuul高级篇
SpringCloud系列教程 | 第十篇:服务网关Zuul高级篇 Springboot: 2.1.6.RELEASE SpringCloud: Greenwich.SR1 如无特殊说明,本系列教程全 ...
- 小D课堂 - 新版本微服务springcloud+Docker教程_6-01 微服务网关介绍和使用场景
笔记 第六章 微服务网关zuul开发实战 1.微服务网关介绍和使用场景 简介:讲解网关的作用和使用场景 (画图) 1)什么是网关 API Gateway,是系 ...
- SpringCloud Alibaba实战(2:电商系统业务分析)
选用了很常见的电商业务来进行SpringCloud Alibaba的实战. 当然,因为仅仅是为了学习SpringCloud Alibaba,所以对业务进行了大幅度简化,这里只取一个精简版的用户下单业务 ...
随机推荐
- 【山外笔记-SVN命令】svn命令详解
本文打印版文件下载地址 [山外笔记-SVN命令]svn命令详解-打印版.pdf 一.命令简介 svn命令用于Subversion命令行客户端,执行svn相关的操作. 二.命令语法 1.svn语法: ( ...
- Linux命令学习—— fdisk -l 查看硬盘及分区信息
Linux命令学习(3)-- fdisk -l 查看硬盘及分区信息注意:在使用fdisk命令时要加上sudo命令,否则什么也不能输出linux fdisk 命令和df区别是什么? fdisk工具是分区 ...
- 链路追踪_SkyWalking的部署及使用
关于链路追踪,目前比较主流是Cat,Zipkin,SkyWalking等这些工具.这篇文章主要介绍关于SkyWalking工具的. 为什么用SkyWalking,因为它基本没有代码侵入,只这一点就足够 ...
- 用户从控制台输入n个整数,比较并输出其中的最大值和最小值
package judgment;import java.util.Scanner;/** * 用户输入n个整数,找出最大值和最小值并打印输出 */public class Judgment { pu ...
- 如何在 Docker 环境下自动给 .NET 程序生成 Dump
前言 之前"一线码农"大佬有写文章介绍了如何在 windows 下自动 dump,正好手里有个在 docker 环境下 dump 的需求,所以在参考大佬文章的基础上,有了本篇. ...
- 【odoo14】【用户侧】权限配置
以下内容仅适用于odoo的客户,不适用于开发人员. 下文介绍中涉及的概念及UI均是在odoo14社区版中进行. 目录 一. odoo中的对象 二. 权限控制 2.1 实现原理 2.2 UI方式实现权限 ...
- GO语言的JSON03---JSON文件的序列化与反序列化
package main import ( "encoding/json" "fmt" "os" ) type Human2 struct ...
- 旷视MegEngine网络搭建
旷视MegEngine网络搭建 在 基本概念 中,介绍了计算图.张量和算子,神经网络可以看成一个计算图.在 MegEngine 中,按照计算图的拓扑结构,将张量和算子连接起来,即可完成对网络的搭建.M ...
- python+selenium基础篇,切入切出frame
1.首先制作一个html的文件,代码如下 <!DOCTYPE html> <html> <head> <title>Frame_test</tit ...
- zookeeper分布式锁,解决了羊群效应, 真正的zookeeper 分布式锁
zookeeper 实现分布式锁,监听前一个节点来避免羊群效应, 思路:很简单,但是实现起来要麻烦一些, 而且我也是看了很多帖子,发现很多帖子的代码,下载下来逐步调试之后发现,看起来是对的,但在并发情 ...