Api-gateway-sdk
# Api-gateway-sdk
# 1.RPC应用接口自动注册SDK
功能:实现RPC服务接口Spring启动后自动注册功能。
可以预见到后续也需要有一个SDK注册引擎(Dubbo服务Provider),启动后拿到所有RPC接口的信息,并向注册中心的RPC服务注册接口发送请求。
# SpringBoot-starter最佳实践:启动前
- 参数读取并加载
①application.yml参数:通过@ConfigurationProperties注解的属性配置类获取,并在配置类中@Enable加入Spring容器管理。
②@Annotation注解型参数:在实现BeanPostProcessor的初始化服务类中解析获取。在每个Bean的初始化后置增强方法postProcessAfterInitialization中,拦截每一个Bean(包含service,component..注解并交给spring管理的类),进行类注解和方法注解的判断,最后取出注解中的参数。
- 执行初始化方法与处理逻辑
最关键的一点,执行初始化方法处理的对象一定只能是@Bean注解的交给Spring容器管理的对象。
①BeanPostProcessor:在初始化前置后置方法实现初始化。
②ApplicationListener:通过Bean生命周期事件的发布触发监听器处理方法。
③ApplicationContextAware:容器感知扩展点,本质是执行初始化前置增强beanPostProcessorsBeforeInitialization。
④@Bean:以Bean方法的形式执行处理方法,最终返回值作为Bean交给容器管理。
# SpringBoot-starter最佳实践:启动后
- AOP切面
对切面类添加增强方法,用户调用切面AOP代理对象的方法时,触发切面处理逻辑。
# 2.EnableConfigurationProperties加载时机
ConfigurationPropertiesBeanRegistrar:找到@ConfigurationProperties注解的类,并创建对应的BeanDefinition,注册bean定义。
ConfigurationPropertiesBindingPostProcessor:首先在成员属性复制后afterPropertiesSet获取bingder。在postProcessBeforeInitialization初始化前增强方法中,通过bind方法将@ConfigurationProperties注解bean和配置文件属性绑定。
# 3.HttpUtil#post
- HttpUtil#post
Hutool工具包发送Post请求,其中入参接收一个封装了所有请求参数的Map对象。这种方式的Content-Type为application/x-www-form-urlencoded,controller可以直接使用自定义对象接收(不能用@RequestBody接收)。
- @RequestMapping(consumes="application/json",produces="")
produces用来指明controller方法返回响应的编码类型是json格式。
consumes指定处理请求的提交内容类型(Content-Type)
# 4.算力关联、接口上报、调用反馈
- 算力关联
功能:注册中心gateway-center给后台管理系统gateway-admin提供算力分配表的数据插入方法,手动将网关算力节点与RPC服务接口关联起来。
- 接口上报
功能:RPC服务gateway-sdk如果重复启动多次扫描注册接口,会因为插入重复索引键的行记录报错。此处提供一个按钮配置,当sdk启动后不会扫描所有接口方法。
@ConditionalOnproperty:类注解,用于设置是否加载当前Bean。
从application.yml文件中,读取配置文件的prefix+name值,并和havingValue的值进行比较,如果一样则Spring容器加载Bean,否则不加载当前Bean。matchIdMissing字段为true表示如果配置文件找不到该prefix+name字段(无法进行比对),那么加载当前Bean,否则不加载,相当于默认配置。
@ConditionalOnProperty(prefix = "api-gateway-sdk",name = "enabled",havingValue = "true",matchIfMissing = true)
在api-gateway-sdk的配置文件中,设置enabled为false,RPC服务启动后就不会自动装配配置类(不会扫描所有服务接口),服务接口就不会被重复注册进数据库当中。
- 调用反馈
网关算力gateway-core在Netty服务端进行handler处理逻辑时,无论泛化调用成功与否,都需要在封装的HTTP响应对象的结果中,加入当前通信的算力节点IP节点信息,便于排查bug。
core-ProtocolDataHandler#node:从配置对象中,取出当前Netty通信的服务端算力节点IP与端口。
core-GatewayResultMessage:添加node字符串作为成员属性,保存算力节点的IP信息。