当前位置: 首页 > news >正文

开封市建设局网站哪个网站可以在线做高考题

开封市建设局网站,哪个网站可以在线做高考题,做创新方法工作网站,门户网站系统建设清单上篇我们介绍了ServiceBean初始化和依赖注入过程#xff0c;地址如下 Dubbo源码-Provider服务端ServiceBean初始化和属性注入-CSDN博客 本文主要针Dubbo服务端服务Export过程#xff0c;从dubbo源码角度进行解析。 Dubbo 服务端暴露细节流程比较长#xff0c;也是面试过程中…上篇我们介绍了ServiceBean初始化和依赖注入过程地址如下 Dubbo源码-Provider服务端ServiceBean初始化和属性注入-CSDN博客 本文主要针Dubbo服务端服务Export过程从dubbo源码角度进行解析。 Dubbo 服务端暴露细节流程比较长也是面试过程中比较常问的技术问题大家可以好好仔细读一下本文。有疑问欢迎留言。 接着说明读Dubbo源码最好是先对Spring源码有一定的了解。如果大家需要我也可以针对Spring框架做一系列源码的解读专栏。 不过不用担心如果需要Spring的源码知识文章中也会进行Spring源码铺垫介绍的。 如果内容中有没描述清楚的或者大家在阅读源代码有疑问的欢迎留言看到就会及时回复。 为了更清楚的分析解释源码源代码中部分不重要的内容可能会删减保留重要内容方便大家理解。 主要内容 Dubbo中Provider服务Export源码解析 服务Export源码解析 我们都知道服务端在启动的时候会将自己的服务地址注册到注册中心那么具体的过程和细节是怎么样的呢接下来我们从大概流程和细节流程以及源代码角度进行说明和分析。 为什么有流程总结这一部分因为好多同学为了应付面试或者觉得细节流程太繁琐或者复杂只想弄清楚相对简练的过程。所以对服务暴露的细节流程做了一个相对笼统的总结方便大家理解大概过程以及应对面试。 Spring知识铺垫 ServiceBean继承ApplicationListenerContextRefreshedEvent通过监听事件。实现服务发布Spring容器启动时registerListeners收集上下文中即成继承ApplicationListener的类 Spring容器启动前完成之后广播事件finishRefresh-publishEvent(new ContextRefreshedEvent(this)) Spring启动之后触发ServiceBean的onApplicationEvent()事件调用export()完成服务暴露 流程总结 服务暴露的核心流程在RegistryProtocol.export中概括如下 ServiceBean继承ApplicationListener。Spring启动后会触发onApplicationEvent事件ListURL registryURLs loadRegistries(true)。加载所有Registry将zookeeper协议URL变为registry协议URL。多注册中心遍历Protocols.多协议收集配置信息到map,把map转化为Dubbo协议URL。遍历registryURLs.将DubboUrl地址绑定到registryUrl属性中。key为export.protocol.export(wrapperInvoker)开始Registry协议URL流转。protocol包装类调用连。Protocol调用链QosProtocolWrapper-ProtocolFilterWrapper-ProtocolListenerWrapper-RegistryProtocolQosProtocolWrapper.export():开启QosServer。就是一个Netty服务端(服务统计功能如服务列表服务在线状态等)RegistryProtocol.export():protocol.export(invokerDelegete):开始Dubbo协议流转doLocalExport(originInvoker):启动netty服务端。Protocol调用链QosProtocolWrapper-ProtocolFilterWrapper-ProtocolListenerWrapper-DubboProtocol ProtocolFilterWrapper根据Filter生成Invoker调用链DubboProtocol:启动NettyServer根据filter构建invoker执行链启动nettyserver,构建handler链回到RegistryProtocol,完成服务注册register(registryUrl, registeredProviderUrl)dubbo协议URL写入到/dubbo/com.*.*/providers/节点下回到RegistryProtocol:对configurators节点注册事件监听:.subscribe(overrideSubscribeUrl, overrideSubscribeListener); 如果还想再简练一点 启动NettyServer.注册服务地址到Providers节点下。订阅configurators节点事件 流程细节 说明细节流程讲述的可能有点过分细致了几乎细致到源码解析的每一行。包括属性收集/装配/检测/校验等细节也进行了说明。其实重点关注收集后服务暴露开始的地方。即重点关注红色标注的部分。 核心逻辑和源码 主要关注源码类RegistryProtocol.export方法该方法中实现了服务发布流程, 调用DubboProtocol.export启动NettyServer调用zkRegistry.registry().完成服务的注册。创建providers节点子节点写入dubbo服务地址调用zkRegistry.subscribe.完成事件订阅。创建configurators节点创建监听事件首次notify节点事件。这个监听事件其实就是DubboAdmin或者Api方式动态修改服务配置的实现原理。 详细过程 细节其实已经从源代码级别进行分析了看起来可能比较累。其实也可以跳过前面直接关注红色部分。如果觉得繁琐也可以直接跳过看源码部分 ServiceBean.export()完成服务暴露具体细节流程 设置配置类属性 .checkoutDefault() .创建ProviderConfig(EnableDubboConfig没有创建ProviderConfig的话) .未配置Provider时则创建provider.appendProperties()并设置provider对象属性,遍历set方法。  优先从环境变量取属性System.getProperty()从dubbo.property文件中获取.绑定其他配置类属性校验配置信息application,registry,Protocol,mock,stub暴露服务 .收集Registry协议loadRegistries()根据配置Registies获取注册的url。获取注册协议 遍历所有registries.封装属性到map中(applicaiton,registryConfig等)。 appendParameters(map, application);生成URL。UrlUtils.parseURLs(address, map)-loadRegistries()根据registry中的Adress地址和map中的key,value。生成url .zookeeper://192.168.67.139:2184/com.alibaba.dubbo.registry.RegistryService?applicationdubbo_providerdubbo2.0.2ownerworldpid13218timestamp1709463351616URL设registry属性,把协议头换成从zookeeper改为registry registry://192.168.67.139:2184/com.alibaba.dubbo.registry.RegistryService?applicationdubbo_providerdubbo2.0.2ownerworldpid13882registryzookeepertimestamp1709465346174返回URL。上面的配置属性都会通过注册中心传递给消费者。收集Dubbo协议以及暴露Registry和dubbo协议doExportUrlsFor1Protocol(protocolConfig, registryURLs)完成服务暴露 .收集配置类到map中application/module/provider/protocolConfig/serviceconfig把methodsConfig/ArgumentConfig配置同样设置到map中.提前生成接口类对应的代理类Wrapper.getWrapper(interfaceClass).获取接口包含的所有方法设置key为methods到map中置token到map获取host:如果Protocol和Privoder配置类都没有配置IP的话就会调用InetAddress.getLocalHost().getHostAddress();获取主机IP。如果利用容器部署有可能获取到内网IP导致消费端掉不通。.获取端口:如果Protocol和Privoder配置类都没有配置端口的话通过SPI机制获取Protocol对应的默认端口。DubboProtocol把map转成URLDUBBO协议 dubbo://192.168.28.25:29015/com.xiangxue.jack.service.UserService?anyhosttrueapplicationdubbo_providerbean.namecom.xiangxue.jack.service.UserServicebind.ip192.168.28.25bind.port29015default.timeout5000dubbo2.0.2genericfalseinterfacecom.xiangxue.jack.service.UserServicemethodsdoKill,queryUserownerworldpid16437revision0.0.1-SNAPSHOTsideprovidertimeout2000timestamp1709472937360遍历注册地址远程调用暴露服务调用关系AbstractProxyInvoker-wrapper-ServiceClass 遍历第一步loadRegistries()中返回的注册协议地址加载URL 监控url. monitorUrl loadMonitor(registryURL)dubbo协议地址URL绑定monitor属性地址获取到invoker对象 将Dubbo协议URL地址添加到registry协议URL属性中。key为export registryURL.addParameterAndEncoded(Constants.EXPORT_KEY, url.toFullString())通过SPI获取代理工厂。因为没有Adaptive注解。通过javassist动态生成一个代理工厂ProxyFactory$Adaptive。最终获取到StubProxyFactoryWrapper持有JavassistProxyFactory的代理工厂调用代理工厂JavassistProxyFactory.getInvoker返回AbstractProxyInvoker。持有被代理类【ServiceImpl】,接口类URL(Registry) 生成代理类Wrapper.getWrapper对需要调用的目标类的包装类通过javassist技术动态生成的生成InvokerAbstractProxyInvoker是Dubbo最底层的Invoker对象只有通过他才能调用provider端的目标Service服务方法。持有被代理类接口类型RegisterURL调用关系AbstractProxyInvoker-wrapper-ServiceClass包装Invoker对象为DelegateProviderMetaDataInvoker持有Invoker对象和ServiceConfig对象 暴露远程服务registry协议的exportprotocol.export(wrapperInvoker)。【前面都是数据准备过程接下来才是真正的服务暴露流程】 SPI方式获取Protocol。最终获取到包装类持有关系QosProtocolWrapper-ProtocolFilterWrapper-ProtocolListenerWrapper-RegistryProtocol开启QosServer。QosProtocolWrapper.export().就是一个Netty服务端(服务统计功能如服务列表服务在线状态等)完成服务注册regist.export():RegistryProtocol.export() 启动ServerdoLocalExport走到DubboProtocl中启动NettyServer .创建InvokerDelegete持有原始Invoker和Dubbo协议URL .服务发布protocol.export(invokerDelegete)。protocol是SPI动态生成的Protocol$AdaptiveinvokerDelegete对应的URL为Dubbo,最终会掉到DubboProtocol。调用关系QosProtocolWrapper-ProtocolFilterWrapper-ProtocolListenerWrapper-DubboProtocol 构建Invoker调用链ProtocolFilterWrapper.class。SPI获取所有FiltersProtocolFilterWrapper.buildInvokerChain通过next指针传递 说明最终执行链的关系Filter1-》Filter2-〉invokerDelegete-AbstractProxyInvoker-wrapper-ServiceClassProtocolListenerWrapper.export DubboProtocol.expot():启动Server 获取String url获取key:服务名称端口创建DubboExporter持有Invoker执行链和key和exporterMap。每个服务都对应一个DubboExporter构建映射关系MapString, Exporter? exporterMap。openserver():启动服务每一个Service修饰的类都会进来但是同一个IP端口只会启动启动一个netty服务端后面重点讲。 获取Address:ip:port从serverMap获取ExchangeServer。如果获取不到则创建createServer(url)启动netty服务进行双端通信返回ExchangeServer对象。一个主机只会启动一次NettyServer。源码后面重点讲。总结DubboProtocol.expot()1.完成了Netty服务端的启动2.建立handler的链条关系服务发布监听包装类其实就是提供一个扩展服务发布后给一个通知。ListenerExporterWrapper.持有DubboExporter和ListExporterListener。.包装ExporterChangeableWrapper类持有ListenerExporterWrapper和originInvoker【registry协议】.registryUrl getRegistryUrl(originInvoker):获取注册协议zookeeper协议Url .zookeeper://192.168.67.139:2184/com.alibaba.dubbo.registry.RegistryService?applicationdubbo_providerdubbo2.0.2exportdubbo%3A%2F%2F192.168.3.6%3A20880%2Fcom.xiangxue.jack.async.AsyncService%3Fanyhost%3Dtrue%26application%3Ddubbo_provider%26bean.name%3DServiceBean%3Acom.xiangxue.jack.async.AsyncService%26bind.ip%3D192.168.3.6%26bind.port%3D20880%26dubbo%3D2.0.2%26generic%3Dfalse%26interface%3Dcom.xiangxue.jack.async.AsyncService%26methods%3DasynctoDo%26owner%3Dworld%26pid%3D86931%26revision%3D0.0.1-SNAPSHOT%26side%3Dprovider%26timeout%3D123456%26timestamp%3D1710227953244ownerworldpid86931timestamp1710227939570 获取注册类ZookeeperRegistry。getRegistry(originInvoker);.registeredProviderUrl getRegisteredProviderUrl(originInvoker):获提供者地址写入接口下provider节点 dubbo://192.168.3.6:20880/com.xiangxue.jack.async.AsyncService?anyhosttrueapplicationdubbo_providerbean.nameServiceBean:com.xiangxue.jack.async.AsyncServicedubbo2.0.2genericfalseinterfacecom.xiangxue.jack.async.AsyncServicemethodsasynctoDoownerworldpid86931revision0.0.1-SNAPSHOTsideprovidertimeout123456timestamp1710227953244.建立服务名称和ProviderInvokerWrapper的映射关系[缓存providerInvokers].ProviderInvokerWrapper持有originInvoker, registryUrl, registeredProviderUrl.完成服务注册register(registryUrl, registeredProviderUrl)。把dubbo协议地址注册到Provider节点下其实就是创建服务节点providers节点和dubbo服务地址临时节点; SPI获取ZookeeperRegistryFacotry创建Zookeeper,创建zk客户端注册断线重连监听 .ZookeeperRegistry.register.缓存注册过的URL:registered .创建节点名称doRegistry(),创建provider持久化节点和dubbo服务地址的临时节点注册监听事件.[以下逻辑是对configurators节点注册事件监听如果修改了属性则会覆盖客户端的该节点的数据].overrideSubscribeUrlgetSubscribedOverrideUrl(registeredProviderUrl)。获取override的provider协议。后面映射关系可以将provider协议Url理解为接口。subscribednotified两个权局缓存 .provider://192.168.3.6:20880/com.xiangxue.jack.async.AsyncService?anyhosttrueapplicationdubbo_providerbean.nameServiceBean:com.xiangxue.jack.async.AsyncServicecategoryconfiguratorscheckfalsedubbo2.0.2genericfalseinterfacecom.xiangxue.jack.async.AsyncServicemethodsasynctoDoownerworldpid96966revision0.0.1-SNAPSHOTsideprovidertimeout123456timestamp1710257665285.注册监听事件registry.subscribe(overrideSubscribeUrl, overrideSubscribeListener)订阅configurators节点下数据变更事件,path:/dubbo/com.a.b.service/configurators。  .全局变量缓存subscribed new ConcurrentHashMapURL, SetNotifyListener()缓存overrideSubscribeUrl和NotifyListener建立overrideListener和 ChildListener的映射创建path/dubbo/com.a.b/configurators注册监听事件 建立dubbo的ChildListener事件类和Curator的事件类的映射事件关系NotifyListener-ChildListener-CuratorWatch当发生overrite时zk监听器调用curatorWatch的process方法最终掉到NotifyListener方法实现动态修改配置参数功能(下节重点将)创建Empty协议 empty://192.168.3.6:20880/com.xiangxue.jack.async.AsyncService?anyhosttrueapplicationdubbo_providerbean.nameServiceBean:com.xiangxue.jack.async.AsyncServicecategoryconfiguratorscheckfalsedubbo2.0.2genericfalseinterfacecom.xiangxue.jack.async.AsyncServicemethodsasynctoDoownerworldpid26895revision0.0.1-SNAPSHOTsideprovidertimeout123456timestamp1710430398847notify(url, listener, urls);通知Empty协议或者overide协议。 为QOS统计数据做准备.看服务列表服务在线状态publishExportEvent发布服务暴露事件ServiceBeanExportedEvent即发布一个服务已经暴露的通知。消费端会通过ApplicationListener关注此事件类型 源码分析 由于provider发布流程代码较长且流程中其中属性收集校验等逻辑不是重点。以下我们主要介绍服务发布流程中的核心代码。即RegistryProtocol.export() 核心流程RegistryProtocol.export().主要做了三件事。启动NettryServer,注册dubbo服务订阅configurators节点事件 #RegistryProtocol.export public T ExporterT export(final InvokerT originInvoker) throws RpcException {//export invoker//这里会启动server走到DubboProtocol中去启动serverfinal ExporterChangeableWrapperT exporter doLocalExport(originInvoker);//获取注册协议URL registryUrl getRegistryUrl(originInvoker);//registry providerfinal Registry registry getRegistry(originInvoker);final URL registeredProviderUrl getRegisteredProviderUrl(originInvoker);//to judge to delay publish whether or notboolean register registeredProviderUrl.getParameter(register, true);//建立服务名称和invoke的映射关系ProviderConsumerRegTable.registerProvider(originInvoker, registryUrl, registeredProviderUrl);if (register) {//这里完成了服务注册和事件监听register(registryUrl, registeredProviderUrl);//设置是否注册标识ProviderConsumerRegTable.getProviderWrapper(originInvoker).setReg(true);}//以下逻辑是对configurators节点注册事件监听如果修改了属性则会覆盖客户端的该节点的数据final URL overrideSubscribeUrl getSubscribedOverrideUrl(registeredProviderUrl);//zookeeper事件触发后最终回调的listenerfinal OverrideListener overrideSubscribeListener new OverrideListener(overrideSubscribeUrl, originInvoker);overrideListeners.put(overrideSubscribeUrl, overrideSubscribeListener);//注册事件registry.subscribe(overrideSubscribeUrl, overrideSubscribeListener);//Ensure that a new exporter instance is returned every time exportreturn new DestroyableExporterT(exporter, originInvoker, overrideSubscribeUrl, registeredProviderUrl);} DubboProtocol.export。启动nettyServer. #RegistryProtocol private T ExporterChangeableWrapperT doLocalExport(final InvokerT originInvoker) {String key getCacheKey(originInvoker);ExporterChangeableWrapperT exporter (ExporterChangeableWrapperT) bounds.get(key);if (exporter null) {synchronized (bounds) {exporter (ExporterChangeableWrapperT) bounds.get(key);if (exporter null) {//真正invoker的静态代理final Invoker? invokerDelegete new InvokerDelegeteT(originInvoker, getProviderUrl(originInvoker));//这里的协议头是dubbo了,这里会调用DubboProtocol.export()exporter new ExporterChangeableWrapperT((ExporterT) protocol.export(invokerDelegete), originInvoker);bounds.put(key, exporter);}}}return exporter;} #DubboProtocolpublic T ExporterT export(InvokerT invoker) throws RpcException {URL url invoker.getUrl();// export service.String key serviceKey(url);DubboExporterT exporter new DubboExporterT(invoker, key, exporterMap);exporterMap.put(key, exporter);//export an stub service for dispatching eventBoolean isStubSupportEvent url.getParameter(Constants.STUB_EVENT_KEY, Constants.DEFAULT_STUB_EVENT);Boolean isCallbackservice url.getParameter(Constants.IS_CALLBACK_SERVICE, false);if (isStubSupportEvent !isCallbackservice) {String stubServiceMethods url.getParameter(Constants.STUB_EVENT_METHODS_KEY);if (stubServiceMethods null || stubServiceMethods.length() 0) {if (logger.isWarnEnabled()) {logger.warn(new IllegalStateException(consumer [ url.getParameter(Constants.INTERFACE_KEY) ], has set stubproxy support event ,but no stub methods founded.));}} else {stubServiceMethodsMap.put(url.getServiceKey(), stubServiceMethods);}}//启动server核心代码openServer(url);optimizeSerialization(url);return exporter;}private void openServer(URL url) {// find server.//这个方法会根据Service注解的类有多少而近来多次但是同一个ip的netty服务端只会创建一次String key url.getAddress();//client can export a service whichs only for server to invokeboolean isServer url.getParameter(Constants.IS_SERVER_KEY, true);if (isServer) {ExchangeServer server serverMap.get(key);if (server null) {//开启serverserverMap.put(key, createServer(url));} else {// server supports reset, use together with overrideserver.reset(url);}}} 总结上面内容中每个从业务流程和源码角度进行了详细分析如果大家有疑问或者对文章排版任何方面有建议都可以留言评论看到都会及时回复大家。 知识总结分享不易全文手敲欢迎大家关注点赞评论收藏。
http://www.w-s-a.com/news/57130/

