自定义通知事件
- 实现notifier接口
// 此接口在服务端
package de.codecentric.boot.admin.server.notify;
public interface Notifier {
Mono<Void> notify(InstanceEvent var1);
}
复制代码
- AbstractEventNotifier
- AbstractStatusChangeNotifier
可以通过实现Notifier接口,或者继承AbstractEventNotifier或者AbstractStatusChangeNotifier来实现自定义通知事件。其集成关系如下图所示:
以下为自定义实现一个通知程序。
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());
}
});
}
}
复制代码
注入自定义的http请求头
如过想将自定义的http请求头信息注入到监控服务端,需要实现HttpHeadersProvider
package de.codecentric.boot.admin.server.web.client;
public interface HttpHeadersProvider {
HttpHeaders getHeaders(Instance var1);
}
复制代码
自定义实现如下:
@Configuration
@EnableAutoConfiguration
@EnableAdminServer
@Import({SecurityPermitAllConfig.class, SecuritySecureConfig.class, NotifierConfig.class})
public class SpringBootAdminServletApplication {
private static final Logger log = LoggerFactory.getLogger(SpringBootAdminServletApplication.class);
public static void main(String[] args) {
SpringApplication.run(SpringBootAdminServletApplication.class, args);
}
// tag::customization-instance-exchange-filter-function[]
@Bean
public InstanceExchangeFilterFunction auditLog() {
return (instance, request, next) -> next.exchange(request).doOnSubscribe(s -> {
if (HttpMethod.DELETE.equals(request.method()) || HttpMethod.POST.equals(request.method())) {
log.info("{} for {} on {}", request.method(), instance.getId(), request.url());
}
});
}
// end::customization-instance-exchange-filter-function[]
@Bean
public CustomNotifier customNotifier(InstanceRepository repository) {
return new CustomNotifier(repository);
}
@Bean
public CustomEndpoint customEndpoint() {
return new CustomEndpoint();
}
// tag::customization-http-headers-providers[]
@Bean
public HttpHeadersProvider customHttpHeadersProvider() {
return instance -> {
HttpHeaders httpHeaders = new HttpHeaders();
httpHeaders.add("X-CUSTOM", "My Custom Value");
return httpHeaders;
};
}
// end::customization-http-headers-providers[]
}
复制代码
拦截请求和响应
可以通过实现InstanceExchangeFilterFunction接口来拦截和修改对受监视应用程序的执行器端点的请求和响应。这对于审核或添加一些额外的安全检查非常有用。
如上代码中的InstanceExchangeFilterFunction auditLog()
链接或者嵌入外部页面
只需要需改yml文件中的配置即可
# tag::自定义外部视图
spring:
boot:
admin:
ui:
external-views:
- label: "?"
url: http://codecentric.de
order: 2000
# end::customization-external-views
复制代码
自定义视图
可以像ui添加自定义视图,但此视图必须为vue.js的组件。 JavaScript-Bundle和CSS-Stylesheet必须放在类路径上,/META-INF/spring-boot-admin-server-ui/extensions/{name}/以便服务器可以处理他们。spring-boot-admin-samples / spring-boot-admin-sample-custom-ui / [spring-boot-admin-sample-custom-ui]可以做为一个参考。
自定义扩展需要通过调用自身的SBA.use()方法注册,并需要公开一个install()函数,该函数在设置路由时由ui调用。该install()函数接收以下参数以注册视图或回调:
-
引用{github-src} /spring-boot-admin-server-ui/src/main/frontend/viewRegistry.js [viewRegistry]的对象
-
引用{github-src} /spring-boot-admin-server-ui/src/main/frontend/store.js [applicationStore]的对象
-
引用全局Vue [Vue]的对象
-
引用{github-src} /spring-boot-admin-server-ui/src/main/frontend/utils/axios.js [axios]的对象
如果将新的顶级路由添加到前端,则后端也必须知道它们。添加一个/META-INF/spring-boot-admin-server-ui/extensions/{name}/routes.txt包含所有新的顶层路线(每条线路一条路线)。
// 注册组件
SBA.use({
install({viewRegistry}) {
viewRegistry.addView({
name: 'custom', //<1>
path: '/custom', //<2>
component: custom, //<3>
label: 'Custom', //<4>
order: 1000, //<5>
});
}
});
复制代码
添加父级
如下是一个简单的父级视图,用来列出所有的注册的模块。
// spring-boot-admin-sample-custom-ui/src/custom.vue
<template>
<pre v-text="stringify(applications, null, 4)"/>
</template>
<script>
export default {
props: {
applications: { //<1>
type: Array,
required: true
}
},
methods: {
stringify: JSON.stringify
}
};
</script>
复制代码
注册组件如上,在index.js中,并添加路由信息,routes.txt中
/custom/**
复制代码
可视化自定义
以下是自定义可视化端点视图,