【SpringBoot】Dubbo、Zookeeper

文章目录

  • 前提知识概要
    • 分布式系统
      • 单体架构
      • 垂直应用架构
      • 分布式架构
      • 流式架构
    • RPC
  • Dubbo
    • 概念
    • Dubbo环境搭建
      • Zookeeper
      • 测试 Zookeeper
      • Window环境下使用Dubbo-admin
      • 版本匹配不对
    • 服务注册实战
      • 内容总结
      • 导入相关依赖
      • 选择 Zookeeper 版本
      • 配置并启用 Zookeeper
      • 创建服务接口和实现(DubboService)类,这里是配置`Provider`
      • 启动Dubbo的扫描(EnableDubbo)
      • 重复上述操作,将需要注册Dubbo的配置下
      • 编写Service,这次是消费者,调用提供者所提供的内容

前提知识概要

分布式系统

  1. “分布式系统是若干独立计算机的集合,这些计算机对于用户来说就像单个相关系统”;
  2. 其目的是利用更多的机器,处理更多的数据
  3. 用小而多,代替大且贵
  4. 只有当单个节点的处理能力无法满足日益增长的计算、存储任务的时候,且硬件的提升(加内存、加磁盘、使用更好的CPU)高昂到得不偿失的时候,应用程序也不能进一步优化的时候,我们才需要考虑分布式系统;
  5. 分布式系统要解决的问题本身就是和单机系统一样的,而由于分布式系统多节点、通过网络通信的拓扑结构,会引入很多单机系统没有的问题,为了解决这些问题又会引入更多的机制、协议,带来更多的问题;
  6. 但是 缺点也在于这里 过分的依赖于 网络通信协议;

单体架构

网络吞吐量小时,使用一个应用(application),将所有的功能都部署在一起,以减少部署的节点和成本。为此简化CRUD的数据访问框架ORM就是关键。

ORM:Mybatis、Hibernate

使用场景:小型网站,将所有功能都部署到一个地方,简单,易用

缺点:

  • 性能扩展比较难
  • 协同开发问题
  • 不利于升级维护

垂直应用架构

数据吞吐量打的时候,单一的应用会增加机器所在压力,将应用的几块拆成互不相干的几个应用以提升效率。这个时候加速前端页面开发的WEB框架又是关键:

WEB框架:MVC,MVVM

通过切分业务 来实现各个模块的独立部署,降低了维护和部署的难度,团队各司其职更易管理,性能拓展也更加的方便,更有针对性。

缺点:

  • 公用的模块无法重复利用;
  • 多重复写功能导致资源浪费;

分布式架构

当垂直的应用越来越多,应用之间的交互不可避免,就去优化垂直应用架构;

将核心的业务提取,成为独立的服务,逐步形成稳定的服务中心,是前段更好的应用市场。

提高业务服用整合的**分布式框架 **又是关键。

分布式框架:RPC

流式架构

当服务越来越多,容量的评估,小服务资源的浪费等问题逐渐显现,这个时候有需要一个调度中心,能够将有限的资源得到最大的利用, 这时候,用于提高机器利用率的资源调度又成为了重点

提高机器利用率的资源调度和治理中心(SOA)[Service Oriented Architecture]是关键

RPC

RPC【Remote Procedure Call】是指远程过程调用,是一只进程思想,而不是一种规范,类似于我们的。

允许程序调用另一个地址空间。(通常是共享网络的另一台机器上)的过程或函数,而不用程序员显式编码这个远程调用的细节。

两台服务器A、B,主要是部署在A服务器上,想要调用B服务器,但是不在一个机器中,不能直接去调用,需要利用网络,通过网络传输将自己想要的数据及想要在B服务站执行的内容 传输过去。

RPC 所实现的内容就是让A服务器调用B服务器 的过程被忽略在调用函数候像调用A自己本身的函数一样;

RPC的两个核心就是:通讯(HTTP、RPC)、序列化(序列化的方式就是方便数据传输);

如何给老婆解释什么是RPC

