Java开发 - 带你了解集群间的相互调用,你还在等什么?

news2024/11/26 3:32:41

目录

前言

导读

项目准备

集群准备

父工程引入子项目

服务调用方HelloService准备

pom文件

yml文件

Controller文件

服务提供方HelloWorld准备 

pom文件

yml文件

Controller文件 

运行此两个工程 

hello_world组集群

集群调用测试

RestTemplate换成Dubbo行不行,怎么换

两个pom文件引入依赖

 两个启动文件添加新注解

结构调整

helloWorld调整

helloService调整

​编辑

重新运行

权重 

结语


前言

前文中,对Redis的集群做了详细的讲解,能一路读到这里的相信你们对集群的概念已经基本了解,今天博主要带给大家的是集群之间的相互调用,同时还带负载均衡,这也是目前比较流行的集群使用方法,可以有效避免故障时对整个系统造成影响。既然有集群,那一定少不了RPC的使用,没错,这里会简单涉及,后续会单独讲解更详细的使用,下面,就让我们一起来学习这篇集群之间的相互调用吧。

导读

本篇的重点不在于讲RPC,而是单纯的一种集群调用思想和调用结构!!!

在开始学习前,不知道你对Nacos了解多少?本文主要依靠的便是Nacos注册中心,如果不还不太了解,下面这篇博客将带你初步了解:

Java开发 - 配置中心初体验

项目准备

在开始讲解之前,我们需要先准备一个基础项目其结构大概如下:

你不必像创建过多子项目,圈起来的俩红色的是博主创建的,service是业务调用方,helloworld是业务提供方,好吧,world还写错了,请不要嘲笑博主,手滑,真的是手滑。

关于微服务项目基本结构不知道大家了解多少,如果你对微服务项目里父子项目的基本结构不了解的话,那么建议你先去了解下面下,博主给大家准备好了,点下面链接:

Java开发 - 数风流人物,还看“微服务”

赶紧去看,趁博主还没收费哦~

不选择在这里给大家讲解是因为篇幅过长,不利于大家学习,学习应该是一个循序渐进的过程,而不是一蹴而就。

下面就是一个集群的异地容灾结构图,大家看看:

集群准备

上面主要是让大家熟悉微服务父子项目的配置,这里也会涉及点,但基本上是一笔带过,若果你了解父子项目结构,那么请继续。

父工程引入子项目

详细的结构大家还是要通过上面那篇去学习,这里不再赘述。

服务调用方HelloService准备

pom文件

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>com.codingfire</groupId>
        <artifactId>cloud</artifactId>
        <version>0.0.1-SNAPSHOT</version>
    </parent>
    <groupId>com.codingfire</groupId>
    <artifactId>HelloService</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>HelloService</name>
    <description>Demo project for Spring Boot</description>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
        </dependency>
        <dependency>
            <groupId>com.codingfire</groupId>
            <artifactId>Cloud-helloword</artifactId>
            <version>0.0.1-SNAPSHOT</version>
        </dependency>
    </dependencies>
</project>

yml文件

spring:
  application:
    # 当前Springboot项目的名称,用于注册中心服务的名称
    name: hello_service
  cloud:
    nacos:
      discovery:
        server-addr: localhost:8848
        cluster-name: HZ # 集群名称

hello_world:
  ribbon:
    NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule

其中,hello_world是我们要调用的业务的名字,在对方的pom文件中。下面有负载均衡策略,是随机的。

Controller文件

我们简单搞个Controller,用来调用hello_world服务:

package com.codingfire.helloservice.controller;

import com.codingfire.cloud.helloword.controller.HHelloController;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;

@RestController
@RequestMapping("/hello")
public class SHelloController {

    @Autowired
    private RestTemplate restTemplate;


    @GetMapping("/service")
    public String hello(){
        //hello_world也可以用ip:port替代,但你要集群调用,就不能写死,要写对方的集群的服务名
        String helloWorld = "http://hello_world/hello/world";

        return "XiaoMing says:" + helloWorld;
    }

}

此处我们先用最简单的RestTemplate来进行RPC,此处肯定报错,还需要在启动类中添加此方法:

package com.codingfire.helloservice.config;

import org.springframework.cloud.client.loadbalancer.LoadBalanced;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.client.RestTemplate;

@Configuration
public class RestTemplateConfig {

    @Bean
    @LoadBalanced
    public RestTemplate restTemplate(){
        return new RestTemplate();
    }
}

到此,服务调用方的准备就已经就绪。