相关文章:

  • 如何修改网站title建设网站只能是公司
  • 网站推广效果怎么样建设工程公司组织架构图
  • 成都制作网站价格表网站安全证书过期怎么办
  • 高校图书馆网站的建设方案湖南常德市
  • 房地产怎么做网站推广wordpress插件汉化下载
  • 一般pr做视频过程那个网站有无锡网络公司平台
  • 安徽网站推广系统网站根目录权限设置
  • 班级网站建设需求智慧校园登录入口
  • asp.net网站发布到虚拟主机电商设计网站哪个好
  • 做的网站怎么转成网址链接企业为什么要找会计
  • 关于建设网站的情况说明书文化建设方面的建议
  • 订票网站开发公司大通证券手机版下载官方网站下载
  • 网店美工的意义与发展佛山推广seo排名
  • 网站在建设中模板自助云商城
  • 珠海网站设计建建建设网站公司网站
  • 广州高端网站制作公司哪家好网页制作公司 软件
  • 最快做网站的语言百度站长反馈
  • 简单网站设计价格手机网站技巧
  • 什么颜色做网站显的大气网站建设的含盖哪方面
  • 没网站怎么做二维码扫描连接济南做网站推广哪家好
  • 台州建设规划局网站搞外贸一般是干什么的
  • 怎么提高自己网站的知名度电子商务是建网站
  • 官方查企业的网站办公用品网站建设策划书
  • 微信网站搭建哪家好网站中转页
  • 阿里巴巴网站开发是谁长沙自助模板建站
  • 阿里云网站方案建设书网络公司运营是干啥的
  • 南通seo网站排名优化nginx wordpress rewrite
  • 网站做成软件做内部网站费用
  • 浙江企业网站建设网站域名有了 网站如何建设
  • 学编程哪个机构有权威德州做网站优化