springCloud Eureka在idea中可以借助 spring Assitant 或者 spring initlizar
》选择默认的 https://start.spring.io
》new opject -> spring Assitant / spring initlizar ->next
》选择 maven project 输入groupid,projectname,artifactId
》Cloud Discovery -> Eureka Server
其实也就是在pom.xml中引入了一个jar包
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId> </dependency>
应用启动类添加eureka服务:
@EnableEurekaServer
启动报错:Cannot execute request on any known server
eureka.client.register-with-eureka=true eureka.client.fetchRegistry=true
启动时,会去发现并注册进别的节点中,但是对应的节点没有启用,因此单机时可将其设置为false。同时只是提示,并不是错误,不妨碍运行。
同时这些是Eureka Server并非提供者和消费者,也无需将自己注入到注册表中。
在application.properties 标记:
server.port=8761 spring.application.name=eureka eureka.client.service-url.defaultZone=http://localhost:8761/eureka/ #注册中心地址 eureka.client.register-with-eureka=false eureka.client.fetchRegistry=false server.enable-self-preservation=true
启动应用:
通过 http://localhost:8761/ 即可查看当前的eureka页面。
警告:EMERGENCY! EUREKA MAY BE INCORRECTLY CLAIMING INSTANCES ARE UP WHEN THEY'RE NOT. RENEWALS ARE LESSER THAN THRESHOLD AND HENCE THE INSTANCES ARE NOT BEING EXPIRED JUST TO BE SAFE.
自我保护已开启,未发现其它节点。
如果配置有context-path
server.context-path= /eurekaServer
则后面 eureka.client.service-url.defaultZone=http://localhost:8761/eurekaServer/eureka/
健康监测:
eureka.client.healthcheck.enabled=true
设置健康监测,这样就可以通过
/actuator/health 查看健康状态。
其中 DS Replicas会列有当前的集群信息。
集群搭建。创建多个 application-e1.properties / application-e2.properties /application-e3.properties
server.port=8761 spring.application.name=eureka eureka.instance.hostname=e1 eureka.client.service-url.defaultZone=http://10.130.12.51:8762/eureka/,http://10.130.12.51:8763/eureka/ #注册中心地址 eureka.client.register-with-eureka=true eureka.client.fetchRegistry=true server.enable-self-preservation=true
server.port=8762 spring.application.name=eureka eureka.instance.hostname=e2 eureka.client.service-url.defaultZone=http://10.130.12.51:8761/eureka/,http://10.130.12.51:8763/eureka/ #注册中心地址 eureka.client.register-with-eureka=true eureka.client.fetchRegistry=true server.enable-self-preservation=true
server.port=8763 spring.application.name=eureka eureka.instance.hostname=e3 eureka.client.service-url.defaultZone=http://10.130.12.51:8761/eureka/,http://10.130.12.51:8762/eureka/ #注册中心地址 eureka.client.register-with-eureka=true eureka.client.fetchRegistry=true server.enable-self-preservation=true
将e1,e2, e3 配置在 /etc/hosts 中,此处是因为 将3个挂在一个 hostname 上而区分server名。
然后在应用启动中执行:
nohup java -jar station-eureka-0.0.1-SNAPSHOT.jar --spring.profiles.active=e1 &
nohup java -jar station-eureka-0.0.1-SNAPSHOT.jar --spring.profiles.active=e2 &
nohup java -jar station-eureka-0.0.1-SNAPSHOT.jar --spring.profiles.active=e3 &
配置后,在页面 http://10.130.12.51:8761/ ,http://10.130.12.51:8761/ , http://10.130.12.51:8761/ 都可以访问到彼此信息。
http://10.130.12.51:8761/eureka/apps 这可看到应用信息
-----------------------------------------------------------------------------------------
对于搭建的eureka页面如果不希望一般人直接访问,可以添加账号密码验证。
pom.xml引入security
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-security</artifactId> </dependency>
在配置文件 application.properties中添加:
spring.security.user.name=admin
spring.security.user.password=admin123
增加security类处理:
@Configuration @EnableWebSecurity public class WebSecurityConfig extends WebSecurityConfigurerAdapter { @Override protected void configure(HttpSecurity http) throws Exception { // 关闭csrf http.csrf().disable(); http.authorizeRequests().anyRequest().authenticated().and().httpBasic(); } }
http://127.0.0.1:8761/login
对eureka的注册地址也需要自动添加信任的账号和密码:
eureka.client.serviceUrl.defaultZone=http://admin:admin123@localhost:8761/eureka/
eureka还提供监控接口,来处理状态变更后的处理事件:
- EurekaInstanceCanceledEvent 服务下线事件。
- EurekaInstanceRegisteredEvent 服务注册事件。
- EurekaInstanceRenewedEvent 服务续约事件。
- EurekaRegistryAvailableEvent Eureka 注册中心启动事件。
- EurekaServerStartedEvent Eureka Server 启动事件。
@Component public class EurekaStateChangeListener { @EventListener public void listen(EurekaInstanceCanceledEvent event) { System.err.println(event.getServerId() + "\t" + event.getAppName() + " 服务下线 "); }