微服务化已成为当今主流趋势,但不同的微服务一般会有不同的网络地址,而外部客户端可能需要调用多个服务的接口才能完成一个业务需求,如果让客户端直接与各个微服务通信,会有以下的问题:
-
客户端会多次请求不同的微服务,增加了客户端的复杂性
-
存在跨域请求,在一定场景下处理相对复杂
-
认证复杂,每个服务都需要独立认证
-
难以重构,随着项目的迭代,可能需要重新划分微服务。例如,可能将多个服务合并成一个或者将一个服务拆分成多个。如果客户端直接与微服务通信,那么重构将会很难实施
-
某些微服务可能使用了防火墙 / 浏览器不友好的协议,直接访问会有一定的困难
网关会解决这些问题,可以将服务跟外网进行隔离起到一定的保护作用,同时服务间局域网通信更加快捷。而且在网关中可以做限流、权限校验,使得服务更加专注自身业务。
优点如下:
-
安全,只有网关系统对外进行暴露,微服务可以隐藏在内网,通过防火墙保护
-
易于监控,可以在网关收集监控数据并将其推送到外部系统进行分析
-
易于认证,可以在网关上进行认证,然后再将请求转发到后端的微服务,而无须在每个微服务中进行认证
-
减少了客户端与各个微服务之间的交互次数
-
易于统一鉴权
-
可以用来作LB
接下来codereview
环境:
ubuntu16.04
docker18.04
k8s1.13.x +
maven3.5.3
java1.8 +
springboot 2.1.6
1. 前提
Ubuntu下安装docker18.04 or 其它较高版本,k8s1.13.x及以上,jvm环境等。
2. 创建项目
一如既往,利用eclipse或IDEA创建一个项目,此处略了。
创建好项目之后,首先引入依赖:
<!-- 不要依赖spring-boot-starter-web,会和spring-cloud-starter-gateway冲突,启动时异常 -->
<dependency>
<