假设你有一个计算器接口,Calculator,以及它的实现类CalculatorImpl,那么在系统还是单体应用时,你要调用Calculator的add方法来执行一个加运算,直接new一个CalculatorImpl,然后调用add方法就行了,这其实就是非常普通的本地函数调用,因为在同一个地址空间,或者说在同一块内存,所以通过方法栈和参数栈就可以实现。

现在,基于高性能和高可靠等因素的考虑,你决定将系统改造为分布式应用,将很多可以共享的功能都单独拎出来,比如上面说到的计算器,你单独把它放到一个服务里头,让别的服务去调用它。

**问题:**服务A里头并没有CalculatorImpl这个类,那它要怎样调用服务B的CalculatorImpl的add方法呢?

  • 可以模仿B/S架构的调用方式呀,在B服务暴露一个Restful接口,然后A服务通过调用这个Restful接口来间接调用CalculatorImpl的add方法。

很好,这已经很接近RPC了,不过如果是这样,那每次调用时,是不是都需要写一串发起http请求的代码呢?比如httpClient.sendRequest…之类的,能不能像本地调用一样,去发起远程调用,让使用者感知不到远程调用的过程呢,像这样:

  • 代理模式呀!而且最好是结合Spring IoC一起使用,通过Spring注入calculator对象,注入时,如果扫描到对象加了@Reference注解,那么就给它生成一个代理对象,将这个代理对象放进容器中。而这个代理对象的内部,就是通过httpClient来实现RPC远程过程调用的。

就是很多RPC框架要解决的问题和解决的思路,比如阿里的Dubbo。

ps:Dubbo以前是阿里的,后来才移交给了Apache

RPC要解决的两个问题:

  • 解决分布式系统中,服务之间的调用问题。
  • 远程调用时,要能够像本地调用一样方便,让调用者感知不到远程调用的逻辑。

RPC很少用到http(超文本传输协议)协议来进行数据传输,毕竟我只是想传输一下数据而已,何必动用到一个文本传输的应用层协议呢,我为什么不直接使用二进制传输?比如直接用Java的Socket协议进行传输。

以左边的Client端为例,Application就是rpc的调用方,Client Stub就是我们上面说到的代理对象,也就是那个看起来像是Calculator的实现类,其实内部是通过rpc方式来进行远程调用的代理对象,至于Client Run-time Library,则是实现远程调用的工具包,比如jdk的Socket,最后通过底层网络实现实现数据的传输。

著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

作者:柳树之

链接:https://www.jianshu.com/p/2accc2840a1b

来源:简书

著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

Client将数据进行序列化 传输给Server,Server对数据进行反序列化,读取数据内容,只进行服务调用,程序处理,将处理的内容结果通过在进行序列化 传输到Client,最终实现全局的调用;

Dubbo

类比于SpringCloud,都是使用的分布式架构思想,但是Dubbo是一个框架,而SpringCloud是一套整合于Spring的生态;

概念

Apache Dubbo |ˈdʌbəʊ| 是一款高性能、轻量级的开源Java RPC框架,它提供了三大核心能力:

  • 面向接口的远程方法调用;
  • 智能容错和负载均衡;
  • 服务自动注册和发现;

官网:cn.dubbo.apache.org

QuickStart:https://cn.dubbo.apache.org/zh-cn/overview/mannual/java-sdk/quick-start/starter/

  1. 基本概念

**服务提供者(**Provider):暴露服务的服务提供方,服务提供者在启动时,向注册中心注册自己提供的服务。

服务消费者(Consumer):调用远程服务的服务消费方,服务消费者在启动时,向注册中心订阅自己所需的服务,服务消费者,从提供者地址列表中,基于软负载均衡算法,选一台提供者进行调用,如果调用失败,再选另一台调用。

注册中心(Registry):注册中心返回服务提供者地址列表给消费者,如果有变更,注册中心将基于长连接推送变更数据给消费者

