Spring Boot Admin -Actuator 图形化管理工具

news2025/8/9 21:20:07

Spring Boot Admin

概述

之前学习了Spring Boot Actuator的特性,它能够是开发者很便捷的监控系统的各种指标,但是有一个很大的问题 — 不够直观。今天来学习下Spring Boot Admin。Spring Boot Admin 是一个免费的开源社区项目,用于监控、管理Spring Boot 应用系统。Spring Boot Admin的架构采用客户端 - 服务器模式,客户端通过HTTP协议周期性的向服务端上报自身服务状态,实现监控管理的目的。Spring Boot Admin提供以下特性:

  • 显示服务健康状态
  • 服务器IO、内存、CPU、数据库、缓存等指标监控
  • 显示编译信息
  • 跟踪、下载日志文件
  • 查看虚拟机 & 系统设置属性
  • 查看Spring Boot 配置属性
  • 支持Spring Cloud 相关endpoint
  • 便捷的日志级别管理
  • 与 JMX-beans 进行交互
  • 查看、下载 thread dump
  • 查看 http-traces
  • 查看 审计事件 - auditevents
  • 查看 http-endpoints
  • 查看 scheduled tasks
  • 查看并删除http sessions (using spring-session)
  • 状态变更时进行通知、如电子邮件、短信、钉钉
  • 状态变更的事件日志

集成服务端

首先需要启动Spring Boot Admin 服务端程序。为此,只需要启动一个简单的Spring Boot项目即可,由于Spring Boot Admin 服务端能够作为servlet、webflux应用运行,因此Spring Boot 应用只需要添加对应的Spring Boot Starter,

<dependency>
    <groupId>de.codecentric</groupId>
    <artifactId>spring-boot-admin-starter-server</artifactId>
    <version>2.7.5</version>
</dependency>

使用maven脚本下载依赖

mvn clean install -Dmaven.test.skip=true

接下来只需要在启动类上增加**@EnableAdminServer**注解即可

@SpringBootApplication
@EnableAdminServer
public class SpringbootStudyApplication {

	public static void main(String[] args) {
		ConfigurableApplicationContext app = SpringApplication.run(SpringbootStudyApplication.class, args);
		DatabaseProperties bean = app.getBean(DatabaseProperties.class);
		ServerProperties server = app.getBean(ServerProperties.class);
	}
}

启动应用程序,在浏览器访问 http://localhost:8090/applications (application.properties文件中配置的端口为: server.port=8090)

在这里插入图片描述

由于目前尚未注册客户端,因此没有任何数据展示出来。

注册客户端

向Spring Boot Admin 服务端注册应用程序,跟服务端启动类似,普通的Spring Boot 应用程序也只需要引入Spring Boot Admin Client starter 依赖即可。

添加依赖

<dependency>
    <groupId>de.codecentric</groupId>
    <artifactId>spring-boot-admin-starter-client</artifactId>
    <version>2.7.5</version>
</dependency>

启动客户端

启动Spring Boot Admin 客户端需要在Spring Boot application.properties配置文件中,添加以下配置:

spring.boot.admin.client.url=http://localhost:8090  
management.endpoints.web.exposure.include=* 
# 设置服务名称 方便识别
spring.application.name=Spring-Boot-Admin-Client

注意:启动Spring Boot Admin Client 只需要做以上两步即可,不需要在程序添加额外的注解

运行客户端

运行客户端后,重新打开服务端地址,可以看到客户端已经注册上了

在这里插入图片描述

客户端集群

客户端多个节点集群部署时,Spring Boot Admin 根据服务名称自动进行分组,因此从Spring Boot Admin UI界面可以很清晰的看出实例的个数。使用IDEA工具或以下命令将客户端启动多次

# 第一次启动
java -jar target/spring-boot-admin-client-0.0.1-SNAPSHOT.jar --server.port=8081

# 第二次启动
java -jar target/spring-boot-admin-client-0.0.1-SNAPSHOT.jar --server.port=8082

在这里插入图片描述

从上面的截图中,可以一目了然的看出服务名称、实例个数、运行时长。

Spring Boot Admin 也支持Spring Cloud 微服务体系中服务发现、注册机制,客户端注册流程甚至不需要单独引入Client 依赖,这里就不做过多的介绍,请参考官方文档。

