源码地址:https://gitee.com/fighter3/eshop-project.git
持续更新中……
大家好,我是三分恶。
在前面的章节中,我们已经完成了服务间的调用、统一配置等等,在这一章节里,我们会引入微服务体系的一个重要组件——网关。
大家都知道,我们服务端的各个服务调用是从服务注册中心拉取服务列表,再由负载均衡策略去调用对应的服务提供方。
那么,在什么都不做的情况下,看看我们的客户端,包括PC、移动端等等是怎么访问我们的服务端的呢?
这么办有什么问题呢?
客户端需要维护后端服务的地址,如果我们集群部署,一个服务有数十上百个节点呢?
日志、鉴权等等逻辑,我们每个服务都得搞一套。
服务端的服务都得能被客户端访问,所以需要外网ip,但是ip资源实在太宝贵了。
……
这时候就需要在客户端和服务端之间加一个统一的入口,而在微服务的体系中,承担这个角色的就是网关。
我们加入一个网关,来作为请求的统一接入。我们只需要将网关的机器ip配置到DNS,或者接入层负载,那么客户端的服务最终通过我们的网关,再转发给对应的服务端服务。
目前市面上根据技术栈实现的不同大概有如下一些网关:
简单介绍一下这些网关:
在上面我们已经简单介绍了各种常见的微服务网关,接下来引入我们今天的主角——SpringCloud Gateway。
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>
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
,我们来看一看这些配置项都是什么意思:
唯一
标识,用以和其它Route区分或
的关系)在这个配置项里,我们定义了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微服务实战十 - 服务网关
【6】:《吃透微服务》 - 服务网关之Gateway
cs