服务提供方HelloWorld准备 

pom文件

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>com.codingfire</groupId>
        <artifactId>cloud</artifactId>
        <version>0.0.1-SNAPSHOT</version>
    </parent>
    <groupId>com.codingfire</groupId>
    <artifactId>Cloud-helloword</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>Cloud-helloword</name>
    <description>Demo project for Spring Boot</description>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
        </dependency>
    </dependencies>

</project>

yml文件

spring:
  application:
    # 当前Springboot项目的名称,用于注册中心服务的名称
    name: hello_world
  cloud:
    nacos:
      discovery:
        server-addr: localhost:8848
        cluster-name: SH # 集群名称

Controller文件 

package com.codingfire.cloud.helloword.controller;

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
@RequestMapping("/hello")
public class HHelloController {

    @GetMapping("/world")
    public String hello(){
        return "Hello World!";
    }

}

到此,服务提供方准备就绪。

运行此两个工程 

在此之前,请大家确保Nacos已经启动,否则无法运行项目!!!

由于本地运行项目时,没有指定端口,所以tomcat端口8080会冲突,我们给hello_world指定版本号8081:

接下来分别运行这两个项目,并在Nacos后台查看:

此时看到两个服务都已经成功注册进来,但我们要做的是调用集群服务,所以还需要给hello_world增加一个服务,组成集群。

hello_world组集群

请大家点击此处:

在下图中复制多个启动文件出来:

并分别指定端口为8082,8083,8084。

下面我们先运行8082:

在运行8083和8084之前,我们需要把yml文件中的集群名HZ,改为SH,已经运行的项目不要暂停,本地模拟需要,生产环境多台服务器的时候不需要这样。

接着分别运行8083和8084的启动文件,然后去Nacos后台刷新查看:

此时hello_world的集群有两个,实例有四个,符合我们的预期,我们点击“详情”按钮查看:

完美。

集群调用测试

下面我们调用接口:http://localhost:8080/hello/service

它会去调用hello_world里面的接口,最终会显示出来一段话,额,你们有没有报500错误?控制台提示下面这段话:

Request URI does not contain a valid hostname: http://hello_world/hello/world 

如果有的话,恭喜你中奖了,这里要插入一个小小的知识点,spring.application.name中不能带下划线,博主的命名是不是都带了下划线?这是一个非常小的错误,但也是一个非常容易被忽略的错误,问题是你压根不知道发生了什么,所以,大家现在回过头,去yml文件里,把名字改了,改成:helloWorld和helloService,Controller里面的RestTemplate调用处也需要改,改完之后,重新按照博主上面的步骤运行。一个HZ集群,一个SH集群,不要漏一个。

下面就是见证奇迹的时刻,让我们访问:http://localhost:8080/hello/service

输出这段话,就表示你的应用运行成功了。下面我们清空四个控制台:

刷新url并查看控制台:

你会发现在这四个控制台的输出像是轮询,一个一个,我们注意到,helloServcie的集群是HZ,我们希望它能够优先访问本集群内的服务,而不是访问其他集群的服务。

但默认的ZoneAvoidanceRule不能实现根据同集群优先来实现负载均衡,所以Nacos中提供了一个NacosRule的实现,可以优先从同集群中挑选实例。下面修改负载均衡的策略:

helloWorld:
  ribbon:
#    NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule
    NFLoadBalancerRuleClassName: com.alibaba.cloud.nacos.ribbon.NacosRule # 负载均衡规则

使用新的,原来的注释起来,再次运行helloService,重新调用上面的接口,就会优先访问本集群的服务了。

为了测试集群挂掉后是否能访问其他的集群,你需要把HZ集群的两个实例下线掉:

然后继续访问上面的接口,只要能成功访问,就代表我们的集群策略是没问题的。 

RestTemplate换成Dubbo行不行,怎么换

RestTemplate是一种比较老的用法,我们现在做RPC会更多的用Dubbo,那么Dubbo该怎么使用呢?现在,我们把RestTemplate替换成Dubbo来看看,能不能和上面的集群调用有一样的表现。

两个pom文件引入依赖

        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-dubbo</artifactId>
        </dependency>

两个yml文件引入配置:

dubbo:
  protocol:
    port: -1 # 设置Dubbo服务调用的端口 设置-1能够实现动态自动设置合适端口,生成规则是从20880开始递增
    name: dubbo # 设置端口名称,一般固定就叫dubbo
  registry:
    address: nacos://localhost:8848 # 配置当前Dubbo注册中心的类型和地址
  consumer:
    check: false # 设置为false表示当前项目启动时,不检查要调用的远程服务是否可用,避免报错

 两个启动文件添加新注解