监控中心(Monitor):服务消费者和提供者,在内存中累计调用次数和调用时间,定时每分钟发送一次统计数据到监控中心

调用关系:

  1. 服务Provider容器 Container负责启动start,加载,运行服务提供者。
  2. 服务提供者Provider在启动时,向注册中心Registry注册register自己提供的服务。
  3. 服务消费者Consumer在启动时,向注册中心Registry订阅subscribe自己所需的服务。
  4. 注册中心Registry返回服务提供者Provider地址列表通知notify给消费者,如果有变更,注册中心将基于长连接推送invoke变更数据给消费者。
  5. 服务消费者Consumer,从提供者地址列表中,基于软负载均衡算法,选一台提供者进行调用,如果调用失败,再选另一台调用。

Dubbo环境搭建

在最新的3.3.0版本官网上,可以直接创建你 基于Spring Boot 的微服务应用 ,需要注意

因为是看的狂神的20年的视频,所以先按照他当时的做法思路使用zookeeper,这个要参照官网

Zookeeper

学习文档:https://cn.dubbo.apache.org/zh-cn/overview/reference/integrations/zookeeper/

Zookeeper: https://zookeeper.apache.org/releases.html

  1. 下载Zookeeper

下载3.8.4 是稳定版;

官网太慢,去镜像站下载:https://mirrors.aliyun.com/apache/zookeeper

  1. 解压 apache-zookeeper-3.8.4widows运行"D:\work\apache-zookeeper-3.8.4\bin\zkServer.cmd",添加pause ,报错查看错误信息
  2. 解决 java.lang.ClassNotFoundException问题

发现调用jar包找不到,我下载的是源码版,重新下载个二进制版,把libcopy进去,网络不好的情况下不要自己编译。

  1. 解决 Error processing D:\work\apache-zookeeper-3.8.4\bin\..\conf\zoo.cfg的问题

目录下没有zoo.cfg文件,copy sample生成一个,根据上述内容配置,然后启动

  1. 启动成功

测试 Zookeeper

  1. run zkCli.cmd,显示连接成功;
  2. create –e /aaa 123:创建一个aaa节点,值为123

在 Zookeeper 3.8 版本之后,create -e(表示创建一个带有 ephemeral 选项的节点)已被废弃。现在,如果你想创建一个临时节点(ephemeral node),你应该使用 create 命令时直接指定 -e 参数后面跟路径和数据。

  1. get /aaa,显示没有创建?检查问题,重新创建使用 create /aaa 123就好了;

Window环境下使用Dubbo-admin

在官网可以看到这段描述,Dubbo-admin可以对整个集群进行查询调用,

官网:

  • https://cn.dubbo.apache.org/zh-cn/overview/reference/proposals/admin/
  • https://cn.dubbo.apache.org/zh-cn/overview/notices/admin/

文档编辑完 没检查就提交了 哈哈哈

  1. 下载Dubbo-admin
  • https://cn.dubbo.apache.org/zh-cn/overview/reference/setup/install/
  • https://cn.dubbo.apache.org/zh-cn/download/
  1. 下载完解压,使用目前最新的 最稳定版本,解压 ;
  2. 检查 dubbo-admin-server\src\main\resources\application.properties的端口号配置;
  3. 打包 cd 到根目录mvn clean package -Dmaven.test.skip=true,等待打包完成;
  4. 执行打包好的jar包java -jar dubbo-admin-0.4.0.jar
  5. Session 0x0 for server 127.0.0.1/<unresolved>:2181, unexpected error, closing socket connection and attempting reconnect提示报错,配置host文件 把localhost的地址映射加进去;
  6. 一直启动失败??问题好奇怪
  7. 访问http://localhost:7001/?,默认账号名root 密码 root

版本匹配不对

对应的版本不对?

  • Dubbo Admin 0.4.0发布于2020年,其设计主要针对JDK8环境
  • Zookeeper 3.8.4对JDK17的支持尚不完善,已知存在NIO通道问题

更换完版本后,启动依旧报错,系统提示 java.lang.IllegalStateException

