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

西部数码网站打不开wordpress 社区模版

西部数码网站打不开,wordpress 社区模版,虚拟主机对网站seo有哪些影响,山东做公司网站前面#xff0c;我们已经知道#xff0c;基于spring这个解析入口#xff0c;到发布服务的过程#xff0c;接着基于DubboProtocol去发布#xff0c;最终调用Netty的api创建了一个NettyServer。那么继续沿着RegistryProtocol.export这个方法#xff0c;来看看注册服务的代码…前面我们已经知道基于spring这个解析入口到发布服务的过程接着基于DubboProtocol去发布最终调用Netty的api创建了一个NettyServer。那么继续沿着RegistryProtocol.export这个方法来看看注册服务的代码RegistryProtocol.exportpublic Exporter export(final Invoker originInvoker) throws RpcException {//export invokerfinal ExporterChangeableWrapper exporter doLocalExport(originInvoker); //发布本地服务//registry providerfinal Registry registry getRegistry(originInvoker);final URL registedProviderUrl getRegistedProviderUrl(originInvoker);registry.register(registedProviderUrl);// 订阅override数据// FIXME 提供者订阅时会影响同一JVM即暴露服务又引用同一服务的的场景因为subscribed以服务名为缓存的key导致订阅信息覆盖。final URL overrideSubscribeUrl getSubscribedOverrideUrl(registedProviderUrl);final OverrideListener overrideSubscribeListener new OverrideListener(overrideSubscribeUrl);overrideListeners.put(overrideSubscribeUrl, overrideSubscribeListener);registry.subscribe(overrideSubscribeUrl, overrideSubscribeListener);//保证每次export都返回一个新的exporter实例return new Exporter() {public Invoker getInvoker() {return exporter.getInvoker();}public void unexport() {try {exporter.unexport();} catch (Throwable t) {logger.warn(t.getMessage(), t);}try {registry.unregister(registedProviderUrl);} catch (Throwable t) {logger.warn(t.getMessage(), t);}try {overrideListeners.remove(overrideSubscribeUrl);registry.unsubscribe(overrideSubscribeUrl, overrideSubscribeListener);} catch (Throwable t) {logger.warn(t.getMessage(), t);}}};}getRegistry这个方法是invoker的地址获取registry实例/*** 根据invoker的地址获取registry实例* param originInvoker* return*/private Registry getRegistry(final Invoker originInvoker){URL registryUrl originInvoker.getUrl(); //获得registry://192.168.11.1562181的协议地址if (Constants.REGISTRY_PROTOCOL.equals(registryUrl.getProtocol())) {//得到zookeeper的协议地址String protocol registryUrl.getParameter(Constants.REGISTRY_KEY, Constants.DEFAULT_DIRECTORY);//registryUrl就会变成了zookeeper://192.168.11.156registryUrl registryUrl.setProtocol(protocol).removeParameter(Constants.REGISTRY_KEY);}//registryFactory是什么return registryFactory.getRegistry(registryUrl);}registryFactory.getRegistry这段代码很明显了通过前面这段代码的分析其实就是把registry的协议头改成服务提供者配置的协议地址也就是我们配置的然后registryFactory.getRegistry的目的就是通过协议地址匹配到对应的注册中心。那registryFactory是一个什么样的对象呢我们找一下这个代码的定义private RegistryFactory registryFactory;public void setRegistryFactory(RegistryFactory registryFactory) {this.registryFactory registryFactory;}这个代码有点眼熟再来看看RegistryFactory这个类的定义我猜想一定是一个扩展点不信咱们看并且大家还要注意这里面的一个方法上有一个Adaptive的注解说明什么 这个是一个自适应扩展点。按照我们之前看过代码自适应扩展点加在方法层面上表示会动态生成一个自适应的适配器。所以这个自适应适配器应该是RegistryFactory$AdaptiveSPI(dubbo)public interface RegistryFactory {/*** 连接注册中心.** 连接注册中心需处理契约* 1. 当设置checkfalse时表示不检查连接否则在连接不上时抛出异常。* 2. 支持URL上的username:password权限认证。* 3. 支持backup10.20.153.10备选注册中心集群地址。* 4. 支持fileregistry.cache本地磁盘文件缓存。* 5. 支持timeout1000请求超时设置。* 6. 支持session60000会话超时或过期设置。** param url 注册中心地址不允许为空* return 注册中心引用总不返回空*/Adaptive({protocol})Registry getRegistry(URL url);}RegistryFactory$Adaptive我们拿到这个动态生成的自适应扩展点看看这段代码里面的实现从url中拿到协议头信息这个时候的协议头是zookeeper://通过ExtensionLoader.getExtensionLoader(RegistryFactory.class).getExtension(“zookeeper”)去获得一个指定的扩展点而这个扩展点的配置在dubbo-registry-zookeeper/resources/META-INF/dubbo/internal/com.alibaba.dubbo.registry.RegistryFactory。得到一个ZookeeperRegistryFactorypublic class RegistryFactory$Adaptive implements com.alibaba.dubbo.registry.RegistryFactory {public com.alibaba.dubbo.registry.Registry getRegistry(com.alibaba.dubbo.common.URL arg0) {if (arg0 null) throw new IllegalArgumentException(url null);com.alibaba.dubbo.common.URL url arg0;String extName (url.getProtocol() null ? dubbo : url.getProtocol());if (extName null)throw new IllegalStateException(Fail to get extension(com.alibaba.dubbo.registry.RegistryFactory) name from url( url.toString() ) use keys([protocol]));com.alibaba.dubbo.registry.RegistryFactory extension (com.alibaba.dubbo.registry.RegistryFactory)ExtensionLoader.getExtensionLoader(com.alibaba.dubbo.registry.RegistryFactory.class).getExtension(extName);return extension.getRegistry(arg0);}}ZookeeperRegistryFactory这个方法中并没有getRegistry方法而是在父类AbstractRegistryFactory从缓存REGISTRIES中根据key获得对应的Registry如果不存在则创建Registrypublic Registry getRegistry(URL url) {url url.setPath(RegistryService.class.getName()).addParameter(Constants.INTERFACE_KEY, RegistryService.class.getName()).removeParameters(Constants.EXPORT_KEY, Constants.REFER_KEY);String key url.toServiceString();// 锁定注册中心获取过程保证注册中心单一实例LOCK.lock();try {Registry registry REGISTRIES.get(key);if (registry ! null) {return registry;}registry createRegistry(url);if (registry null) {throw new IllegalStateException(Can not create registry url);}REGISTRIES.put(key, registry);return registry;} finally {// 释放锁LOCK.unlock();}}createRegistry创建一个注册中心这个是一个抽象方法具体的实现在对应的子类实例中实现的在ZookeeperRegistryFactory中public Registry createRegistry(URL url) {return new ZookeeperRegistry(url, zookeeperTransporter);}通过zkClient获得一个zookeeper的连接实例public ZookeeperRegistry(URL url, ZookeeperTransporter zookeeperTransporter) {super(url);if (url.isAnyHost()) {throw new IllegalStateException(registry address null);}String group url.getParameter(Constants.GROUP_KEY, DEFAULT_ROOT);if (! group.startsWith(Constants.PATH_SEPARATOR)) {group Constants.PATH_SEPARATOR group;}this.root group; //设置根节点zkClient zookeeperTransporter.connect(url);//建立连接zkClient.addStateListener(new StateListener() {public void stateChanged(int state) {if (state RECONNECTED) {try {recover();} catch (Exception e) {logger.error(e.getMessage(), e);}}}});}代码分析到这里我们对于getRegistry得出了一个结论根据当前注册中心的配置信息获得一个匹配的注册中心也就是ZookeeperRegistryregistry.register(registedProviderUrl);继续往下分析会调用registry.register去将dubbo://的协议地址注册到zookeeper上这个方法会调用FailbackRegistry类中的register. 为什么呢因为ZookeeperRegistry这个类中并没有register这个方法但是他的父类FailbackRegistry中存在register方法而这个类又重写了AbstractRegistry类中的register方法。所以我们可以直接定位大FailbackRegistry这个类中的register方法中FailbackRegistry.registerFailbackRegistry从名字上来看是一个失败重试机制调用父类的register方法讲当前url添加到缓存集合中调用doRegister方法这个方法很明显是一个抽象方法会由ZookeeperRegistry子类实现。Overridepublic void register(URL url) {super.register(url);failedRegistered.remove(url);failedUnregistered.remove(url);try {// 向服务器端发送注册请求doRegister(url);} catch (Exception e) {Throwable t e;// 如果开启了启动时检测则直接抛出异常boolean check getUrl().getParameter(Constants.CHECK_KEY, true) url.getParameter(Constants.CHECK_KEY, true) ! Constants.CONSUMER_PROTOCOL.equals(url.getProtocol());boolean skipFailback t instanceof SkipFailbackWrapperException;if (check || skipFailback) {if(skipFailback) {t t.getCause();}throw new IllegalStateException(Failed to register url to registry getUrl().getAddress() , cause: t.getMessage(), t);} else {logger.error(Failed to register url , waiting for retry, cause: t.getMessage(), t);}// 将失败的注册请求记录到失败列表定时重试failedRegistered.add(url);}}ZookeeperRegistry.doRegister终于找到你了调用zkclient.create在zookeeper中创建一个节点。protected void doRegister(URL url) {try {zkClient.create(toUrlPath(url), url.getParameter(Constants.DYNAMIC_KEY, true));} catch (Throwable e) {throw new RpcException(Failed to register url to zookeeper getUrl() , cause: e.getMessage(), e);}}RegistryProtocol.export 这个方法中后续的代码就不用再分析了。就是去对服务提供端去注册一个zookeeper监听当监听发生变化的时候服务端做相应的处理。在register 方法里面调用subscribe 方法订阅注册中心变化/*** 订阅符合条件的已注册数据当有注册数据变更时自动推送.** 订阅需处理契约* 1. 当URL设置了checkfalse时订阅失败后不报错在后台定时重试。* 2. 当URL设置了categoryrouters只通知指定分类的数据多个分类用逗号分隔并允许星号通配表示订阅所有分类数据。* 3. 允许以interface,group,version,classifier作为条件查询如interfacecom.alibaba.foo.BarServiceversion1.0.0* 4. 并且查询条件允许星号通配订阅所有接口的所有分组的所有版本或interface*group*version*classifier** 5. 当注册中心重启网络抖动需自动恢复订阅请求。* 6. 允许URI相同但参数不同的URL并存不能覆盖。* 7. 必须阻塞订阅过程等第一次通知完后再返回。** param url 订阅条件不允许为空如consumer://10.20.153.10/com.alibaba.foo.BarService?version1.0.0applicationkylin* param listener 变更事件监听器不允许为空*/void subscribe(URL url, NotifyListener listener);subscribe -doSubscribe -notify -protected void notify(URL url, NotifyListener listener, List urls) {if (url null) {throw new IllegalArgumentException(notify url null);}if (listener null) {throw new IllegalArgumentException(notify listener null);}if ((urls null || urls.size() 0) ! Constants.ANY_VALUE.equals(url.getServiceInterface())) {logger.warn(Ignore empty notify urls for subscribe url url);return;}if (logger.isInfoEnabled()) {logger.info(Notify urls for subscribe url url , urls: urls);}Map result new HashMap();for (URL u : urls) {if (UrlUtils.isMatch(url, u)) {String category u.getParameter(Constants.CATEGORY_KEY, Constants.DEFAULT_CATEGORY);List categoryList result.get(category);if (categoryList null) {categoryList new ArrayList();result.put(category, categoryList);}categoryList.add(u);}}if (result.size() 0) {return;}Map categoryNotified notified.get(url);if (categoryNotified null) {notified.putIfAbsent(url, new ConcurrentHashMap());categoryNotified notified.get(url);}// 第一次主动调用 notify// 对 /router /providers /configerations 路径下的变更 进行notify//后续(zookeeper watcher 机制)for (Map.Entry entry : result.entrySet()) {String category entry.getKey();List categoryList entry.getValue();categoryNotified.put(category, categoryList);saveProperties(url);listener.notify(categoryList);}}
http://wiki.neutronadmin.com/news/73979/

