注册中心Eureka Server创建并启动之后,接下来介绍如何创建一个Provider并且注册到Eureka Server中,再提供一个REST接口给其他服务调用。
首先一个Provider至少需要两个组件包依赖:Spring Boot Web服务组件和Eureka Client组件。如下所示:
<dependencies>
<!--Spring Boot Web服务组件 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!--Eureka Client组件 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
</dependencies>
Spring Boot Web服务组件用于提供REST接口服务,Eureka Client组件用于服务注册与发现。从以上的Maven依赖可以看出,在Spring Cloud技术体系中,一个Provider首先是一个Spring Boot应用,所以在学习Spring Cloud微服务技术之前必须具备一些基本的Spring Boot开发知识。
然后在Spring Boot应用的启动类上加上**@EnableDiscoveryClient注解**,用于启用Eureka Client组件。
接下来,在Provider模块(或者项目)的src/main/resources的bootstrap启动属性文件(bootstrap.properties或bootstrap.yml)中增加Provider实例相关的配置,具体如下:
spring:
application:
name: uaa-provider
server:
port: 7702
servlet:
context-path: /uaa-provider
eureka:
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: /${server.servlet.context-path}${management.endpoints.web.base-path}/health
client:
register-with-eureka: true #注册到Eureka服务器
fetch-registry: true #是否去注册中心获取其他服务
serviceUrl:
defaultZone: http://${EUREKA_ZONE_HOST:localhost}:7777/eureka/
配置完成后就可以启动provider实例,启动后,打开Eureka Server的控制台界面,可以看到uaa-provider的一个实例已经成功注册。
前面讲到,Spring Cloud中的一个Provider实例身兼两个角色:服务提供者和注册中心客户端。所以,在Provider的配置文件中包含两类配置:Provider实例角色的相关配置和Eureka Client角色的相关配置。
1.Provider实例角色的相关配置
在微服务集群中,Eureka Server自身是一种特殊的服务提供者,对外提供REST服务,所以可以配置一些Provider实例专属的配置项。
- (1)eureka.instance.instance-id:此项用于配置Provider实例ID,如果不进行ID配置,默认值的格式如下:“主机名:服务名称:服务端口”
${spring.cloud.client.hostname}:${spring.application.name}:${server.port}
大多数时候需要将IP显示在instance-id中,只要把主机名替换成IP即可,假设用“IP:端口”的格式来定义,可以使用下面的配置:
eureka.instance.instance-id= ${spring.cloud.client.ip-address}:${server.port}
从“IP:端口”的格式一看就知道provider在哪台机器上,端口是多少。我们还可以单击Eureka Server控制台的服务instance-id进行跳转,去查看实例的详细信息。跳转链接的默认路径是主机名,如果在链接路径时需要使用IP,就要将配置项eureka.instance.preferIpAddress设置为true。
- (2)eureka.instance.ip-address:设置当前实例的IP地址。${spring.cloud.client.ip-address}是从Spring Cloud依赖包中导入的配置项,存放了客户端的IP地址。
- (3)eureka.instance.prefer-ip-address:如果配置为true,就使用IP地址的形式来定义Provider实例的地址,而不是使用主机名来定义Provider实例的地址。
- (4)eureka.instance.status-page-url-path:定义Provider实例状态页面的URL,此选项配置的是相对路径,默认使用HTTP访问,如果需要使用HTTPS,就使用绝对路径配置。默认的相对路径为/info。
- (5)eureka.instance.health-check-url-path:定义Provider实例健康检查页面的URL,此选项配置的是相对路径,默认使用HTTP访问,如果需要使用HTTPS,就使用绝对路径配置。默认的相对路径为/health。
2.Eureka Client组件的相关配置
- (1)eureka.client.register-with-eureka:作为Eureka Client,eureka.client.register-with-eureka表示是否将自己注册到Eureka Server,这里设置为true,表示需要将Provider实例注册到Eureka Server。
- (2)eureka.client.fetch-registry:作为Eureka Client,是否从Eureka Server获取注册信息,这里设置为true,表示需要从Eureka Server定期获取注册了的Provider实例清单。
- (3)eureka.client.service-url.defaultZone:作为Eureka Client,需要向远程的Eureka Server自我注册,查询其他的提供者。此配置项用于设置此客户端默认Zone(类似于默认机房)的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地址发生变化时只需要修改环境变量的值,而不需要修改配置文件。