java.lang.IllegalStateException: zookeeper not connected, the address is: zookeeper://127.0.0.1:2181/org.apache.dubbo.config.ConfigCenterConfig?check=true&config-file=dubbo.properties&group=dubbo&highest-priority=false&namespace=dubbo&timeout=30000 at org.apache.dubbo.remoting.zookeeper.curator.CuratorZookeeperClient.<init> (CuratorZookeeperClient.java:118)

Jdk17连接zookeeper报错:127.0.0.1/<unresolved>:2181_java.lang.illegalargumentexception: unable to cano-CSDN博客

使用 Dubbo Admin 0.6.0看看,访问 http://localhost:38080

好了,终于进去了,使用Dubbo Admin 0.6.0也是报错,之后再去检查pom中的依赖,发现org.apache.zookeeper的依赖默认版本是zookeeper-3.4.14,于是将他升级为最新版,启动成功。其他问题还在等待校验。

服务注册实战

官方文档: https://cn.dubbo.apache.org/zh-cn/overview/mannual/java-sdk/tasks/service-discovery/zookeeper/

内容总结

  1. zookeeper :一个jar包 (必须存在)
  2. dubbo-admin:是一个监控管理后台 (可有可无)
  3. Dubbo:jar包 (需要用)
  4. 最新的Dubbo 有好多实现方案,根据具体情况使用,阿里云本身有nacos

导入相关依赖

  1. SpringBoot
<dependency><groupId>org.apache.dubbo</groupId><artifactId>dubbo-spring-boot-starter</artifactId><version>3.3.0</version>
</dependency>
<!-- 仅当 Zookeeper Server 版本是 3.4.x 及以下时,使用此依赖 -->
<dependency><groupId>org.apache.dubbo</groupId><artifactId>dubbo-zookeeper-spring-boot-starter</artifactId><version>3.3.0</version>
</dependency>
<!-- 仅当 Zookeeper Server 版本是 3.5.x 及以上时,使用此依赖-->
<dependency><groupId>org.apache.dubbo</groupId><artifactId>dubbo-zookeeper-curator5-spring-boot-starter</artifactId><version>3.3.0</version>
</dependency>

检查自己 的Zookeeper的版本是 3.8.4 所以使用dubbo-zookeeper-curator5-spring-boot-starter;

找不着依赖就mvn clean install

  1. 不使用SpringBoot
<dependencies><dependency><groupId>org.apache.dubbo</groupId><artifactId>dubbo</artifactId><version>3.3.0</version></dependency><!-- This dependency helps to introduce Curator and Zookeeper dependencies that are necessary for Dubbo to work with zookeeper as transitive dependencies. --><!-- 仅当 Zookeeper Server 版本是 3.4.x 及以下时,使用此依赖 --><dependency><groupId>org.apache.dubbo</groupId><artifactId>dubbo-dependencies-zookeeper</artifactId><version>3.3.0</version><type>pom</type></dependency><!-- 仅当 Zookeeper Server 版本是 3.5.x 及以上时,使用此依赖	--><dependency><groupId>org.apache.dubbo</groupId><artifactId>dubbo-dependencies-zookeeper-curator5</artifactId><version>3.3.0</version><type>pom</type></dependency></dependencies>

选择 Zookeeper 版本

Dubbo 3.3.0 版本开始正式支持 JDK 17,如果您使用 JDK 17,则必须选用 dubbo-dependencies-zookeeper-curator5 或 dubbo-zookeeper-curator5-spring-boot-starter 依赖,对应的 Zookeeper Server 推荐是 3.8.0 版本及以上。

::当前使用的最新稳定版 3.8.4

配置并启用 Zookeeper

配置properties,注册中心的地址,服务发现名 和 扫描包

# dubbo.properties
dubbo.registry.address=zookeeper://localhost:2181
# 新用户请设置此值,表示启用应用级服务发现,可选值 interface、instance、all,默认值为 all,未来版本将切换默认值为 instance
dubbo.registry.register-mode=instance