// 如果当前项目是Dubbo服务的生产者,必须添加这个注解
@EnableDubbo

生产者就是服务提供方,消费方不需要,为了防止大家搞错,所以就两个启动类都添加,实际使用中要区分。但也存在即是服务提供方,又是服务消费方的情况。

结构调整

为了能更贴近于真实使用场景,也是为了不在Controller中直接使用Dubbo(可能会带来一些问题),所以我们对项目结构做一些简单的调整,增加service层,包括接口和实现类 。

helloWorld调整

IHelloWorldService类:
package com.codingfire.cloud.helloword.service;

public interface IHelloWorldService {
    String helloWorld();
}
HelloWorldServiceImpl类:
package com.codingfire.cloud.helloword.service.impl;
import com.codingfire.cloud.helloword.service.IHelloWorldService;
import org.springframework.stereotype.Service;

@Service
public class HelloWorldServiceImpl implements IHelloWorldService {

    @Override
    public String helloWorld() {
        return "Hello World!";
    }
}
HHelloController类:
package com.codingfire.cloud.helloword.controller;

import com.codingfire.cloud.helloword.service.IHelloWorldService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
@RequestMapping("/hello")
public class HHelloController {

    @Autowired
    private IHelloWorldService helloWorldService;

    @GetMapping("/world")
    public String hello(){
        return helloWorldService.helloWorld();
    }

}

helloService调整

IHelloService类:
package com.codingfire.helloservice.service;

public interface IHelloService {
    String getHelloWorld();
}
HelloServiceImpl类:
package com.codingfire.helloservice.service.impl;

import com.codingfire.cloud.helloword.service.IHelloWorldService;
import com.codingfire.helloservice.service.IHelloService;
import org.apache.dubbo.config.annotation.DubboReference;
import org.apache.dubbo.config.annotation.DubboService;
import org.springframework.stereotype.Service;

@DubboService
@Service
public class HelloServiceImpl implements IHelloService {

    @DubboReference
    private IHelloWorldService dubboHelloService;

    @Override
    public String getHelloWorld() {
        String helloWorld = dubboHelloService.helloWorld();
        return helloWorld;
    }
}
SHelloController类:
package com.codingfire.helloservice.controller;
import com.codingfire.helloservice.service.IHelloService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
@RequestMapping("/hello")
public class SHelloController {

    @Autowired
    private IHelloService helloService;

    @GetMapping("/service")
    public String hello(){

        String helloWorld = helloService.getHelloWorld();

        return "XiaoMing Says:" + helloWorld;
    }

}

重新运行

俩集群,不要忘了啊,手动修改,和上面一样的方式。

运行成功后查看Nacos中状态:

原来的俩服务还在,但是多了其他的,他们分别是我们注册的dubbo服务,有提供者provider,也有消费者consumer,我们下面点进去看看helloWorld集群启动成功没有:

元数据这一列多了好多数据啊,我们看到是dubbo相关的,集群也都正常,图太长,就不一一截了,下面去访问接口:http://localhost:8080/hello/service 

能得到数据,就说明我们的配置没问题,Dubbo引入就是成功的:

查看控制台:

org.apache.dubbo.rpc.RpcException: No provider available from registry localhost:8848 for service com.codingfire.cloud.helloword.service.IHelloWorldService on consumer 192.168.0.102 use dubbo version 2.7.8, please check status of providers(disabled, not registered or in blacklist).

说是com.codingfire.cloud.helloword.service.IHelloWorldService这个类没有注册到白名单?我们看下这个类,这是个接口,所以还是要看其实现类HelloWorldServiceImpl,果然,这个类没有添加Dubbo注解,在类上添加注解:

@DubboService

 下面重新运行helloWorld的四个启动类,记得集群哦,这时候,博主仿佛听到有人在吐槽:博主,你不玩我们会死啊?能不能一步到位?

哈哈哈哈~不好意思,这是为了让大家更好的理解细节处,大家还是先运行项目吧。

a few moments later~

好了,大家都运行成功了吧,下面,重新访问接口:http://localhost:8080/hello/service

漂亮!!!

但是关于Dubbo单独设置负载均衡策略和同集群优先这些就不在这里介绍了,博主还在进行研究,后续会发详细介绍。

权重 

关于集群访问,还可设置权重:

