Apache ShenYu 网关 client 源码分析

说明

  • 本文将分析 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);
            }
        }
    }
    ……
}

发表评论

您的电子邮箱地址不会被公开。 必填项已用*标注