一般来说springbootadmin会分为服务端,和客户端
服务端需要依赖spring-boot-admin-starter-server
客户端需要依赖spring-boot-admin-starter-client

如果是微服务的话将spingboot admin注册到服务发现中心就可以了

这是官网上的描述

简单来说就是
如果已经将 Spring Cloud Discovery 用于您的应用程序,则不需要 SBA 客户端。只需在 Spring Boot Admin Server 中添加一个 DiscoveryClient,其余的由我们的 AutoConfiguration 完成。
只需要在springbootadmin服务上加上注解@EnableDiscoveryClient,启用发现客户端导入选择器

springboot admin最重要的配置ApplicationRegistry 如下,
我们可以看到getApplications()通过groupID和服务名称获取到了所有已注册程序的应用列表

/** Copyright 2014-2019 the original author or authors.** Licensed under the Apache License, Version 2.0 (the "License");* you may not use this file except in compliance with the License.* You may obtain a copy of the License at**     http://www.apache.org/licenses/LICENSE-2.0** Unless required by applicable law or agreed to in writing, software* distributed under the License is distributed on an "AS IS" BASIS,* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.* See the License for the specific language governing permissions and* limitations under the License.*/package de.codecentric.boot.admin.server.services;import java.time.Instant;
import java.util.List;
import java.util.Map;
import java.util.Objects;import javax.annotation.Nullable;import reactor.core.publisher.Flux;
import reactor.core.publisher.Mono;
import reactor.util.function.Tuple2;
import reactor.util.function.Tuples;import de.codecentric.boot.admin.server.domain.entities.Application;
import de.codecentric.boot.admin.server.domain.entities.Instance;
import de.codecentric.boot.admin.server.domain.values.BuildVersion;
import de.codecentric.boot.admin.server.domain.values.InstanceId;
import de.codecentric.boot.admin.server.domain.values.StatusInfo;
import de.codecentric.boot.admin.server.eventstore.InstanceEventPublisher;import static de.codecentric.boot.admin.server.domain.values.StatusInfo.STATUS_UNKNOWN;
import static java.util.Comparator.naturalOrder;
import static java.util.stream.Collectors.toList;
import static java.util.stream.Collectors.toMap;/*** Registry for all applications that should be managed/administrated by the Spring Boot* Admin server. Backed by an InstanceRegistry for persistence and an* InstanceEventPublisher for events** @author Dean de Bree*/
public class ApplicationRegistry {private final InstanceRegistry instanceRegistry;private final InstanceEventPublisher instanceEventPublisher;public ApplicationRegistry(InstanceRegistry instanceRegistry, InstanceEventPublisher instanceEventPublisher) {this.instanceRegistry = instanceRegistry;this.instanceEventPublisher = instanceEventPublisher;}/*** Get a list of all registered applications.* @return flux of all the applications.*/public Flux<Application> getApplications() {return this.instanceRegistry.getInstances().filter(Instance::isRegistered).groupBy((instance) -> instance.getRegistration().getName()).flatMap((grouped) -> toApplication(grouped.key(), grouped), Integer.MAX_VALUE);}/*** Get a specific application instance.* @param name the name of the application to find.* @return a Mono with the application or an empty Mono if not found.*/public Mono<Application> getApplication(String name) {return this.toApplication(name, this.instanceRegistry.getInstances(name).filter(Instance::isRegistered)).filter((a) -> !a.getInstances().isEmpty());}public Flux<Application> getApplicationStream() {return Flux.from(this.instanceEventPublisher).flatMap((event) -> this.instanceRegistry.getInstance(event.getInstance())).map(this::getApplicationForInstance).flatMap((group) -> toApplication(group.getT1(), group.getT2()));}public Flux<InstanceId> deregister(String name) {return this.instanceRegistry.getInstances(name).flatMap((instance) -> this.instanceRegistry.deregister(instance.getId()));}protected Tuple2<String, Flux<Instance>> getApplicationForInstance(Instance instance) {String name = instance.getRegistration().getName();return Tuples.of(name, this.instanceRegistry.getInstances(name).filter(Instance::isRegistered));}protected Mono<Application> toApplication(String name, Flux<Instance> instances) {return instances.collectList().map((instanceList) -> {Tuple2<String, Instant> status = getStatus(instanceList);return Application.create(name).instances(instanceList).buildVersion(getBuildVersion(instanceList)).status(status.getT1()).statusTimestamp(status.getT2()).build();});}@Nullableprotected BuildVersion getBuildVersion(List<Instance> instances) {List<BuildVersion> versions = instances.stream().map(Instance::getBuildVersion).filter(Objects::nonNull).distinct().sorted().collect(toList());if (versions.isEmpty()) {return null;}else if (versions.size() == 1) {return versions.get(0);}else {return BuildVersion.valueOf(versions.get(0) + " ... " + versions.get(versions.size() - 1));}}protected Tuple2<String, Instant> getStatus(List<Instance> instances) {// TODO: Correct is just a second readmodel for groupsMap<String, Instant> statusWithTime = instances.stream().collect(toMap((instance) -> instance.getStatusInfo().getStatus(), Instance::getStatusTimestamp, this::getMax));if (statusWithTime.size() == 1) {Map.Entry<String, Instant> e = statusWithTime.entrySet().iterator().next();return Tuples.of(e.getKey(), e.getValue());}if (statusWithTime.containsKey(StatusInfo.STATUS_UP)) {Instant oldestNonUp = statusWithTime.entrySet().stream().filter((e) -> !StatusInfo.STATUS_UP.equals(e.getKey())).map(Map.Entry::getValue).min(naturalOrder()).orElse(Instant.EPOCH);Instant latest = getMax(oldestNonUp, statusWithTime.getOrDefault(StatusInfo.STATUS_UP, Instant.EPOCH));return Tuples.of(StatusInfo.STATUS_RESTRICTED, latest);}return statusWithTime.entrySet().stream().min(Map.Entry.comparingByKey(StatusInfo.severity())).map((e) -> Tuples.of(e.getKey(), e.getValue())).orElse(Tuples.of(STATUS_UNKNOWN, Instant.EPOCH));}protected Instant getMax(Instant t1, Instant t2) {return (t1.compareTo(t2) >= 0) ? t1 : t2;}}

@EnableDiscoveryClient的实现类EnableDiscoveryClientImportSelector

/** Copyright 2012-2020 the original author or authors.** Licensed under the Apache License, Version 2.0 (the "License");* you may not use this file except in compliance with the License.* You may obtain a copy of the License at**      https://www.apache.org/licenses/LICENSE-2.0** Unless required by applicable law or agreed to in writing, software* distributed under the License is distributed on an "AS IS" BASIS,* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.* See the License for the specific language governing permissions and* limitations under the License.*/package org.springframework.cloud.client.discovery;import java.util.ArrayList;
import java.util.Arrays;
import java.util.LinkedHashMap;
import java.util.List;import org.springframework.cloud.commons.util.SpringFactoryImportSelector;
import org.springframework.core.Ordered;
import org.springframework.core.annotation.AnnotationAttributes;
import org.springframework.core.annotation.Order;
import org.springframework.core.env.ConfigurableEnvironment;
import org.springframework.core.env.Environment;
import org.springframework.core.env.MapPropertySource;
import org.springframework.core.type.AnnotationMetadata;/*** @author Spencer Gibb*/
@Order(Ordered.LOWEST_PRECEDENCE - 100)
public class EnableDiscoveryClientImportSelectorextends SpringFactoryImportSelector<EnableDiscoveryClient> {@Overridepublic String[] selectImports(AnnotationMetadata metadata) {String[] imports = super.selectImports(metadata);AnnotationAttributes attributes = AnnotationAttributes.fromMap(metadata.getAnnotationAttributes(getAnnotationClass().getName(), true));boolean autoRegister = attributes.getBoolean("autoRegister");if (autoRegister) {List<String> importsList = new ArrayList<>(Arrays.asList(imports));importsList.add("org.springframework.cloud.client.serviceregistry.AutoServiceRegistrationConfiguration");imports = importsList.toArray(new String[0]);}else {Environment env = getEnvironment();if (ConfigurableEnvironment.class.isInstance(env)) {ConfigurableEnvironment configEnv = (ConfigurableEnvironment) env;LinkedHashMap<String, Object> map = new LinkedHashMap<>();map.put("spring.cloud.service-registry.auto-registration.enabled", false);MapPropertySource propertySource = new MapPropertySource("springCloudDiscoveryClient", map);configEnv.getPropertySources().addLast(propertySource);}}return imports;}@Overrideprotected boolean isEnabled() {return getEnvironment().getProperty("spring.cloud.discovery.enabled",Boolean.class, Boolean.TRUE);}@Overrideprotected boolean hasDefaultFactory() {return true;}}

参考链接:Spring Boot Admin 详解(Spring Boot 2.0,基于 Eureka 的实现)

springboot admin整合spingcloud踩坑相关推荐