address 是启用 zookeeper 注册中心唯一必须指定的属性,而在生产环境下,address 通常被指定为集群地址,如 address=zookeeper://10.20.153.10:2181?backup=10.20.153.11:2181,10.20.153.12:2181

protocol 与 address 分开配置的模式也可以,

<dubbo:registry protocol="zookeeper" address="10.20.153.10:2181,10.20.153.11:2181,10.20.153.12:2181" />

创建服务接口和实现(DubboService)类,这里是配置Provider

使用@DubboService的注解 ,为了将接口暴漏出去,使外部接口可以扫描的到TicketService

package com.demo.service.impl;import com.demo.service.TicketService;
import org.apache.dubbo.config.annotation.DubboService;@DubboService
public class TicketImpl implements TicketService {@Overridepublic String getTicket() {return "Mrs.K sailed ticket";}
}

启动Dubbo的扫描(EnableDubbo)

  1. 如果没有找到注解@EnableDubbo,记得去更新下maven包,看看有没有把依赖导进来,依赖启动器导入的情况下一般就能够发现;
import org.apache.dubbo.config.spring.context.annotation.EnableDubbo;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;@EnableDubbo
@SpringBootApplication
public class Springboot09DubboserveApplication {public static void main(String[] args) {SpringApplication.run(Springboot09DubboserveApplication.class, args);}}
  1. 启动项目测试,项目正常启动,

  1. 服务测试

重复上述操作,将需要注册Dubbo的配置下

  1. 配置端口,注册地址;

  1. 启动类开启Dubbo;

编写Service,这次是消费者,调用提供者所提供的内容

在Dubbo中,分提供者Provider和消费者Consumer两个概念;

  • 提供者实现接口,提供具体的实现内容;
  • 消费者负责调用接口,使用提供者所实现的功能;
  • 因为不是在一个服务中启动,所以存在RPC的管理,Dubbo的解决方案由此而生;
  1. 在Dubbo中,消费者所需要使用的是Refer,选择指向的地址@DubboReference
@Component
public class UserServiceImpl implements UserService {//我们需要去拿去注册中心的服务@DubboReferenceprivate TicketService ticketService;public void buyTicket() {System.out.println("》》User正在买票...");System.out.println("User正在调用ticket服务...");System.out.println(ticketService.getTicket());System.out.println("调用Ticket完成《《");}}
  1. 这样子代码就会去找 TicketService接口,但是因为TicketService是在另一个服务中启用的,所以需要把那个接口在这重现一下

package com.demo.service;public interface TicketService {String getTicket();}
  1. 在Dubbo-admin中查找,启用成功

  1. 代码测试,要先关闭Dubbo-admin,还是不行。。。

技术没到家,一直在报端口占用服务冲突的错

package com.demo;import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import com.demo.service.UserService;@SpringBootTest
class Springboot09DubboserveApplicationTests {@AutowiredUserService userService;@Testvoid contextLoads() {userService.buyTicket();}
}
  1. 写个Controller,在Controller中调用Service之后,启动页面测试

