InfiniGate自研网关实现三

news/2024/10/22 4:21:42/

9.网关注册中心服务初始创建

整理整个网关调用链路流程,梳理核心服务。并完成网关中心简单DDD模型结构工程的搭建,与库表连通可以查询接口映射数据。

在前面我已经开发出了一个初具模型的核心通信组件,那么我该如何使用这个组件呢?接下来就是要思考整个项目的架构问题了。

  1. 如图所示,api-gateway-core 是最核心的通信层。那么它还需要把注册的网关接口在通信核心服务中启动起来。那么怎么启动呢?
  2. 这个启动过程首先来自于 api-gateway-sdk 向 api-gateway-center 推送注册接口,之后在通过网关引擎 api-gateway-engin 拉取接口并在本地服务完成注册。
  3. 最后再调用到网关接口时,则是通过 api-gateway-core 调用到对应的 RPC 应用中。
  4. 那么 api-gateway-sdk 并不是主要工程,没有它的是可以通过 api-gateway-admin 配置。所以 在整个流程中 api-gateway-center、api-gateway-core 是两个核心工程,能更好的串联流程。

下面我要开发注册中心的功能。注册中心主要提供RPC接口的注册和接口的拉取使用。对于一些负载的控制也会在后续陆续完善。

我先来初始化这样一个工程,这个工程采用简单的DDD工程模型结构开发,对外提供 HTTP 接口。之所以提供 HTTP 接口是因为可以引入更少的组件,也能满足需求。当然你也可以使用 MQ、Socket、ZK 等方式进行处理。

项目工程结构:

10.网关注册中心库表结构设计

网关注册中心,是一个多边服务,管理的是RPC服务向网关通信层的关联注册。

这就像美团外面平台,一手管理着商家、一手服务着用户。让用户的订单又商家生产,再配送给用户。而我们的网关注册中心也是这样,一手管理着通信,一手管理着服务。让RPC注册到通信层,在用户调用HTTP接口时,可以把协议转换后调用到对应的RPC服务上。

基于以上这样的情况,所以我们要在注册中心维护: 网关通信表、RPC服务表、以及两个表的关联表

网关服务表:指的是管理 InfiniGate-core 通信组件的服务。将多个InfiniGate-core 通信组件服务进行分组,不同的分组处理不同业务的请求。例如公司中有交易组、账务组、营销组,按照不同组来分配对应的网关服务,各自在注册网关接口时可以做到压力分摊。

网关明细表:指的的是每一组服务下,有N个通信核心服务,这个表里面存InfiniGate-core 通信核心服务的具体信息。这N个服务需要把所有注册到自己组上的RPC接口,都拉取下来完成接口映射。当有HTTP访问的时候,可以均衡的打到这些服务上。

网关分配这个表就是用于关联通信核心服务和注册在通信核心服务上的RPC应用。每个应用该注册到哪个网关里,就由这个表来控制。当你注册应用的时候,会有一个选项,问你要注册到哪个网关上。这部分一般也可以在指定的范围内,动态分配

应用系统:描述一个RPC应用(从微服务的角度来看就是一个微服务实例的相关信息)

应用接口:描述这个RPC应用下有多少个接口,以及明细

应用方法:描述这个RPC应用接口下的方法信息,包括;方法名称、入参信息、出参信息【可选】、请求类型、请求地址以及是否鉴权。因为网关返回的结果是 HTTP 方式,所以并不需要强对象描述信息,所以出参信息可选。

11.网关注册算力节点领域服务实现

在网关注册中心提供网关算力节点的注册服务接口,便于后续网关启动后向网关中心注册信息。

网关注册中心首先要接收来自各个网关服务的注册,任何一组用于处理 HTTP 协议请求的网关算力节点,都要注册到网关中心进行统一维护和管理。因为只有注册到网关中心才能把 RPC 服务分配到各个网关算力节点上进行使用。

我先开发出网关算力节点注册到注册中心的接口,允许外部通过HTTP接口进行注册服务。

具体实现:

1.在interfaces包下的GatewayConfigManage类中提供对外暴露的注册网关算力节点接口。

2.在application包下的IConfigManageService类中补充registerGatewayServerNode接口。

3.在domain领域层包下的子领域包manage下的service包中实现application层中定义的接口。

4.在domain领域层包下的子领域包manage下的repository包中定义持久层的接口。