各集群权重可自行根据需要设置。 

结语

到此,这篇关于集群间相互调用的博客就写好了,唯一觉得有些遗憾的是关于Dubbo的详细使用没有给大家讲清楚,后续单独出一篇来进行讲解,请大家稍微期待一下,其实很多人开发中未必用到异地容灾的场景,这篇博客算是给大家一个入门的门票,算不上特别精,但一定对你会有些帮助。未来,会分享更多的集群相关的博客,让我们一起学习,早日成为架构师。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/649942.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

web基础与HTTP

文章目录 一.web基础1.域名概述2.DNS解析3.阿里云域名申请流程 二.网页1.网页&#xff08;HTTP/HTTPS)1.1 网页1.2 网站1.3 域名1.4 HTTP/HTTPS1.5 URL1.&#xff16;HTML1.7超链接1.&#xff18;发布 &#xff12;. HTML&#xff12;.&#xff11;HTML超文本标记语言&#xff…

人机交互学习-3 交互设计目标与原则

交互设计目标与原则 交互设计目标可用性目标易用性&#xff08;learnability&#xff09;高效率&#xff08;efficiency&#xff09;易记性&#xff08;memorability&#xff09;少出错&#xff08;errors&#xff09;主观满意度&#xff08;satisfaction&#xff09; 用户体验…

C++ 11(2)右值引用 | 移动构造、移动赋值

前文中我们讲解了C11中的部分知识点&#xff0c;下面我们来介绍一下C11中的一个比较重要的知识点右值引用。 右值引用和移动语义 左值引用和右值引用 左值引用 左值就是一个数据的表达式&#xff08;如变量名和解引用指针&#xff09;&#xff0c;我们可以获取它的地址可以…

JD 某工业平台详情API接口PHP接口数据API接口

随着电商市场的蓬勃发展&#xff0c;越来越多的企业正在寻找一种高效、便捷的方式来推销和销售自己的产品。在这个过程中&#xff0c;API接口的使用变得越来越普遍。而京东工业平台商品详情API接口正是一种在推销和销售方面迅速占据市场的技术。 京东工业平台商品详情API接口是…

百度富文本框对接

第一步:引入富文本插件 第二步:修改配置文件 1:ueditor.config.js中,var URL = window.UEDITOR_HOME_URL || getUEBasePath();改为window.UEDITOR_HOME_URL = "http://ip+端口/项目名"; var URL = "http://ip+端口/项目名/.../ueditor/1.4.3/"; …

CORS跨域资源共享漏洞复现——详细利用方法,漏洞危害最大化

文章目录 前言一、漏洞原理以及成因二、CORS漏洞利用总结 前言 在很久很久以前&#xff0c;2021年&#xff0c;我写过一篇关于CORS的漏洞文章&#xff0c;CORS跨域资源共享漏洞靶场演示。当时技术水平欠佳&#xff0c;而且文章内容也仅仅是简单过了一遍漏洞的原理和检测方法&a…

芯片设计全流程概述

芯片设计分为前端设计和后端设计&#xff0c;前端设计&#xff08;也称逻辑设计&#xff09;和后端设计&#xff08;也称物理设计&#xff09;并没有统一严格的界限&#xff0c;涉及到与工艺有关的设计就是后端设计。 1、规格制定 芯片规格&#xff0c;也就像功能列表一样&…

详解c++---AVL树的原理和实现

目录标题 搜索二叉树的缺点什么是AVL树平衡因子的变化规律AVL树的旋转准备工作insert函数模拟实现左旋转右旋转右左双旋左右双旋 AVL树的打印AVL的查找AVL树的检查 搜索二叉树的缺点 在上一篇文章的学习种我们知道了什么搜索二叉树&#xff0c;它让比根小的节点都在根的左边&a…

数字孪生水网可视化平台提高企业应急联动指挥水平

随着城市化进程的不断加快&#xff0c;给水管网的建设和维护变得越来越重要。传统的给水管网监测和管理方式通常只能通过文字和图片来进行描述和展示&#xff0c;难以直观地了解管网的结构和运行情况。而3D可视化大屏展示技术的出现&#xff0c;为给水管网的监测管控提供了以下…

可完成城市内涝一维二维耦合模拟的慧天[HTWATER]软件讲解

第一部分&#xff1a;CAD、GIS在水力建模过程中的应用 1.1复杂城市排水管网系统快速建模&#xff1a;通过标准化的步骤&#xff0c;利用CAD数据、GIS数据建立SWMM模型。在建模的不同阶段发挥不同软件的优势&#xff0c;实现高效的数据处理、准确的参数赋值、模型的快速建立。在…