  1. 优化下 优化内容显示到页面上

项目启动成功:

测试功能

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

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

相关文章

【不说废话】pytorch张量相对于numpy数组的优势

核心关系 我们首先需要了解&#xff1a;PyTorch 张量在设计上深受 NumPy 数组的影响&#xff0c;它们共享许多相似的 API 和概念。实际上&#xff0c;PyTorch 张量可以看作是支持 GPU 加速和自动求导功能的 NumPy 数组。PyTorch 张量的主要优势 1. GPU 加速支持&#xff08;最重…

拼团小程序源码分享拼团余额提现小程序定制教程开发源码二开

功能详细说明&#xff08;一&#xff09;首页功能进入首页&#xff0c;可看到以下核心功能&#xff1a;1、优惠券&#xff0c;钱包&#xff0c;签到&#xff0c;拼团&#xff0c;分销等各种功能入口2、推荐的商品和活动3、下方功能栏的各种功能&#xff08;二&#xff09;客服功…

pikachu之XSS

XSS&#xff08;跨站脚本&#xff09;概述Cross-Site Scripting 简称为“CSS”&#xff0c;为避免与前端叠成样式表的缩写"CSS"冲突&#xff0c;故又称XSS。一般XSS可以分为如下几种常见类型&#xff1a;1.反射性XSS;2.存储型XSS;3.DOM型XSS;XSS漏洞一直被评估为web漏…

【Element Plus `el-select` 下拉菜单响应式定位问题深度解析】

Element Plus el-select 下拉菜单响应式定位问题深度解析 本文档旨在深入剖析一个在响应式布局中常见的 UI 问题&#xff1a;如何确保一个靠近屏幕边缘的 el-select 组件的下拉菜单&#xff0c;在任何屏幕尺寸下都能以预期的、优雅的方式显示。 1. 需求背景 在一个大屏数据展示…

Qt 项目文件(.pro)中添加 UI 文件相关命令

在 Qt 的 .pro 项目文件中&#xff0c;处理 UI 文件&#xff08;.ui 文件&#xff09;通常需要以下配置&#xff1a; 基本 UI 文件配置 自动包含 UI 文件&#xff1a; qmake FORMS yourfile.ui \anotherfile.ui Qt 构建系统会自动使用 uic&#xff08;用户界面编译器&#xff…

展会回顾 | 聚焦医疗前沿 , 礼达先导在广州医博会展示类器官自动化培养技术

8月22-24日&#xff0c;广州医博会在广交会展馆B区圆满落幕。此次盛会汇聚了来自全球医疗健康领域的顶尖专家学者、企业代表与合作伙伴。展会内容涵盖基础研发、临床应用、前沿技术、产业转化、医疗服务及金融支持&#xff0c;全景呈现医疗健康产业的创新生态&#xff0c;成为连…

华为eNSP防火墙综合网络结构训练.docx

1.IP及VLAN规划情况 设备 接口 IP vlan 备注 AR1 g0/0/0 1.1.1.2/28 PPPOE g0/0/1 3.3.3.1/30 g0/0/2 114.114.114.254/24 AR2 g0/0/0 2.2.2.2/28 DHCP g0/0/1 3.3.3.2/30 g0/0/2 100.100.100.254/24 FW1 g1/0/0 10.0.0.1/30 tr…

从 Oracle 到 TiDB,通过ETL工具,高效实现数据拉通

在当前企业数字化转型的浪潮中&#xff0c;打破数据孤岛、实现异构数据库间的数据高效流转已成为提升业务敏捷性与决策效率的关键。许多企业在要将 Oracle 数据库中的海量数据准确地同步至TiDB 分布式数据库时遇到了挑战。这一过程不仅要求数据的绝对一致性&#xff0c;还对同步…

Effective c++ 35条款详解

您问到了最关键的一点&#xff01;这正是策略模式的精妙之处——它通过组合&#xff08;composition&#xff09;而非继承&#xff08;inheritance&#xff09;来实现多态效果。让我详细解释这是如何工作的&#xff0c;以及它与传统继承多态的区别。&#x1f504; 策略模式如何…

51c自动驾驶~合集19

自己的原文哦~ https://blog.51cto.com/whaosoft/11793894 #DRAMA 首个基于Mamba的端到端运动规划器 运动规划是一项具有挑战性的任务&#xff0c;在高度动态和复杂的环境中生成安全可行的轨迹&#xff0c;形成自动驾驶汽车的核心能力。在本文中&#xff0c;我…

大数据新视界 -- Hive 数据仓库:架构深度剖析与核心组件详解(上)(1 / 30)

&#x1f496;&#x1f496;&#x1f496;亲爱的朋友们&#xff0c;热烈欢迎你们来到 青云交的博客&#xff01;能与你们在此邂逅&#xff0c;我满心欢喜&#xff0c;深感无比荣幸。在这个瞬息万变的时代&#xff0c;我们每个人都在苦苦追寻一处能让心灵安然栖息的港湾。而 我的…

软考 系统架构设计师系列知识点之杂项集萃(137)

接前一篇文章:软考 系统架构设计师系列知识点之杂项集萃(136) 第253题 在面向对象设计中,用于描述目标软件与外部环境之间交互的类被称为( ),它可以( )。 第1空 A. 实体类 B. 边界类 C. 模型类 D. 控制类 正确答案:B。 第2空 A. 表示目标软件系统中具有持久…

(附源码)基于Spring Boot公务员考试信息管理系统设计与实现

摘 要 随着公务员考试日益受到社会的广泛关注&#xff0c;一个高效、便捷的公务员考试信息管理系统显得尤为重要。本文设计并实现了一个基于前端Vue框架&#xff0c;后端采用Java与Spring Boot技术&#xff0c;数据库选用MySQL&#xff0c;并部署在Tomcat服务器上的信息管理系统…

学习JavaScript的第一个简单程序:Hello World

在JavaScript中&#xff0c;最简单的程序是打印"Hello World"。可以通过以下方式实现&#xff1a; console.log("Hello World");将上述代码保存为hello.js文件&#xff0c;通过Node.js运行或在浏览器控制台中执行。 浏览器环境实现 在HTML文件中嵌入Jav…

【Big Data】Alluxio 首个基于云的数据分析和开源AI数据编排技术

目录 1. 什么是 Alluxio&#xff1f;​ 2. Alluxio 的诞生背景&#xff1a;为什么需要数据编排层&#xff1f;​ 痛点 1&#xff1a;计算与存储强耦合&#xff0c;适配成本高​ 痛点 2&#xff1a;跨集群 / 跨云数据移动效率低​ 痛点 3&#xff1a;数据访问延迟高&#x…

uniApp App 嵌入 H5 全流程:通信与跳转细节拆解

在 uniApp App 开发中&#xff0c;通过 WebView 嵌入 H5 页面是常见需求&#xff08;如活动页、第三方页面&#xff09;&#xff0c;核心需解决「H5 与 App 通信」「H5 操作后返回/跳转 App」两大问题。本文基于 DCloud 官方方案&#xff08;原文链接&#xff09;&#xff0c;对…

技能提升必备:鸿蒙HarmonyOS应用开发者认证

技能提升必备&#xff1a;鸿蒙HarmonyOS应用开发者认证&#xff0c;HarmonyOS 认证是华为为开发者打造的能力衡量体系。随着 HarmonyOS 系统影响力不断扩大&#xff0c;市场对相关开发人才需求激增。该认证分为基础与高级等不同级别&#xff0c;覆盖应用开发、设备开发等方向。…

Chromium 架构中的 ContentClient / ContentBrowserClient 设计原理全解析

一、前言在阅读 Chromium 源码时&#xff0c;很多人会对这样一段调用产生疑惑&#xff1a;bool BrowserMainLoop::AudioServiceOutOfProcess() const { return base::FeatureList::IsEnabled(features::kAudioServiceOutOfProcess) && !GetContentClient()->browser…

window和liunx提权学习笔记

liunx提权 反弹shell升级交互式反弹sehell 反弹的服务器 接受的服务器 连接上之后的shell&#xff0c;没有tab键补全&#xff0c;不可以上下键显示历史命令 你会发现并不能如愿所偿&#xff0c;「上下方向键」被强制转换为了 ^[[A、^[[B 等字符。 正是由于「简单 shell」的各种…

毕业项目推荐:47-基于yolov8/yolov5/yolo11的焊缝质量检测识别系统(Python+卷积神经网络)

文章目录 项目介绍大全&#xff08;可点击查看&#xff0c;不定时更新中&#xff09;概要一、整体资源介绍技术要点功能展示&#xff1a;功能1 支持单张图片识别功能2 支持遍历文件夹识别功能3 支持识别视频文件功能4 支持摄像头识别功能5 支持结果文件导出&#xff08;xls格式…