  1. springboot 2.1 整合 rabbitmq 踩坑 砰砰砰

    rabbitmq安装 rabbitmq安装 centos 7 简单参数说明 使用rabbitmq 需要新增交换机Exchange,队列Queue(队列中还要设置绑定路由关键字RoutingKey) B ...

  2. SpringBoot + Spark on Yan踩坑记

    终极目标 采用SpringBoot集成SparkStreaming+Kafka+Redis+HDFS等组件,打包成jar(下文将之简称为"应用"),运行在Spark on Yan环 ...

  3. springBoot Admin整合nacos

    spring-boot-admin 是一个针对 Spring Boot 的 Actuator 接口进行 UI 美化封装的监控工具,它可以在列表中浏览所有被监控 spring-boot 项目的基本信息. ...

  4. springboot切面不生效踩坑纪录

    今天想写个同步锁的功能,第一反应自然是切面,但写出来之后怎么调试切面都不执行,折腾一下午最后无意中发现了问题所在. 在new文件的时候,注意这个Aspect的选项,当时我想都没想就选了他. 通过他建立 ...

  5. Springboot+阿里云kafka踩坑实录

    场景描述:上文写到,不断接收数据并存放到OSS,现在要把数据存到MQ的kafka一份. springboot版本为1.5.9. 开工之前先阅读阿里云官方kafka消息接入说明:https://help ...