功能介绍

日志报表

系统监控

配置参数

现在来介绍下Spring Boot Admin 服务端、客户端相关的配置参数,这对开发者进行定制服务、参数调优很有帮助

客户端参数

Spring Boot Admin 客户端向服务端注册,并周期性的发送HTTP POST请求来确保客户端系统处于健康状态。

参数名称参数描述默认值
spring.boot.admin.client.enabled启动 Spring Boot Admin 客户端.true
spring.boot.admin.client.url注册Spring Boot Admin 服务端的地址,多个地址之间用逗号分隔。必填属性
spring.boot.admin.client.api-path向服务端注册 Endpoint 的Http URI"instances"
spring.boot.admin.client.username spring.boot.admin.client.passwordSpring Boot Admin 启用认证时,账号、密码信息
spring.boot.admin.client.period重复注册时间间隔,单位毫秒10,000
spring.boot.admin.client.connect-timeout注册连接超时时间,单位毫秒5,000
spring.boot.admin.client.read-timeout注册读取超时时间,单位毫秒5,000
spring.boot.admin.client.auto-registration设置为true, 应用自动开启定时任务,向服务端法搜是那个注册信息true
spring.boot.admin.client.auto-deregistrationSpring Boot Admin 上下文信息关闭时,切换自动注销设置。如未设置该值,当检测到服务端处于运行状态,则该功能处于活跃状态null
spring.boot.admin.client.register-once如果设置为true,客户端将只注册一个管理服务器(按照spring.boot.admin.extence.url定义的顺序);如果该管理服务器停机,将自动向下一个管理服务器注册。如果为false,将在所有管理服务器上注册true
spring.boot.admin.client.instance.health-url健康检查注册URL,可以重写为任意一个课访问的URL,但必须唯一Guessed based on management-url and endpoints.health.id.
spring.boot.admin.client.instance.management-base-url用于计算、管理注册的基础URL,conext 在运行时指定,并附加基础URLGuessed based on management.port, service-url and server.servlet-path.
spring.boot.admin.client.instance.management-url注册URL,可以被覆盖为任意可访问的URLGuessed based on management-base-url and management.context-path.
spring.boot.admin.client.instance.service-base-url用于计算服务注册的基础URL,context在运行时指定,并附加基础URL。在Cloudfoundary环境中,可以切换为: spring.boot.admin.client.instance.service-base-url=https://${vcap.application.uris[0]}Guessed based on hostname, server.port.
spring.boot.admin.client.instance.service-url服务注册URL,可以被覆盖为任意可访问的URLGuessed based on service-base-url and server.context-path.
spring.boot.admin.client.instance.service-path注册的服务路径,可以被覆盖为任意可访问的PATH/
spring.boot.admin.client.instance.name注册服务名${spring.application.name} if set, "spring-boot-application" otherwise.
spring.boot.admin.client.instance.prefer-ip使用IP地址进行服务注册。可以通过参数指定server.address/management.address. 否则默认使用IP地址false
spring.boot.admin.client.instance.metadata.*实例内部以键值对存储的元数据
spring.boot.admin.client.instance.metadata.tags.*实例内部以键值对存储的Tag元数据

服务端参数

