本文共 12006 字,大约阅读时间需要 40 分钟。
上一节 学习了基于springboot1.5自己注册到admin的方法。接下来学习结合Eureka使用以及2.0的改变。
我们继续上一节的项目修改,admin-server依赖修改如下
de.codecentric spring-boot-admin-starter-server de.codecentric spring-boot-admin-server-ui org.springframework.cloud spring-cloud-starter-eureka org.springframework.cloud spring-cloud-dependencies ${spring-cloud.version} pom import
修改启动类,添加
@EnableDiscoveryClient@EnableAdminServer
修改配置文件application.properties
server.port=8081spring.application.name=admin-servereureka.client.serviceUrl.defaultZone=${EUREKA_SERVICE_URL:http://localhost:8761}/eureka/management.security.enabled=false
注意,这里的eureka server要提前启动。具体细节,参见
到这里就结束,可以直接启动。admin会自己拉取Eureka上注册的app信息,主动去注册。这也是唯一区别之前手动注册的地方,就是client端不需要admin-client的依赖,也不需要配置admin地址了,一切全部由admin-server自己实现。这样的设计对环境变化很友好,不用改了admin-server后去改所有app的配置了。
以为2.0比1.5区别不大,也确实不很大。关于client主动注册的部分没有变化。
这里,重新学习一遍,并添加上安全登录功能。
项目地址:
添加spring-boot-admin-server, 最终pom依赖如下
org.springframework.boot spring-boot-starter-parent 2.0.2.RELEASE UTF-8 UTF-8 1.8 2.0.0 Finchley.RC2 de.codecentric spring-boot-admin-starter-server org.springframework.boot spring-boot-starter-web org.springframework.boot spring-boot-starter-security org.springframework.boot spring-boot-starter-actuator org.springframework.cloud spring-cloud-starter-netflix-eureka-client de.codecentric spring-boot-admin-dependencies ${spring-boot-admin.version} pom import org.springframework.cloud spring-cloud-dependencies ${spring-cloud.version} pom import org.springframework.boot spring-boot-maven-plugin build-info central http://maven.aliyun.com/nexus/content/groups/public/ aliyun spring-milestones Spring Milestones https://repo.spring.io/milestone false
注意到里面添加spring cloud eureka的依赖,我们也把admin给注册到eureka。
spring: application: name: admin-server profiles: active: - secure# tag::configuration-eureka[]eureka: #<1> instance: leaseRenewalIntervalInSeconds: 10 health-check-url-path: /actuator/health #2.0后actuator的地址发生了变化 client: registryFetchIntervalSeconds: 5 serviceUrl: defaultZone: ${EUREKA_SERVICE_URL:http://localhost:8761}/eureka/# 2.0开始,actuator默认不开放,所以要设置为开放management: endpoints: web: exposure: include: "*" #<2> endpoint: health: show-details: ALWAYSserver: port: 8081# end::configuration-eureka[]---spring: profiles: insecure---# admin登录的用户名和密码spring: profiles: secure security: user: name: "user" password: "password"# 注册给eureka的时候告诉eureka自己的密码eureka: instance: metadata-map: "user.name": ${spring.security.user.name} #These two are needed so that the server "user.password": ${spring.security.user.password} #can access the protected client endpoints
首先,我们同时支持两种安全配置,一种没有安全认证,一种有。注意到前面的依赖pom里有security的依赖。针对security方案,需要配置用户名和密码。
其次,配置了eureka client相关参数,把自己注册到eureka里。
然后,关于actuator的端点接口,设置为全部开放。
最后,设置我们的用户名和密码,并把用户名和密码放到eureka里,方便识别。
最终的启动类如下
@EnableDiscoveryClient@EnableAdminServer@SpringBootApplicationpublic class AdminServerApplication { public static void main(String[] args) { SpringApplication.run(AdminServerApplication.class, args); } @Profile("insecure") @Configuration public static class SecurityPermitAllConfig extends WebSecurityConfigurerAdapter { @Override protected void configure(HttpSecurity http) throws Exception { http.authorizeRequests().anyRequest().permitAll()// .and().csrf().disable(); } } @Profile("secure") @Configuration public static class SecuritySecureConfig extends WebSecurityConfigurerAdapter { private final String adminContextPath; public SecuritySecureConfig(AdminServerProperties adminServerProperties) { this.adminContextPath = adminServerProperties.getContextPath(); } @Override protected void configure(HttpSecurity http) throws Exception { // @formatter:off SavedRequestAwareAuthenticationSuccessHandler successHandler = new SavedRequestAwareAuthenticationSuccessHandler(); successHandler.setTargetUrlParameter("redirectTo"); http.authorizeRequests() .antMatchers(adminContextPath + "/assets/**").permitAll() .antMatchers(adminContextPath + "/login").permitAll() .anyRequest().authenticated() .and() .formLogin().loginPage(adminContextPath + "/login").successHandler(successHandler) .and() .logout().logoutUrl(adminContextPath + "/logout").and() .httpBasic().and() .csrf().disable(); // @formatter:on } }}
和之前没啥不同,唯一的区别是添加了安全认证相关的,即采用secure模式的时候必须输入用户名和密码。
我们启动并选择激活配置环境secure
访问localhost:8081
登录
详细页
界面确实比1.5好很多啊。
依旧采用手动注册的方式,新建一个springboot项目,项目地址
首先,pom依赖要有eureka
4.0.0 com.test provider-demo 0.0.1-SNAPSHOT jar provider-demo Demo project for Spring Boot org.springframework.boot spring-boot-starter-parent 2.0.2.RELEASE UTF-8 UTF-8 1.8 Finchley.RC2 2.0.0 org.springframework.boot spring-boot-starter-web org.springframework.boot spring-boot-starter-actuator org.springframework.boot spring-boot-starter-security org.springframework.cloud spring-cloud-starter org.springframework.cloud spring-cloud-starter-netflix-eureka-client de.codecentric spring-boot-admin-starter-client org.springframework.boot spring-boot-devtools runtime org.springframework.boot spring-boot-starter-test test io.springfox springfox-swagger2 2.7.0 io.springfox springfox-swagger-ui 2.7.0 org.projectlombok lombok org.springframework.cloud spring-cloud-dependencies ${spring-cloud.version} pom import de.codecentric spring-boot-admin-dependencies ${spring-boot-admin.version} pom import org.springframework.boot spring-boot-maven-plugin build-info central http://maven.aliyun.com/nexus/content/groups/public/ aliyun spring-milestones Spring Milestones https://repo.spring.io/milestone false
注意,配置了eureka,用来注册。
依赖springfox-swagger2用来展示API。
spring-boot-admin-starter-client才是主动注册的核心库,用来发送注册申请。
需要再次强调了是build
org.springframework.boot spring-boot-maven-plugin build-info
这里是为了生成版本信息,提供给spring-boot-admin展示。
eureka: instance: leaseRenewalIntervalInSeconds: 10 health-check-url-path: /actuator/health client: registryFetchIntervalSeconds: 5 serviceUrl: defaultZone: ${EUREKA_SERVICE_URL:http://localhost:8761}/eureka/management: endpoints: web: exposure: include: "*" endpoint: health: show-details: ALWAYSserver: port: 8082spring: application: name: provider-demo boot: admin: client: url: "http://localhost:8081" password: password username: user instance: prefer-ip: true
eureka的配置和admin-server相同,毕竟都是eureka的client嘛。不同的是这里没有开启spting security,所以不添加用户名和密码信息到meta-data里。
actuator同样需要暴露全部。
关于spring-boot-admin-client的注册配置里多了username和password,这个不是自己的,而是admin-server设置的,即前文的里的。
启动后就可以看到前面的详细信息了。
在1.5版本里,我们只要加上eureka注册,就可以admin-server自动发现所有的app并自己注册监控了。但这里居然行不通了。我调试了几个小时,把依赖包翻来覆去研究了好多遍----就是不行!!!
无奈,只好去github把spring-boot-admin的源码下载下来,找到注册的代码开始追踪。我发现,根本没有提供任何和eureka注册中心相关的代码。看到了spring-boot-admin-server-cloud, 进去看了源码,这里有关于注册中心的监听代码,也就是admin自动发现app的密码所在。那我把这个加入dependency不就好了吗,太年轻。加上后发现找不到版本。我说不应该啊,我有导入dependencyManagement的pom啊。手动指定版本也不行。最后无奈的发现,原来根本没有发布!!!
️Note: Since Spring Cloud Finchley is not released yet, this version doesn't include Spring Cloud Discovery support
所以,手动注册吧,骚年。不然你再等等。
通过这一下午的尝试,追踪源码,我发现自己确实挺乐在其中的。然而,这花费了大量的时间和精力。所以,我花费了更多的时间一定要把这次经历记录下来,也就是本文了。想说的是,最新的版本果然是坑巨多,慎入!!!如果是作为生产环境的选型,必须跳过这样的版本。当然,如果是自己个人研究,看新的没错。
那么,我到底应不应该学习2.0呢,毕竟1.5也没学完呢。
学吧,按2.0的学习,工作中还是用1.5. 嗯,就这样吧。
没有解决不了的bug,只要你用心研究,都可以解决。
关注我的公众号
转载地址:http://qnycx.baihongyu.com/