  6. 【Java笔记+踩坑】SpringBoot基础3——开发。热部署+配置高级+整合NoSQL/缓存/任务/邮件/监控

      导航: [黑马Java笔记+踩坑汇总]JavaSE+JavaWeb+SSM+SpringBoot+瑞吉外卖+SpringCloud/SpringCloudAlibaba+黑马旅游+谷粒商城 目录 ...

  7. nginx实现对websocket加密协议wss协议的反向代理以及websocket整合springboot入门(踩坑)

    出发点 最近公司需要有一个推送前端消息的需求 首选websocket进行推送,也做过客服系统接触过,最近看了一点websocket的相关内容记录总结一下. 什么是websocket websocket ...

  8. neo4j springboot 日志_Springboot2.3集成neo4j的过程和踩坑记

    最近有个需求是要使用neo4j这个数据库,看官方的介绍是个图形数据库,官方没有看到和springboot整合的文档(可能是我没找着),那就自己动手吧- 最近有个需求是要使用neo4j这个数据库,看官方 ...

  9. 【Java笔记+踩坑】SpringBoot——基础

      导航: [黑马Java笔记+踩坑汇总]JavaSE+JavaWeb+SSM+SpringBoot+瑞吉外卖+SpringCloud/SpringCloudAlibaba+黑马旅游+谷粒商城 目录 ...

最新文章

  1. linux c 执行shell命令并获取返回结果
  2. Python爬虫-04:贴吧爬虫以及GET和POST的区别
  3. ora-01113 oracle8i,ora-01113解决办法
  4. 【JZOJ4817】【NOIP2016提高A组五校联考4】square
  5. 中常用的函数_ST语言编程中常用的函数/功能块
  6. 【报告分享】2021-2022元宇宙报告-化身与智造:元宇宙座标解析.pdf(附下载链接)...
  7. 9.template -- basic concepts
  8. 判定三角形程序c语言,c语言判定三角形的各种类型——请大家指点
  9. 机器学习- 吴恩达Andrew Ng Week4 神经网络Neural Networks知识总结
  10. 欧姆龙cp1h指令讲解_欧姆龙PLC功能指令
  11. 京瓷打印机p5026cdn_京瓷ECOSYS P5026cdn驱动
  12. Python求极限求积分,编程实现
  13. 富士施乐P375 d打印机设置网络地址
  14. Fiddler - IOS 开启证书(描述文件与设备管理 / 证书信任设置)
  15. 网易游戏策划笔试2019春招题解
  16. 【k8s】kubernetes编写自己的operator(operator-sdk:v1.xxx)
  17. ALPS磁式传感器和轴地磁式传感器
  18. JavaScript 每日一题---LeetCode 121. 买卖股票的最佳时机
  19. Mac上常用软件-2018
  20. 宠物医院称可给怀孕宠物剖腹产 医生一对一护理

热门文章

  1. ARC101E Ribbons on Tree 树形dp 容斥
  2. 计算机信息技术与幼儿教育论文,信息技术应用于幼儿教育论文
  3. Window git 命令设置alias快捷
  4. 三星服务器内存条型号区分,三星内存条怎么样看型号(揭晓三星内存条查看技巧及报价)...
  5. 【限时删】刘*55页ppt大瓜,比项*醒的还要精彩!
  6. SPOJ694 SPOJ705 ——不同子串的总数
  7. 什么是舆情监测系统,如何选择舆情监测系统?
  8. 网页调用迅雷下载文件
  9. Go实战--Gorilla web toolkit使用之gorilla/sessions(iris+sessions)
  10. 深度学习后门攻防综述