• 发布配置分析


    1.发布配置

    2.controller接口

    @PreAuthorize(value = "@permissionValidator.hasReleaseNamespacePermission(#appId, #namespaceName, #env)")
      @PostMapping(value = "/apps/{appId}/envs/{env}/clusters/{clusterName}/namespaces/{namespaceName}/releases")
      public ReleaseDTO createRelease(@PathVariable String appId,
                                      @PathVariable String env, @PathVariable String clusterName,
                                      @PathVariable String namespaceName, @RequestBody NamespaceReleaseModel model) {
        model.setAppId(appId);
        model.setEnv(env);
        model.setClusterName(clusterName);
        model.setNamespaceName(namespaceName);
    
        if (model.isEmergencyPublish() && !portalConfig.isEmergencyPublishAllowed(Env.valueOf(env))) {
          throw new BadRequestException(String.format("Env: %s is not supported emergency publish now", env));
        }
        // 3.release服务执行publish方法
        ReleaseDTO createdRelease = releaseService.publish(model);
    
        ConfigPublishEvent event = ConfigPublishEvent.instance();
        event.withAppId(appId)
            .withCluster(clusterName)
            .withNamespace(namespaceName)
            .withReleaseId(createdRelease.getId())
            .setNormalPublishEvent(true)
            .setEnv(Env.valueOf(env));
        // 4.发布事件
        publisher.publishEvent(event);
    
        return createdRelease;
      }
    

    3.releaseService.publish方法

    public ReleaseDTO publish(NamespaceReleaseModel model) {
        Env env = model.getEnv();
        boolean isEmergencyPublish = model.isEmergencyPublish();
        String appId = model.getAppId();
        String clusterName = model.getClusterName();
        String namespaceName = model.getNamespaceName();
        String releaseBy = StringUtils.isEmpty(model.getReleasedBy()) ?
                           userInfoHolder.getUser().getUserId() : model.getReleasedBy();
    
        ReleaseDTO releaseDTO = releaseAPI.createRelease(appId, env, clusterName, namespaceName,
                                                         model.getReleaseTitle(), model.getReleaseComment(),
                                                         releaseBy, isEmergencyPublish);
    
        Tracer.logEvent(TracerEventType.RELEASE_NAMESPACE,
                        String.format("%s+%s+%s+%s", appId, env, clusterName, namespaceName));
    
        return releaseDTO;
      }
    

    3.1 releaseAPI.createRelease创建release

    public ReleaseDTO createRelease(String appId, Env env, String clusterName, String namespace,
            String releaseName, String releaseComment, String operator,
            boolean isEmergencyPublish) {
          HttpHeaders headers = new HttpHeaders();
          headers.setContentType(MediaType.parseMediaType(MediaType.APPLICATION_FORM_URLENCODED_VALUE + ";charset=UTF-8"));
          MultiValueMap<String, String> parameters = new LinkedMultiValueMap<>();
          parameters.add("name", releaseName);
          parameters.add("comment", releaseComment);
          parameters.add("operator", operator);
          parameters.add("isEmergencyPublish", String.valueOf(isEmergencyPublish));
          HttpEntity<MultiValueMap<String, String>> entity =
              new HttpEntity<>(parameters, headers);
          ReleaseDTO response = restTemplate.post(
              env, "apps/{appId}/clusters/{clusterName}/namespaces/{namespaceName}/releases", entity,
              ReleaseDTO.class, appId, clusterName, namespace);
          return response;
        }
    

    发送http请求给adminService模块

    3.2 adminService模块接受到请求,处理release逻辑

    @Transactional
      @PostMapping("/apps/{appId}/clusters/{clusterName}/namespaces/{namespaceName}/releases")
      public ReleaseDTO publish(@PathVariable("appId") String appId,
                                @PathVariable("clusterName") String clusterName,
                                @PathVariable("namespaceName") String namespaceName,
                                @RequestParam("name") String releaseName,
                                @RequestParam(name = "comment", required = false) String releaseComment,
                                @RequestParam("operator") String operator,
                                @RequestParam(name = "isEmergencyPublish", defaultValue = "false") boolean isEmergencyPublish) {
        Namespace namespace = namespaceService.findOne(appId, clusterName, namespaceName);
        if (namespace == null) {
          throw new NotFoundException(String.format("Could not find namespace for %s %s %s", appId,
                                                    clusterName, namespaceName));
        }
        Release release = releaseService.publish(namespace, releaseName, releaseComment, operator, isEmergencyPublish);
    
        //send release message
        Namespace parentNamespace = namespaceService.findParentNamespace(namespace);
        String messageCluster;
        if (parentNamespace != null) {
          messageCluster = parentNamespace.getClusterName();
        } else {
          messageCluster = clusterName;
        }
        messageSender.sendMessage(ReleaseMessageKeyGenerator.generate(appId, messageCluster, namespaceName),
                                  Topics.APOLLO_RELEASE_TOPIC);
        return BeanUtils.transform(ReleaseDTO.class, release);
      }
    

    3.3 releaseService.publish

    @Transactional
      public Release publish(Namespace namespace, String releaseName, String releaseComment,
                             String operator, boolean isEmergencyPublish) {
    
        checkLock(namespace, isEmergencyPublish, operator);
    
        Map<String, String> operateNamespaceItems = getNamespaceItems(namespace);
    
        Namespace parentNamespace = namespaceService.findParentNamespace(namespace);
    
        //branch release
        if (parentNamespace != null) {
          return publishBranchNamespace(parentNamespace, namespace, operateNamespaceItems,
                                        releaseName, releaseComment, operator, isEmergencyPublish);
        }
    
        Namespace childNamespace = namespaceService.findChildNamespace(namespace);
    
        Release previousRelease = null;
        if (childNamespace != null) {
          previousRelease = findLatestActiveRelease(namespace);
        }
    
        //master release
        Map<String, Object> operationContext = Maps.newHashMap();
        operationContext.put(ReleaseOperationContext.IS_EMERGENCY_PUBLISH, isEmergencyPublish);
        // 将数据写到Release表中
        Release release = masterRelease(namespace, releaseName, releaseComment, operateNamespaceItems,
                                        operator, ReleaseOperation.NORMAL_RELEASE, operationContext);
    
        //merge to branch and auto release
        if (childNamespace != null) {
          mergeFromMasterAndPublishBranch(namespace, childNamespace, operateNamespaceItems,
                                          releaseName, releaseComment, operator, previousRelease,
                                          release, isEmergencyPublish);
        }
    
        return release;
      }
    

    看看publishBranchNamespace做了什么

      @Transactional
      public Release publish(Namespace namespace, String releaseName, String releaseComment,
                             String operator, boolean isEmergencyPublish) {
    
        checkLock(namespace, isEmergencyPublish, operator);
    
        Map<String, String> operateNamespaceItems = getNamespaceItems(namespace);
    
        Namespace parentNamespace = namespaceService.findParentNamespace(namespace);
    
        //branch release
        if (parentNamespace != null) {
          return publishBranchNamespace(parentNamespace, namespace, operateNamespaceItems,
                                        releaseName, releaseComment, operator, isEmergencyPublish);
        }
    
        Namespace childNamespace = namespaceService.findChildNamespace(namespace);
    
        Release previousRelease = null;
        if (childNamespace != null) {
          previousRelease = findLatestActiveRelease(namespace);
        }
    
        //master release
        Map<String, Object> operationContext = Maps.newHashMap();
        operationContext.put(ReleaseOperationContext.IS_EMERGENCY_PUBLISH, isEmergencyPublish);
        // 发布release
        Release release = masterRelease(namespace, releaseName, releaseComment, operateNamespaceItems,
                                        operator, ReleaseOperation.NORMAL_RELEASE, operationContext);
    
        //merge to branch and auto release
        if (childNamespace != null) {
          mergeFromMasterAndPublishBranch(namespace, childNamespace, operateNamespaceItems,
                                          releaseName, releaseComment, operator, previousRelease,
                                          release, isEmergencyPublish);
        }
    
        return release;
      }
    

    更新release的逻辑masterRelease

    private Release masterRelease(Namespace namespace, String releaseName, String releaseComment,
                                    Map<String, String> configurations, String operator,
                                    int releaseOperation, Map<String, Object> operationContext) {
        Release lastActiveRelease = findLatestActiveRelease(namespace);
        long previousReleaseId = lastActiveRelease == null ? 0 : lastActiveRelease.getId();
        Release release = createRelease(namespace, releaseName, releaseComment,
                                        configurations, operator);
    
        releaseHistoryService.createReleaseHistory(namespace.getAppId(), namespace.getClusterName(),
                                                   namespace.getNamespaceName(), namespace.getClusterName(),
                                                   release.getId(), previousReleaseId, releaseOperation,
                                                   operationContext, operator);
    
        return release;
      }
    

    看看库里,配置已经写进去了

    MariaDB [ApolloConfigTestDB]> select * from `Release`;
    +----+---------------------------------+------------------------+---------+---------------------+-------------+---------------+--------------------------------------+-------------+-----------+----------------------+------------------------+---------------------------+---------------------+
    | Id | ReleaseKey                      | Name                   | Comment | AppId               | ClusterName | NamespaceName | Configurations                       | IsAbandoned | IsDeleted | DataChange_CreatedBy | DataChange_CreatedTime | DataChange_LastModifiedBy | DataChange_LastTime |
    +----+---------------------------------+------------------------+---------+---------------------+-------------+---------------+--------------------------------------+-------------+-----------+----------------------+------------------------+---------------------------+---------------------+
    |  1 | 20220414194511-f8c63e3dcbc16acd | 20220414194506-release |         | dubbo-demo-service2 | default     | application   | {"dubbo.registry":"zk://zk1.od.com"} |             |           | apollo               | 2022-04-14 19:45:11    | apollo                    | 2022-04-14 19:45:11 |
    +----+---------------------------------+------------------------+---------+---------------------+-------------+---------------+--------------------------------------+-------------+-----------+----------------------+------------------------+---------------------------+---------------------+
    1 row in set (0.000 sec)
    
    MariaDB [ApolloConfigTestDB]> 
    
    

    4.发布事件publisher.publishEvent

  • 相关阅读:
    Python全栈之路Day19
    Python全栈之路Day20
    Python全栈之路Day21
    子元素应该margin-top为何会影响父元素【转】
    HTML5的效果网站demo
    用CSS让字体在一行内显示不换行
    jQuery获得页面元素的绝对/相对位置
    DIV垂直/水平居中2(DIV宽度和高度是动态的)
    Jquery常用方法
    关于JS正则表达式
  • 原文地址:https://www.cnblogs.com/PythonOrg/p/16146302.html
Copyright © 2020-2023  润新知