说明
- 本文将分析 shenyu 网关 dubbo、http、springCloud、sofa客户端的源码分析
shenyu 网关客户端的作用是将服务中配置的需要接入 shenyu 网关的信息注册到 shenyu-admin 服务上。它的核心逻辑是,在启动项目加载bean的时候,扫描我们服务接口上面的shenyu 客户端自定义注解信息。如果有这个注解,就将对应的path取出来,通过通过Okhttp请求 shenyu-admin 的对应客户端注册接口,注册网关接入相关信息。
dubbo客户端
客户端配置
可参考之前的 Apache ShenYu 官方examples体验之dubbo 文章,其中有具体的配置以及使用说明
源码分析
客户端将配置的信息注册到 shenyu-admin 核心源码分析:
public class AlibabaDubboServiceBeanPostProcessor implements ApplicationListener<ContextRefreshedEvent> {
public AlibabaDubboServiceBeanPostProcessor(final DubboConfig dubboConfig) {
……
//shenyu-admin dubbo注册的接口uri
url = dubboConfig.getAdminUrl() + "/shenyu-client/dubbo-register";
//通过该线程池请求 shenyu-admin的客户端注册接口
executorService = new ThreadPoolExecutor(1, 1, 0L, TimeUnit.MILLISECONDS, new LinkedBlockingQueue<>());
}
……
//客户端注册
private void handler(final ServiceBean<?> serviceBean) {
……
//获取该类的所有方法
final Method[] methods = ReflectionUtils.getUniqueDeclaredMethods(clazz);
for (Method method : methods) {
//如果存在ShenyuDubboClient注解,则向shenyu-admin注册
ShenyuDubboClient shenyuDubboClient = method.getAnnotation(ShenyuDubboClient.class);
if (Objects.nonNull(shenyuDubboClient)) {
//注册到 shenyu-admin。doRegister方法中是使用OKHttp作为客户端去请求shenyu-admin服务的
RegisterUtils.doRegister(buildJsonParams(serviceBean, shenyuDubboClient, method), url, RpcTypeEnum.DUBBO);
}
}
}
}
http客户端
客户端配置
可参考之前的 Apache ShenYu 官方examples体验之http 文章,其中有具体的配置以及使用说明
源码分析
客户端将配置的信息注册到 shenyu-admin 核心源码分析:
public class SpringMvcClientBeanPostProcessor implements BeanPostProcessor {
@Override
public Object postProcessAfterInitialization(@NonNull final Object bean, @NonNull final String beanName) throws BeansException {
//取出bean类上的注解
Controller controller = AnnotationUtils.findAnnotation(bean.getClass(), Controller.class);
RestController restController = AnnotationUtils.findAnnotation(bean.getClass(), RestController.class);
RequestMapping requestMapping = AnnotationUtils.findAnnotation(bean.getClass(), RequestMapping.class);
//是 mvc controller或Mapping类注解的才做下一步处理
if (controller != null || restController != null || requestMapping != null) {
// 判断是否有 ShenyuSpringMvcClient的注解
ShenyuSpringMvcClient clazzAnnotation = AnnotationUtils.findAnnotation(bean.getClass(), ShenyuSpringMvcClient.class);
String prePath = "";
if (Objects.nonNull(clazzAnnotation)) {
……
//将相关信息注册到 shenyu-admin 服务上
executorService.execute(() -> RegisterUtils.doRegister(buildJsonParams(clazzAnnotation, finalPrePath), url,
RpcTypeEnum.HTTP));
}
// 取出类中所有的方法
final Method[] methods = ReflectionUtils.getUniqueDeclaredMethods(bean.getClass());
for (Method method : methods) {
// 判断是否有 ShenyuSpringMvcClient的注解
ShenyuSpringMvcClient shenyuSpringMvcClient = AnnotationUtils.findAnnotation(method, ShenyuSpringMvcClient.class);
if (Objects.nonNull(shenyuSpringMvcClient)) {
String finalPrePath = prePath;
//将相关信息注册到 shenyul-admin 服务上
executorService.execute(() -> RegisterUtils.doRegister(buildJsonParams(shenyuSpringMvcClient, finalPrePath), url,
RpcTypeEnum.HTTP));
}
}
}
return bean;
}
}
springCloud客户端
客户端配置
可参考之前的 Apache ShenYu 官方examples体验之springCloud 文章,其中有具体的配置以及使用说明
客户端源码分析
客户端将配置信息注册到 shenyu-admin 核心源码与 http客户端基本一致,除了它判断接入的自定义注解是@ShenyuSpringCloudClient,不再贴源码。
sofa
客户端配置
可参考之前的 Apache ShenYu 官方examples体验之sofa 文章,其中有具体的配置以及使用说明
客户端源码分析
sofa客户端将配置的信息注册到 shenyu-admin 核心源码分析:
public class SofaServiceBeanPostProcessor implements BeanPostProcessor {
……
private void handler(final ServiceFactoryBean serviceBean) {
//获取bean的所有方法
final Method[] methods = ReflectionUtils.getUniqueDeclaredMethods(clazz);
for (Method method : methods) {
//如果包含 ShenyuSofaClient注解,则向 shenyu-admin服务注册相关配置信息
ShenyuSofaClient shenyuSofaClient = method.getAnnotation(ShenyuSofaClient.class);
if (Objects.nonNull(shenyuSofaClient)) {
RegisterUtils.doRegister(buildJsonParams(serviceBean, shenyuSofaClient, method), url, RpcTypeEnum.SOFA);
}
}
}
……
}