Property nameDescriptionDefault value
spring.boot.admin.context-path服务端静态资源的URI访问的 上线文前缀
spring.boot.admin.monitor.status-interval客户端实例状态检查时间间隔10,000ms
spring.boot.admin.monitor.status-lifetime状态生命周期. 上次状态未过期,状态不变更10,000ms
spring.boot.admin.monitor.info-interval客户端实例信息检查时间间隔1m
spring.boot.admin.monitor.info-lifetime信息的生命周期。只要最后一条信息未过期,信息将不会更新1m
spring.boot.admin.monitor.default-timeout默认请求超时时间,可使用spring.boot.admin.monitor.timeout.*`进行覆盖10,000
spring.boot.admin.monitor.timeout.*Endpoints指定的超时时间,每一个Endpoint以endpointid、timeout 进行键值对存储
spring.boot.admin.monitor.default-retries失败请求重试次数,设置请求(PUT, POST, PATCH, DELETE) 不可重试.可使用spring.boot.admin.monitor.retries.*进行参数覆盖0
spring.boot.admin.monitor.retries.*Endpoints重试次数,每一个Endpoint以键值对的形式存储重试次数
spring.boot.admin.metadata-keys-to-sanitize通过正则表达式匹配元数据的值.".**password$", ".\*secret$", ".\*key$", ".\*token$", ".\*credentials.**", ".*vcap_services$"
spring.boot.admin.probed-endpoints对于Spring Boot 1.x客户端应用程序,SBA使用OPTIONS请求探测指定端点。如果路径与id不同,可以将其指定为id:path(例如health:ping)"health", "env", "metrics", "httptrace:trace", "threaddump:dump", "jolokia", "info", "logfile", "refresh", "flyway", "liquibase", "heapdump", "loggers", "auditevents"
spring.boot.admin.instance-auth.enabled从Spring 配置属性中获取认证信息true
spring.boot.admin.instance-auth.default-user-name注册服务时,默认认证账号信息. spring.boot.admin.instance-auth.enabled 必须设置为true.null
spring.boot.admin.instance-auth.default-password注册服务时,默认认证密码信息. spring.boot.admin.instance-auth.enabled` 必须设置为true.null
spring.boot.admin.instance-auth.service-map.*.user-name注册服务时,指定账号信息. spring.boot.admin.instance-auth.enabled` 必须设置为true.
spring.boot.admin.instance-auth.service-map.*.user-password注册服务时,指定密码信息. spring.boot.admin.instance-auth.enabled` 必须设置为true…
spring.boot.admin.instance-proxy.ignored-headers向客户端发送请求时,不携带header 请求头"Cookie", "Set-Cookie", "Authorization"
spring.boot.admin.ui.public-url构建UI方位URL的基础URLIf running behind a reverse proxy (using path rewriting) this can be used to make correct self references. If the host/port is omitted it will be inferred from the request.
spring.boot.admin.ui.brand导航栏中显示的品牌。"<img src="assets/img/icon-spring-boot-admin.svg"><span>Spring Boot Admin</span>"
spring.boot.admin.ui.title页面展示Title信息"Spring Boot Admin"
spring.boot.admin.ui.login-icon登录页面Icon图标."assets/img/icon-spring-boot-admin.svg"
spring.boot.admin.ui.favicon默认桌面通知icon"assets/img/favicon.png"
spring.boot.admin.ui.favicon-danger服务下线,桌面通知icon"assets/img/favicon-danger.png"
spring.boot.admin.ui.remember-me-enabled切换以显示/隐藏登录页面上的“记住我”复选框true
spring.boot.admin.ui.poll-timer.cache设置拉取缓存数据的轮询时间(毫秒)2500
spring.boot.admin.ui.poll-timer.datasource设置拉取数据库数据的轮询时间(毫秒)2500
spring.boot.admin.ui.poll-timer.gc设置获取GC数据的轮询时间(毫秒)2500
spring.boot.admin.ui.poll-timer.process设置获取进程数据的轮询时间(毫秒2500
spring.boot.admin.ui.poll-timer.memory设置获取内存数据的轮询时间(毫秒2500
spring.boot.admin.ui.poll-timer.threads设置获取线程数据的轮询时间(毫秒2500

系统安全

有多种方式解决分布式web应用程序中的身份验证、授权问题。Spring Boot Admin没有提供默认的方式。可以通过集成Spring Security,让Spring Boot Admin UI管理界面提供了简单的登录、注销功能。

服务端设置

添加依赖

<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-security</artifactId>
			<version>2.7.5</version>
		</dependency>

新增配置

# 在application.properties文件新增以下配置
spring.security.user.name=admin
spring.security.user.password=admin

Spring Security 代码

@Configuration(proxyBeanMethods = false)
public class SecuritySecureConfig extends WebSecurityConfigurerAdapter {

  private final AdminServerProperties adminServer;

  private final SecurityProperties security;

  public SecuritySecureConfig(AdminServerProperties adminServer, SecurityProperties security) {
    this.adminServer = adminServer;
    this.security = security;
  }

  @Override
  protected void configure(HttpSecurity http) throws Exception {
    SavedRequestAwareAuthenticationSuccessHandler successHandler = new SavedRequestAwareAuthenticationSuccessHandler();
    successHandler.setTargetUrlParameter("redirectTo");
    successHandler.setDefaultTargetUrl(this.adminServer.path("/"));

    http.authorizeRequests(
        (authorizeRequests) -> authorizeRequests.antMatchers(this.adminServer.path("/assets/**")).permitAll() 
            .antMatchers(this.adminServer.path("/actuator/info")).permitAll()
            .antMatchers(this.adminServer.path("/actuator/health")).permitAll()
            .antMatchers(this.adminServer.path("/login")).permitAll().anyRequest().authenticated() 
    ).formLogin(
        (formLogin) -> formLogin.loginPage(this.adminServer.path("/login")).successHandler(successHandler).and() 
    ).logout((logout) -> logout.logoutUrl(this.adminServer.path("/logout"))).httpBasic(Customizer.withDefaults()) 
        .csrf((csrf) -> csrf.csrfTokenRepository(CookieCsrfTokenRepository.withHttpOnlyFalse()) 
            .ignoringRequestMatchers(
                new AntPathRequestMatcher(this.adminServer.path("/instances"),
                    HttpMethod.POST.toString()), 
                new AntPathRequestMatcher(this.adminServer.path("/instances/*"),
                    HttpMethod.DELETE.toString()), 
                new AntPathRequestMatcher(this.adminServer.path("/actuator/**")) 
            ))
        .rememberMe((rememberMe) -> rememberMe.key(UUID.randomUUID().toString()).tokenValiditySeconds(1209600));
  }

  // Required to provide UserDetailsService for "remember functionality"
  @Override
  protected void configure(AuthenticationManagerBuilder auth) throws Exception {
    auth.inMemoryAuthentication().withUser(security.getUser().getName())
        .password("{noop}" + security.getUser().getPassword()).roles("USER");
  }

}

客户端设置

Spring Boot Admin 客户端设置比较简单,只需要在注册信息携带账号、密码即可

# 在application.properties 配置文件中添加
spring.boot.admin.client.username=admin
spring.boot.admin.client.password=admin

在这里插入图片描述

消息通知

当服务状态变更时,Spring Boot Admin默认支持多种方式进行消息通知,让系统人员第一时间进行处理,下面以发送EMAIL为例:

EMAIL通知

增加依赖

<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-mail</artifactId>
			<version>2.7.5</version>
		</dependency>

添加配置

#授权码
spring.mail.password=TGLDQKDBEDVSUPWZ
spring.mail.port=25
spring.mail.properties.mail.smtp.auth=true
spring.boot.admin.notify.mail.from=xxx@163.com
spring.boot.admin.notify.mail.to=xxx@163.com
spring.mail.properties.mail.smtp.starttls.enable=true
spring.mail.properties.mail.smtp.starttls.required=true

验证结果

当服务端检测到客户端状态从正常到下线时,则触发邮件报警通知:

在这里插入图片描述

服务状态设置

spring.boot.admin.notify.mail.ignore-changes="UNKNOWN:UP"

Spring Boot Admin 可以通过设置以上参数,忽略指定的状态,从而不触发消息报警机制。以上配置表示客户端上线不发送邮件通知.

Spring Boot Admin 定义的服务状态在源码中有体现:

public final class StatusInfo implements Serializable {
    public static final String STATUS_UNKNOWN = "UNKNOWN";
    public static final String STATUS_OUT_OF_SERVICE = "OUT_OF_SERVICE";
    public static final String STATUS_UP = "UP";
    public static final String STATUS_DOWN = "DOWN";
    public static final String STATUS_OFFLINE = "OFFLINE";
    public static final String STATUS_RESTRICTED = "RESTRICTED";
    //...
}

自定义消息通知

Spring Boot Admin 也预留了接口给开发者自定义消息通知,如国内企业比较流行的钉钉、企业微信通知

public class CustomNotifier extends AbstractEventNotifier {

  private static final Logger LOGGER = LoggerFactory.getLogger(LoggingNotifier.class);

  public CustomNotifier(InstanceRepository repository) {
    super(repository);
  }

  @Override
  protected Mono<Void> doNotify(InstanceEvent event, Instance instance) {
    return Mono.fromRunnable(() -> {
      if (event instanceof InstanceStatusChangedEvent) {
        LOGGER.info("Instance {} ({}) is {}", instance.getRegistration().getName(), event.getInstance(),
            ((InstanceStatusChangedEvent) event).getStatusInfo().getStatus());
      }
      else {
        LOGGER.info("Instance {} ({}) {}", instance.getRegistration().getName(), event.getInstance(),
            event.getType());
      }
    });
  }
}

参考:

https://blog.csdn.net/caychen/article/details/82887926

https://blog.csdn.net/weixin_37610397/article/details/104064472

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

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

相关文章

Java多线程:从基本概念到避坑指南

本文为掘金社区首发签约文章&#xff0c;未获授权禁止转载 多核的机器&#xff0c;现在已经非常常见了。即使是一块手机&#xff0c;也都配备了强劲的多核处理器。通过多进程和多线程的手段&#xff0c;就可以让多个CPU同时工作&#xff0c;来加快任务的执行。 多线程&#xf…

户外运动耳机推荐、这几款耳机专为户外运动而生

随着夏日的艳阳离去&#xff0c;秋意渐浓。在这个最适合郊外野游&#xff0c;最适合户外运动的季节&#xff0c;我们当然不能继续做我们的宅男宅女&#xff0c;而应该放任自己到野地里去撒一回野。当然&#xff0c;对于没有数码产品一天都不能活的你来说&#xff0c;即使行走在…

debug(二)(还没完)

视频来源&#xff1a;尚硅谷_宋红康_IDEA2022版本的安装与使用 【【尚硅谷】IDEA2022全新版教程&#xff0c;兼容JDK17&#xff08;快速上手Java开发利器&#xff09;】 https://www.bilibili.com/video/BV1CK411d7aA?p16&vd_source581d732b20cb23e01428068f153a99ed I…

Spring Security(5)

您好&#xff0c;我是湘王&#xff0c;这是我的CSDN博客&#xff0c;欢迎您来&#xff0c;欢迎您再来&#xff5e; 经常上网的人都应该有这样的体验&#xff1a;很多网站或者APP只需要第一次登录时输入用户名和密码之后&#xff0c;后面很长一段时间内就不需要再次输入密码了。…

48种数据分析可视化图表

可视化对于数据分析师来说可能不是最重要的&#xff0c;重要的是你分析或挖掘出来的结果是否有效。在这基础之上就需要通过可视化恰当完整的表达见解。这里又有区别了&#xff1a;实用性和美观性哪个更重要&#xff1f;要我说实用性是第一位的&#xff0c;能用一个元素表达最好…

python中的GUI自动化工具介绍

目录 1.pyautoGui 2.Lackey 3.AXUI 4.winGuiAuto 5.pywinauto 6.总结 1.pyautoGui PyAutoGUI是一个纯Python的GUI自动化工具&#xff0c;通过它可以让程序自动控制鼠标和键盘的一系列操作来达到自动化测试的目的。PyAutoGui 也一个流行的跨平台库&#xff08;具有基于图…

Day5:写前端项目(html+css+js)-导航部分p1

目录 实现折叠按钮 medium screen size 实现折叠按钮 效果图&#xff1a; 如何在调整屏幕尺寸大小的时候&#xff0c;导航栏的列表会从横的变成三条杠杠。就像手风琴导航栏 手风琴button的操作 aria-expanded - Accessibility | MDN <button class"mobile-nav-tog…

【opencv】形态学重建案例-数糖果(细胞)个数

原始图片如下&#xff0c;要求是利用形态学重建方法数出糖果个数 step1&#xff1a;先进行测地膨胀 令F表示标记图像&#xff0c;令G表示模板图像。在讨论中&#xff0c;我们假设两幅图像都是二值图像&#xff0c;且F包含于G。标记图像相对于模板大小为1的测地膨胀定义为 F相对…

ssm分页实战

1. 插件 1. maven <!-- 分页插件 --><dependency><groupId>com.github.pagehelper</groupId><artifactId>pagehelper</artifactId><version>5.2.0</version></dependency> 3. mybaits核心配置文件中或spring配置文件中…

这就叫速度,并发编程深度解析实战七天杀上 GitHub 榜首

并发编程&#xff01;在一二线互联网公司的面试中&#xff0c;逃避不了也是必问的面试题&#xff0c;而绝大部分程序员对并发编程的理解也都停留在使用阶段。那么今天团长给大家推荐的这份资料&#xff0c;绝对可以帮到你。 本书涵盖了六个特点&#xff1a; 特色一&#xff1a…

linux mysql5.7.25 主从复制_生产版本

文章目录一、安装配置1. 部署总览2. 下载软件3. 解压重命名4. 创建组5. 安装数据库6. 配置my.cnf7. 添加开机启动8. 配置数据木库9. 启动mysql10. 登录修改密码11. 允许远程连接二、master节点主从2.1. 主从复制账号创建2.2. 创建主从复制的账号2.3. 账号授权2.4. 查看同步bin-…

VUE的10个常用指令

01 v-once 说明&#xff1a;只渲染元素和组件一次。随后的重新渲染&#xff0c;元素/组件及其所有的子节点将被视为静态内容并跳过。这可以用于优化更新性能。 <!-- 单个元素 --> <span v-once>This will never change: {{msg}}</span> <!-- 有子元素 --&…

二进制逻辑运算和基本门电路

目录 基本门电路很重要&#xff0c;做内存扩展片选译码的时候会常用 一&#xff1a;逻辑非&#xff08;按位取反&#xff09; not 二&#xff1a;逻辑乘&#xff08;逻辑与&#xff09;按位求“与” 有零出零 and 三&#xff1a;逻辑或&#xff08;逻辑加) 有1出1 …

2023-2028年中国化工新材料行业发展前景与投资趋势分析报告

本报告由锐观咨询重磅推出&#xff0c;对中国化工新材料行业的发展现状、竞争格局及市场供需形势进行了具体分析&#xff0c;并从行业的政策环境、经济环境、社会环境及技术环境等方面分析行业面临的机遇及挑战。还重点分析了重点企业的经营现状及发展格局&#xff0c;并对未来…

JavaScript高级复习下(60th)

1、函数内 this 的指向 2、严格模式 1、什么是严格模式 JavaScript 除了提供正常模式外&#xff0c;还提供了 严格模式&#xff08;strict mode&#xff09;。ES5 的严格模式是采用具有限制性 JavaScript 变体的一种方式&#xff0c;即在严格的条件下运行 JS 代码。 严格模式…

说一下 ArrayDeque 和 LinkedList 的区别?

大家好&#xff0c;我是小彭。 在上一篇文章里&#xff0c;我们聊到了基于链表的 Queue 和 Stack 实现 —— LinkedList。那么 Java 中有没有基于数组的 Queue 和 Stack 实现呢&#xff1f;今天我们就来聊聊这个话题。 小彭的 Android 交流群 02 群已经建立啦&#xff0c;扫描…

APP到底有没有权限-恶意拷贝删除照片

作者&#xff1a;黑蛋 近期发生了一件比较恶劣的事情&#xff0c;某客户在某物上面买了一件东西&#xff0c;但是这个东西是假货&#xff0c;所以客户致电某物人工客服&#xff0c;并进行了录音&#xff0c;这时候某物试图通过自身的客户端软件&#xff0c;去删除客户手机上的…

DFP 数据转发协议应用实例 7.使用 DLS1x 与 VSxxx 设备的 LoRA 匹配

DFP 数据转发协议应用实例 7.使用 DLS1x 与 VSxxx 设备的 LoRA 匹配 DFP 是什么&#xff1f; 稳控科技编写的一套数据转发规则&#xff0c; 取自“自由转发协议 FFP&#xff08;Free Forward Protocol&#xff09;” &#xff0c;或者 DFP&#xff08;DoubleF Protocol&#x…

维格云单点登录SSO入门教程

功能简介 无代码维格云单点登录功能支持用户通过配置,将无代码维格云的帐号体系,和提供标准OAuth2.0认证服务系统、LDAP的帐号体系统一起来。 两种单点登录方式的配置见子文档:OAuth 2.0LDAP,本文只描述通用功能:全局单点登录、退出登录后跳转指定页面。 注:本功能为A…

ArcGIS综合制图教程,简单上手!

目的 1、了解专题地图组成的各个要素&#xff1b; 2、掌握ArcGIS编辑专题图的方法和步骤&#xff1b; 实习内容 使用ArcGIS生成1&#xff1a;200万比例尺的浙江省县级行政区划图&#xff0c;并输出成像文件。 实习步骤 一、将ArcGIS切换到Layout视图&#xff0c;并调整页面…