spring Cloud-NETFLIX-Eureka(服务注册)
1.创建服务注册中心(Spring Cloud Netflix的Eureka)
创建maven主工程
然后创建两个model
一个作为服务注册中心,即Eureka Server
另外一个作为Eureka Client。
Eureka Server的创建
启动服务注册中心
为eureka增加密码
第一步,为Eureka服务端(eureka-server)添加安全认证依赖:
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-security</artifactId> </dependency>
第二步,增加application.yml配置文件:
###服务端口号 server: port: 8100 ###服务名称 spring: application: name: app-eureka-center security: basic: enable: true #开启基于HTTP basic的认证 高版本的spring cloud不用这个配置 user: #配置用户的账号信息 name: zpc password: 123456 eureka: instance: #注册中心地址 hostname: 127.0.0.1 ###客户端调用地址 client: serviceUrl: defaultZone: http://${spring.security.user.name}:${spring.security.user.password}@${eureka.instance.hostname}:8100/eureka/ ###是否将自己注册到Eureka服务中,因为该应用本身就是注册中心,不需要再注册自己(集群的时候为true) register-with-eureka: false ###是否从Eureka中获取注册信息,因为自己为注册中心,不会在该应用中的检索服务信息 fetch-registry: true
第三步,在eurka服务端添加一个安全认证类:
package com.zpc.springcloud.eureka; import org.springframework.context.annotation.Configuration; import org.springframework.security.config.annotation.web.builders.HttpSecurity; import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity; import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter; import org.springframework.security.config.http.SessionCreationPolicy; @Configuration @EnableWebSecurity public class WebSecurityConfig extends WebSecurityConfigurerAdapter { /** * 高版本springcloud的丢弃了配置: * * security: * basic: * enabled: true * * 所以应该使用以下方式开启 * * @param http * @throws Exception */ @Override protected void configure(HttpSecurity http) throws Exception { // Configure HttpSecurity as needed (e.g. enable http basic). http.sessionManagement().sessionCreationPolicy(SessionCreationPolicy.NEVER); http.csrf().disable(); //注意:为了可以使用 http://${user}:${password}@${host}:${port}/eureka/ 这种方式登录,所以必须是httpBasic, // 如果是form方式,不能使用url格式登录 http.authorizeRequests().anyRequest().authenticated().and().httpBasic(); } }
第四步,重新启动Eureka服务进行测试:
Eureka Client的创建
1.创建过程:无
如果eureka是带有密码的。客户端的url需要修改一下
http://用户名:密码@IP:端口/eureka
例子:http://zpc:123456@127.0.0.1:8100/eureka
如果要注册多eureka集群中,需要配置多个defaultZone
e.g: defaultZone: http://zpc:123456@127.0.0.1:8100/eureka/,http://zpc:123456@127.0.0.1:9100/eureka/
Eureka的自我保护模式
如图,当前Eureka进入了自我保护模式。(先开启Eureka server端和client端,然后再断开client端,此时刷新Eureka界面,就会看到红色字样)
在短时间内丢失了服务实例的心跳,不会剔除该服务,这是eurekaserver的自我保护机制的宗旨。主要是为了防止由于短暂的网络故障误删除可用的服务。
所以,一般进入自我保护模式,无需处理。如果,需要禁用自我保护模式,只需要在配置文件中添加配置即可:
(测试环境、开发环境可以关闭自我保护机制,保证服务不可用时及时剔除)
配置方式:在server端 配置文件中添加server: 配置
eureka: instance: #注册中心地址 hostname: 127.0.0.1 ###客户端调用地址 client: serviceUrl: defaultZone: http://${spring.security.user.name}:${spring.security.user.password}@${eureka.instance.hostname}:8100/eureka/ register-with-eureka: false fetch-registry: true server: enable-self-preservation: false #禁用自我保护模式 evictionIntervalTimerInMs: 15000 #驱逐下线的服务,默认是60,此配置建议只试用开发和测试环境 responseCacheUpdateIntervalMs: 2000 #服务可用列表缓存刷新时间,毫秒
下图代表关闭了保护模式
提示,如果禁用自我保护模式,在网络通信故障下可能会出现问题,因为服务可能只是短暂的不可用。
上述界面出现后,断开client端,此时刷新Eureka界面,就会看到红色字样,同时会把服务实例从注册中心剔除:No instances available
Eureka的高可用(Eureka集群)
搭建Eureka集群非常简单,只要启动多个Eureka Server服务并且让这些Server端之间彼此进行注册即可实现。
第一步,修改eureka server端的application.yml文件:
- 端口为8100的机器注册到端口为9100的注册中心
###服务端口号 server: port: 8100 ###服务名称 spring: application: name: app-eureka-center security: basic: enable: true #开启基于HTTP basic的认证 user: #配置用户的账号信息 name: zpc password: 123456 eureka: instance: #注册中心地址 hostname: 127.0.0.1 ###客户端调用地址 client: serviceUrl: defaultZone: http://${spring.security.user.name}:${spring.security.user.password}@${eureka.instance.hostname}:9100/eureka/ ###是否将自己注册到Eureka服务中,为true的时候可以在ek界面看到。为false看不到 register-with-eureka: true fetch-registry: true server: enable-self-preservation: false
第二步,修改配置文件,再建一个Eureka server工程,启动两个工程(两个工程的name属性一样)测试:
- 端口为9100的机器注册到端口为8100的注册中心
###服务端口号 server: port: 9100 ###服务名称 spring: application: name: app-eureka-center security: basic: enable: true #开启基于HTTP basic的认证 user: #配置用户的账号信息 name: zpc password: 123456 eureka: instance: #注册中心地址 hostname: 127.0.0.1 ###客户端调用地址 client: serviceUrl: defaultZone: http://${spring.security.user.name}:${spring.security.user.password}@${eureka.instance.hostname}:8100/eureka/ ###是否将自己注册到Eureka服务中,为true的时候可以在ek界面看到。为false看不到
register-with-eureka: true fetch-registry: true ###测试环境、开发环境可以关闭自我保护机制,保证服务不可用时及时剔除 server: enable-self-preservation: false eviction-interval-timer-in-ms: 2000 #清理间隔
指定ek上注册的服务的IP地址
在服务的提供者配置文件中可以指定ip地址,如下:
###服务注册到eureka注册中心的地址 eureka: client: service-url: defaultZone: http://zpc:123456@127.0.0.1:8100/eureka/,http://zpc:123456@127.0.0.1:9100/eureka/ ###因为该应用为服务提供者,是eureka的一个客户端,需要注册到注册中心 register-with-eureka: true ###是否需要从eureka上检索服务 fetch-registry: true instance: prefer-ip-address: true #将自己的ip地址注册到Eureka服务中 ip-address: 127.0.0.1
指定实例id
通过instance-id 参数指定服务注册到Eureka中的服务实例id:
eureka: client: service-url: defaultZone: http://zpc:123456@127.0.0.1:8100/eureka/,http://zpc:123456@127.0.0.1:9100/eureka/ ###因为该应用为服务提供者,是eureka的一个客户端,需要注册到注册中心 register-with-eureka: true ###是否需要从eureka上检索服务 fetch-registry: true instance: prefer-ip-address: true #将自己的ip地址注册到Eureka服务中 ip-address: 127.0.0.1 instance-id: ${spring.application.name}###${server.port} #指定应用名+端口
###或者用下面这个
instanceId: ${spring.cloud.client.ip-address}:${server.port}#指定IP+端口
踢出eureka上错误的服务
日常开发中,可能出现开发人员不小心把本地的服务注册到测试环境的EK的情况。要怎么解决呢?
1.开发人员关闭本地服务,EK服务端配置保护模式,将不可用的服务自动剔除
2.主动触发下线
使用postman
请求格式为: /eureka/apps/{application.name}/
ip端口为EK访问地址的IP、端口
EK服务生命周期监控
EurekaInstanceCanceledEvent 服务下线事件
EurekaInstanceRegisteredEvent 服务注册事件
EurekaInstanceRenewedEvent 服务续约事件
EurekaRegistryAvailableEvent Eureka注册中心启动事件
EurekaServerStartedEvent Eureka Server启动事件
服务端:
配置
server: port: 8081 eureka: instance: hostname: localhost client: registerWithEureka: false fetchRegistry: false serviceUrl: defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/ server: #关闭自我保护 enable-self-preservation: false #清理间隔 eviction-interval-timer-in-ms: 5000
进行监听时服务配置这里的 关闭自我保护和清理间隔一定要打开
服务监听类
package com.lhw.event; import com.netflix.appinfo.InstanceInfo; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.cloud.netflix.eureka.server.event.*; import org.springframework.context.event.EventListener; import org.springframework.stereotype.Component; @Component public class EurekaStateListener { private final static Logger logger = LoggerFactory.getLogger(EurekaStateListener.class); @EventListener public void listen(EurekaInstanceCanceledEvent event) { logger.info("服务{}已下线", event.getAppName()); logger.info("server地址信息{}", event.getServerId()); } @EventListener public void listen(EurekaInstanceRegisteredEvent event) { InstanceInfo instanceInfo = event.getInstanceInfo(); logger.info("服务{}进行注册", instanceInfo.getAppName()+ instanceInfo.getHostName() +" "+ instanceInfo.getIPAddr() +" "+ instanceInfo.getPort()); } @EventListener public void listen(EurekaInstanceRenewedEvent event) { logger.info("服务{}进行续约", event.getServerId() +" "+ event.getAppName()); } @EventListener public void listen(EurekaRegistryAvailableEvent event) { logger.info("注册中心启动,{}", System.currentTimeMillis()); } @EventListener public void listen(EurekaServerStartedEvent event) { logger.info("注册中心服务端启动,{}", System.currentTimeMillis()); } }
客户端:
客户端配置
spring: application: name: lhwTest eureka: instance: # 每间隔1s,向服务端发送一次心跳,证明自己依然”存活“ lease-renewal-interval-in-seconds: 1 # 告诉服务端,如果我2s之内没有给你发心跳,就代表我“死”了,将我踢出掉。 lease-expiration-duration-in-seconds: 2 client: serviceUrl: defaultZone: http://localhost:8081/eureka/ server: port: 8082
客户端启动文件
package com.lhw.clientTest; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cloud.netflix.eureka.EnableEurekaClient; @SpringBootApplication @EnableEurekaClient public class MemberApp { public static void main(String[] args){ SpringApplication.run(MemberApp.class, args); } }
测试:
服务端日志:
客户端日志
关闭客户端 服务端控制台打印如下信息