|
|
|
@ -7,14 +7,35 @@ |
|
|
|
|
|
|
|
|
|
SOP也是采用这种方式实现,大致步骤如下: |
|
|
|
|
|
|
|
|
|
- 每个服务注册到注册中心,在启动的时候把自己的接口信息上传到zookeeper,并且保证每一个接口都能对应到哪个服务。 |
|
|
|
|
- 每个服务注册到注册中心,在启动的时候把自己的路由信息上传到zookeeper,并且保证每一个接口都能对应到哪个服务。 |
|
|
|
|
- 网关启动时同样注册到注册中心,获取zookeeper上的接口信息,保存到本地,并监听zookeeper上的接口信息,一旦接口信息有修改,网关这边能及时进行更新。 |
|
|
|
|
- 网关收到客户端请求后,先进行签名校验,通过之后根据接口信息找到对应的服务,然后进行路由 |
|
|
|
|
- 网关对返回结果进行处理(或不处理),返回给客户端。 |
|
|
|
|
|
|
|
|
|
如何通过接口参数找到对应的服务呢? |
|
|
|
|
|
|
|
|
|
确保接口名唯一,即`method`参数全局唯一,这里需要做好相应规范,接口名的命名规则应该:`服务模块.业务模块.功能模块.行为`,如: |
|
|
|
|
在网关定义一个`Map<String, RouteInfo> routeMap = ...`,key为接口名+版本号。 |
|
|
|
|
|
|
|
|
|
网关启动时,从zookeeper中获取路由信息,并保存到routeMap中 |
|
|
|
|
|
|
|
|
|
```java |
|
|
|
|
routeMap = buildFromZookeeper(); |
|
|
|
|
``` |
|
|
|
|
|
|
|
|
|
接口请求进来后,根据`方法名+版本号`获取路由信息,然后进行路由转发。 |
|
|
|
|
|
|
|
|
|
```java |
|
|
|
|
String method = request.getParameter("method"); |
|
|
|
|
String version = request.getParameter("version"); |
|
|
|
|
|
|
|
|
|
RouteInfo routeInfo = routeMap.get(method + version); |
|
|
|
|
|
|
|
|
|
doRoute(routeInfo); |
|
|
|
|
``` |
|
|
|
|
|
|
|
|
|
因为有多个服务把路由信息注册到zookeeper,我们要确保接口名唯一,即`method`全局唯一。 |
|
|
|
|
|
|
|
|
|
我们推荐接口名的命名规则应该是:`服务模块.业务模块.功能模块.行为`,如: |
|
|
|
|
|
|
|
|
|
mini.user.userinfo.get 小程序服务.用户模块.用户信息.获取 |
|
|
|
|
|
|
|
|
|