相关文章:

  • 综合门户网站是什么意思天猫网站建设的目标
  • wordpress 双侧边栏常见网站性能优化手段
  • 小门户网站模版营销型品牌网站建设
  • 爱站网使用的是什么网站天猫建设网站的理由
  • wap网站 链接微信公司邮箱号
  • 做网站的是什么工程师跨境支付互联互通
  • 做软装设计找图有什么好的网站沃尔玛官方网站查余额
  • 建设公司营销网站网站建设合同付款约定
  • 如何让网站关键词搜录网站建设公司软文
  • 娄底网站建设查域名注册人
  • 嘉禾县网站建设推广公司功能型类的网站
  • 江苏网站建设公司哪家好怎么推广游戏叫别人玩
  • 乐山建设企业网站网站建设制作软件
  • 做动态的网站软文是什么样子的
  • 在线网站搭建系统呼市网页设计培训
  • 卫浴毛巾架网站建设福建住房和建设网站密码忘记
  • 国内设计大神网站电商网页图片设计
  • wordpress预约订单插件河南seo推广平台
  • 自己做照片书的网站社交电商
  • 深圳网站建设李天亮网站制作 商务
  • it项目网站开发的需求文档电商第三方平台有哪些
  • wordpress教育网站宣传型电子商务网站
  • 学校网站前置审批专业创业服务平台网站建设需求
  • 网络营销怎么做网站有哪些网站是可以接单做任务的
  • 智能家居网站建设方案有域名了建立免费网站
  • .net 网站开发框架重庆璧山新闻最新消息
  • 免费外贸网站制作家装企业网站系统下载
  • dede 网站内页标题修改石家庄做商城网站的公司
  • 网站建设需要的语言满版型网站有哪些
  • 站长工具域名解析温州英文网站建设