【NPS 】1. 服务器端搭建

一、环境&#xff1a; 二、安装docker docker-compose 三、安装 nps 服务端 1. 在 /mnt/docker/nps 下创建 docker-compose.yaml 文件 2. 安装 nps 四、登录 1. ip:8800登录&#xff0c;默认 账号密码 admin / 123 2. 修改密码 一、环境&#xff1a; 系统 &#xff1a;C…

2023年6月中国数据库排行榜:OceanBase 连续七月踞榜首,华为阿里谋定快动占先机

群雄逐鹿&#xff0c;酣战墨坛。 2023年6月的 墨天轮中国数据库流行度排行 火热出炉&#xff0c;本月共有273个数据库参与排名。本月排行榜前十变动不大&#xff0c;可以用一句话概括为&#xff1a;OTO 组合连续两月开局&#xff0c;传统厂商GBase南大通用乘势而上&#xff0c;…

将深度学习与传统计算机视觉进行比较

原创 | 文 BFT机器人 深度学习 (DL) 在数字图像处理中用于解决难题&#xff08;例如&#xff0c;图像着色、分类、分割和检测&#xff09;。卷积神经网络 (CNN) 等深度学习方法通过使用大数据和丰富的计算资源提高预测性能&#xff0c;突破了可能性的界限。 深度学习是机器学习…

学习一年Java的程序员的C++学习记录(指针引用绕晕记)

文章目录 一 C入门二 变量和数据类型三 运算符四 流程控制五 复合数据类型六 函数七 函数高阶八 面向对象 一 C入门 标准输出流中 cout 是一个ostream对象&#xff0c;<< 和 >>是C中经过重载的运算符&#xff0c;配合cout和cin使用时表示流运算符。C中是如何重载运…

苹果头显Vision Pro深度解读1 下一个十年计算机行业的标杆

1 苹果Vision Pro是下一个十年计算机行业的标杆。 今天主要给大家说下今年WWDC发布的vision pro&#xff0c;以及后面很多期给大家做一些vision pro背后大量的技术的分享。我这次是从头到位把苹果官网上所有的文档&#xff0c;视频&#xff0c;全部学习了一遍。好几十个视频文…

Stable Diffusion web UI之X/Y/Z plot使用

一、安装环境配置 PASS CFG Scale配置的越高&#xff0c;SD生成的图会更贴用户提供的prompt来进行生成&#xff0c;AI的自由度会下降&#xff0c;生成人物的时候特别需要注意&#xff0c;对于手脚脸部&#xff0c;过高的值更容易造成过拟合还有画面崩坏。 二、X/Y/Z plot 使用…

民间最大的社区,倒闭了

看到一则不起眼的消息&#xff1a;天涯社区已经无法打开。 时代抛弃你的时候&#xff0c;都不说一声再见&#xff0c;现实就是这样残酷。 记得我读大学的时候&#xff0c;天涯社区是国内互联网行业中最具影响力的论坛之一&#xff0c;号称 " 全球华人网上家园 “。 当年&a…

Maven配置仓库

目录 Maven仓库介绍 Maven配置本地仓库 Maven配置中央仓库 Maven配置远程仓库 配置jdk Maven仓库介绍 当使用 Maven 构建项目时&#xff0c;有三种仓库起着重要作用&#xff1a; 本地仓库&#xff1a;就像你自己的书库。当你使用 Maven 下载依赖项时&#xff0c;它们会被…

某企业《IT治理管理办法》共十个章节,五十九条管理要求,适用于集团级企业、大型企业、中型企业

第二条&#xff1a;IT治理是规范公司各部门在公司IT系统建设、IT 应用中的责任与权力分配&#xff0c;主要包括原则、IT架构、基础设施、IT应用、IT投入等方面&#xff0c;明确责任人以及决策权力人&#xff0c;以提升工作效率&#xff0c;提高决策的科学性和合理性。 总则的第…

HarmonyOS元服务端云一体化开发快速入门(下)

四、关联云开发资源 为工程关联云开发所需的资源&#xff0c;即在DevEco Studio中选择您的华为开发者帐号加入的开发者团队&#xff0c;将该团队在AGC的同包名应用关联到当前工程。具体操作如下&#xff1a; 1.&#xff08;可选&#xff09;如您尚未登录DevEco Studio&#xf…