服务提供者的创建和配置注册中心Eureka Server创建并启动之后,接下来介绍如何创建一个Provider并且注册到EurekaServer中,再提供一个REST接口给其他服务调用。在本书的配套源码crazy-springcloud脚手架中设计了3个Provider:uaa-provider、demo-provider、seckill-provider。
它们的关系如图2-3所示。
图2-3 本书配套源码中的服务提供者这里,以uaa-provider服务提供者为例来介绍Provider的创建和配置。首先一个Provider至少需要两个组件包依赖:Spring Boot Web服务组件和Eureka Client组件。如下所示:
Spring Boot Web服务组件用于提供REST接口服务,Eureka Client组件用于服务注册与发现。
从以上的Maven依赖可以看出,在Spring Cloud技术体系中,一个Provider首先是一个Spring Boot应用,所以在学习Spring Cloud微服务技术之前必须具备一些基本的Spring Boot开发知识。
然后在Spring Boot应用的启动类上加上@EnableDiscoveryClient注解,用于启用Eureka Client组件。启动类的代码如下:package com.crazymaker.springcloud.user.info.start;//省略import@SpringBootApplication@EnableEurekaClientpublic class UAACloudApplication{ public static void main { SpringApplication.run; }}
接下来,在Provider模块的src/main/resources的bootstrap启动属性文件中增加Provider实例相关的配置,具体如下:spring: application: name: uaa-providerserver: port: 7702 servlet: context-path: /uaa-providereureka: instance: instance-id: ${spring.cloud.client.ip-address}:${server.port} ip-address: ${spring.cloud.client.ip-address} prefer-ip-address: true #访问路径优先使用IP地址 status-page-url-path: /${server.servlet.context-path}${management.endpoints.web.base-path}/info health-check-url-path:client: register-with-eureka: true #注册到Eureka服务器 fetch-registry: true #是否去注册中心获取其他服务 serviceUrl: defaultZone: http://${EUREKA_ZONE_HOST:localhost}:7777/eureka/
在详细介绍上面的配置项之前,先启动一下Provider的启动类,控制台的日志大致如下:...com.netflix.discovery.DiscoveryClient - DiscoveryClient_UAA-PROVIDER/192.168.233.128:7702: registering service.........com.netflix.discovery.DiscoveryClient - DiscoveryClient_UAA-PROVIDER/192.168. 233.128:7702 - registration status: 204
如果看到上面的日志,就表明Provider实例已经启动成功,可以进一步通过Eureka Server检查服务是否注册成功:打开Eureka Server的控制台界面,可以看到uaa-provider的一个实例已经成功注册,如图2-4所示。图2-4 uaa-provider实例已经成功注册到Eureka Server中前面讲到,Spring Cloud中的一个Provider实例身兼两个角色:服务提供者和注册中心客户端。
所以,在Provider的配置文件中包含两类配置:Provider实例角色的相关配置和Eureka Client角色的相关配置。1.Provider实例角色的相关配置在微服务集群中,Eureka Server自身是一种特殊的服务提供者,对外提供REST服务,所以可以配置一些Provider实例专属的配置项。
eureka.instance.instance-id:此项用于配置Provider实例ID,如果不进行ID配置,默认值的格式如下:${spring.cloud.client.hostname}:${spring.application.name}:${server.port}
翻译过来就是“主机名:服务名称:服务端口”。
默认情况下,在Eureka Web控制台可以看到uaaprovider实例的instance-id为localhost:demo-provider:7700。大多数时候需要将IP显示在instance-id中,只要把主机名替换成IP即可,假设用“IP:端口”的格式来定义,可以使用下面的配置:eureka.instance.instance-id= ${spring.cloud.client.ip-address}:${server.port}
从“IP:端口”的格式一看就知道uaa-provider在哪台机器上,端口是多少。我们还可以单击EurekaServer控制台的服务instance-id进行跳转,去查看实例的详细信息。
跳转链接的默认路径是主机名,如果在链接路径时需要使用IP,就要将配置项eureka.instance.preferIpAddress设置为true。eureka.instance.ip-address:设置当前实例的IP地址。${spring.cloud.client.ip-address}是从Spring Cloud依赖包中导入的配置项,存放了客户端的IP地址。eureka.instance.prefer-ip-address:如果配置为true,就使用IP地址的形式来定义Provider实例的地址,而不是使用主机名来定义Provider实例的地址。
eureka.instance.status-page-url-path:定义Provider实例状态页面的URL,此选项配置的是相对路径,默认使用HTTP访问,如果需要使用HTTPS,就使用绝对路径配置。默认的相对路径为/info。eureka.instance.health-check-url-path:定义Provider实例健康检查页面的URL,此选项配置的是相对路径,默认使用HTTP访问,如果需要使用HTTPS,就使用绝对路径配置。默认的相对路径为/health。
2.Eureka Client组件的相关配置eureka.client.register-with-eureka:作为Eureka Client,eureka.client.register-witheureka表示是否将自己注册到Eureka Server,这里设置为true,表示需要将Provider实例注册到EurekaServer。eureka.client.fetch-registry:作为Eureka Client,是否从Eureka Server获取注册信息,这里设置为true,表示需要从Eureka Server定期获取注册了的Provider实例清单。eureka.client.service-url.defaultZone:作为Eureka Client,需要向远程的Eureka Server自我注册,查询其他的提供者。此配置项用于设置此客户端默认Zone的EurekaServer的交互地址,这里配置的是2.1.2节启动的端口为7777的Eureka Server:eureka.client.service-url.defaultZone= http://${EUREKA_ZONE_HOST:localhost}:7777/eureka/
为了安全和方便,地址中并没有以硬编码方式设置Eureka Server的IP地址,而是使用了事先在操作系统中配置好的指向Eureka IP地址的环境变量EUREKA_ZONE_HOST,之所以这样配置,主要是为了后续在Eureka Server的IP地址发生变化时只需要修改环境变量的值,而不需要修改配置文件。
服务提供者的续约服务提供者的续约保活由Provider Instance主动定期执行来实现,每隔一段时间就调用Eureka Server提供的REST保活接口,发送Provider Instance的状态信息给注册中心,告诉注册中心注册者还在正常运行。Provider Instance的续约默认是开启的,续约默认的间隔是30秒,也就是每30秒会向Eureka Server发起续约操作。如果要修改Provider Instance的续约时间间隔,可以使用如下配置选项:eureka: instance: lease-renewal-interval-in-seconds: 5 #心跳时间,即服务续约间隔时间 lease-expiration-duration-in-seconds: 15 #租约有效期,即服务续约到期时间
上述两个配置项的说明如下:eureka.instance.lease-renewal-interval-in-seconds:表示Provider Instance的Eureka Client组件发送续约给EurekaServer的时间间隔,上面的配置表示每隔5秒发送一次续约心跳。
eureka.instance.lease-expiration-duration-inseconds:此配置项设置了租约有效期,在租约时间内,如果EurekaClient未续约,Eureka Server将剔除该服务。上面配置的租约有效期为15秒,心跳为5秒,也就是说,Provider Instance有3次心跳重试机会。租约有效期需要合理设置,如果有效期太长,那么在服务消费客户端访问的时候,该Provider Instance可能已经宕机了。
如果该值设置得太小,那么Provider Instance很可能因为临时的网络抖动而被Eureka Server剔除掉。Eureka Server提供了多个和Provider Instance相关的Spring上下文ApplicationEvent。当Server启动、服务注册、服务下线、服务续约等事件发生时,Eureka Server会发布相对应的ApplicationEvent,以方便应用程序进行监听。下面介绍几个常见的Eureka Server应用事件。
EurekaInstanceRenewedEvent:服务续约事件。EurekaInstanceRegisteredEvent:服务注册事件。EurekaInstanceCanceledEvent:服务下线事件。
EurekaRegistryAvailableEvent:Eureka注册中心启动事件。EurekaServerStartedEvent:Eureka Server启动事件。如果需要监听Provider Instance的服务注册、服务下线、服务续约等事件,那么可以在Eureka Server中编写相应的事件监听程序,如下所示:package com.crazymaker.springcloud.cloud.center.eureka;//省略import@Component@Slf4jpublic class EurekaStateChangeListener { @EventListener public void listen{ log.info,event.getAppName); } @EventListener public void listen{ InstanceInfo inst = event.getInstanceInfo; log.info, inst.getPort,inst.getAppName); } @EventListener public void listen{ log.info,event.getAppName); } @EventListener public void listen{ log.info; }}
加上事件监听后,一旦Eureka Server收到续约事件,就会在控制台输出。
免责声明:本平台仅供信息发布交流之途,请谨慎判断信息真伪。如遇虚假诈骗信息,请立即举报
举报