5.在infrastructure包基础设施层下的repository包下实现在领域层定义的持久层接口。

12.网关注册服务接口领域服务实现

上面实现了网关的服务注册,接下来在本章我们要提供用于RPC服务注册的接口

在一个RPC的服务注册中,需要包括三个部分:RPC服务系统信息、这个服务下的所有接口信息、接口下的所有方法信息。分批地向网关中心完成注册操作。所有信息注册完成后,才能让网关算力服务与RPC的接口进行关联,也就是把RPC接口分配到处理的网关服务上去。这,就是注册中心的作用。

网关中心维护RPC服务注册的库表;application_system、application_interface、application_interface_method

那么这里先来开发这样一块的功能接口,允许外部通过 HTTP 接口进行注册服务。

具体实现:

在注册RPC服务中,分为:服务的系统信息、接口信息、方法信息,所以要提供了3个接口。

1.在用户接口层interfaces包下创建RpcRegisterManage类中提供对外暴露的注册RPC到注册中心的接口,包括三个接口,分别注册务的系统信息、接口信息、方法信息。

2.在应用层application包下创建IRegisterManageService接口,里面提供对应的三个方法。

3.在领域层domain包下创建register子领域包,子领域包下又分别创建model、repository、service包,然后在service包下创建IRegisterManageServiceImpl实现在应用层application定义的IRegisterManageService接口。直接调用持久层的接口。

4.在repository包下创建IRegisterManageRepository接口,里面定义持久层的对应接口(相当于防腐层)。

5.在infrastructure基础层包下定义对应的dao接口与其实现类(仓储服务)。

具体的包结构如下:


http://www.ppmy.cn/news/1455072.html

相关文章

一、写给Android开发者之harmony入门

一、创建新项目 对比 android-studio:ability类似安卓activity ability分为两种类型(Stage模型) UIAbility和Extensionability(提供系统服务和后台任务) 启动模式 1、 singleton启动模式:单例 2、 multiton启动模式&#xff1…

字母异位词分组(Lc49)——计数

给你一个字符串数组,请你将 字母异位词 组合在一起。可以按任意顺序返回结果列表。 字母异位词 是由重新排列源单词的所有字母得到的一个新单词。 示例 1: 输入: strs ["eat", "tea", "tan", "ate", "nat", …

MapReduce笔记

实现分布式的作用: 通过并行处理提高能力通过复制机制进行容错处理与传感器等物理设备的分布相匹配通过隔离实现安全 难点: 许多并行的部件,他们之间有复杂的相互作用必须应对处理部分故障难以实现性能潜力 容错 1000多台服务器、庞大的网络…

Linux字符设备驱动-详解与实操:驱动架构、设备树、Pinctrl子系统和GPIO子系统、platform、设备树下的platform

如何编写一个驱动程序: (1)确定主设备号 (2)定义自己的file_operations结构体: 包含对应的open(drv_open)/read(drv_read)等设备操作函数,需要到内核中去注册 (3)实现…

每日算法-java

题目来自蓝桥云 // 这是一个Java程序,用于解决最长不下降子序列问题。 // 问题描述:给定一个整数序列,找到最长的子序列,使得这个子序列是不下降的(即相邻的元素不严格递减)。 // 程序使用了动态规划的方法…

Docker 安装部署 postgres

Docker 安装部署 postgres 1、拉取 postgres 镜像文件 [rootiZbp19a67kznq0h0rgosuxZ ~]# docker pull postgres:latest latest: Pulling from library/postgres b0a0cf830b12: Pull complete dda3d8fbd5ed: Pull complete 283a477db7bb: Pull complete 91d2729fa4d5: Pul…

golang系统内置函数整理

go语言中有很多系统内置的函数, 为了方便学习,对系统内置函数的函数定义 入参和返回值做如下整理,以方便学习和记忆。 Go语言系统级别的内置函数不多,但是包含的知识点可不少,是学习go语言说必须要搞明白的基础知识 …

根据相同的key 取出数组中最后一个值

数组中有很多对象 , 需根据当前页面的值current 和 数组中的key对比 拿到返回值 数据结构如下 之前写法 const clickedItem routeList.find(item > item.key current) // current是当前页 用reduce遍历数组返回最后一个值 const clickedItem routeList.reduce((lastIte…