四、Spring cloud之服务发现/注册(Eureka)

一、Spring Cloud Eureka

(一)Eureka服务器
  Eureka Server 是 Eureka Client 的注册服务中心,管理所有注册服务、以及其实例信息和状态。

1、引入Maven依赖

		<dependency>
			<groupId>org.springframework.cloud</groupId>
			<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
		</dependency>

2、激活Eureka服务器
@EnableEurekaServer

/**
 * 激活 EurekaServer
 */
@EnableEurekaServer
@SpringBootApplication
public class EurekaServerApplication {

	public static void main(String[] args) {
		SpringApplication.run(EurekaServerApplication.class, args);
	}
}

3、调整Eureka服务器配置
application.properties

# Spring Cloud Eureka 服务器应用名称
spring.application.name=spring-cloud-eureka-server

# Spring Cloud Eureka 服务器服务端口
server.port=9090

management.server.port=9091
management.endpoints.web.exposure.include=*
management.endpoints.web.base-path=/

4、检验Eureka Server
异常堆栈信息

2018-11-02 22:07:46.253 ERROR 8792 --- [           main] c.n.d.s.t.d.RedirectingEurekaHttpClient  : Request execution error

com.sun.jersey.api.client.ClientHandlerException: java.net.ConnectException: Connection refused: connect

访问 Eureka Server http://localhost:9090/,运行效果:
在这里插入图片描述

异常原因:Eureka Server既是注册服务器,也是客户端。默认情况,也需要配置注册中心地址。

5、再次调整Eureka服务器配置(解决异常的方法)

# Spring Cloud Eureka 服务器应用名称
spring.application.name=spring-cloud-eureka-server

# Spring Cloud Eureka 服务器服务端口
server.port=9090

management.server.port=9091
management.endpoints.web.exposure.include=*
management.endpoints.web.base-path=/
management.endpoint.health.show-details=always

#Spring Cloud Eureka 服务器作为注册中心
# 通常情况下,不需要再注册到其他注册中心
# 同时,它不需要湖区客户端信息
#非集群模式下,需要配置 register-with-eureka 和 fetch-registry
#取消向注册中心注册
eureka.client.register-with-eureka=false
#取消向注册中心获取注册信息(服务、实例信息)
eureka.client.fetch-registry=false

(二)Eureka客户端
  Eureka Client 为当前服务提供注册、同步、查找服务以及其实例信息或状态等能力。

1、引入Maven依赖

		<dependency>
			<groupId>org.springframework.cloud</groupId>
			<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
		</dependency>

2、激活Eureka客户端
@EnableEurekaClient 或者 @EnableDiscoveryClient(二选一)

/**
 * 激活 Eureka 客户端
 */
@EnableEurekaClient
@SpringBootApplication
public class EurekaClientApplication {

	public static void main(String[] args) {
		SpringApplication.run(EurekaClientApplication.class, args);
	}
}

3、调整Eureka客户端配置
application.properties

# Spring Cloud Eureka 客户端应用名称
spring.application.name=spring-cloud-eureka-client

# Spring Cloud Eureka 客户端服务端口
server.port=8080

management.server.port=8081
management.endpoints.web.exposure.include=*
management.endpoints.web.base-path=/

4、检验Eureka 客户端
异常堆栈信息
PS:和 Eureka 服务端 启动异常相同!

2018-11-02 22:07:46.253 ERROR 8792 --- [           main] c.n.d.s.t.d.RedirectingEurekaHttpClient  : Request execution error

com.sun.jersey.api.client.ClientHandlerException: java.net.ConnectException: Connection refused: connect

5、再次调整Eureka客户端配置(解决异常的方法)

# Spring Cloud Eureka 客户端应用名称
spring.application.name=spring-cloud-eureka-client

# Spring Cloud Eureka 客户端服务端口
server.port=8080

management.server.port=8081
management.endpoints.web.exposure.include=*
management.endpoints.web.base-path=/

#Spring Cloud Eureka 客户端 注册到 Eureka 服务器
#Eureka 服务端的URI/eureka
eureka.client.service-url.defaultZone=http://localhost:9090/eureka

(三)配置 Eureka 客户端 Actuator 端点

1、调整状态页面

#调整状态页面(PS:Eureka 服务器会定时请求这个URI,检查Eureka 客户端的状态,这里我们自定义一个链接,StatusController)
#注意:这里要采用自定义链接的话,Actuator 端点的端口必须保持和客户端应用端口一致
eureka.instance.status-page-url-path=/status

2、调整健康检查页面

#调整健康检查页面
eureka.instance.health-check-url-path=/health

3、调整主页(同上)

(四)客户端配置API
1、Eureka 客户端配置 API(配置客户端的一些基本信息)
EurekaClientConfigBean
2、Eureka 实例配置 API(配置 调整状态页面 相关的信息)
EurekaInstanceConfigBean

二、Spring Cloud Config 和 Eureka 整合

(一)调整 spring-cloud-config-server 作为 Eureka 的客户端

1、引入Maven依赖

		<dependency>
			<groupId>org.springframework.cloud</groupId>
			<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
		</dependency>

2、激活Eureka客户端
@EnableEurekaClient 或者 @EnableDiscoveryClient(二选一)

/**
 * 注解:@EnableConfigServer,激活配置服务端
 * 注解:@EnableEurekaClient,激活Eureka客户端
 */
@SpringBootApplication
@EnableEurekaClient
@EnableConfigServer
public class ConfigServerApplication {

	public static void main(String[] args) {
		SpringApplication.run(ConfigServerApplication.class, args);
	}
}

3、调整 spring-cloud-config-server 配置
application.properties

# Spring Cloud Eureka 客户端应用名称
spring.application.name=spring-cloud-config-server
#配置服务器远程 git 仓库(GitHub)
spring.cloud.config.server.git.uri=https://github.com/pc-nju/spring-cloud-config.git
#强制拉取 git 内容
spring.cloud.config.server.git.force-pull=true
# Spring Cloud Eureka 客户端服务端口
server.port=7070

management.endpoints.web.exposure.include=*
management.endpoints.web.base-path=/
management.endpoint.health.show-details=always
eureka.instance.status-page-url-path=/health

#Spring Cloud Eureka 客户端 注册到 Eureka 服务器
#Eureka 服务端的URI/eureka
eureka.client.service-url.defaultZone=http://localhost:9090/eureka

(二)调整 spring-cloud-eureka-client 成为 Spring Cloud Config Client(配置客户端)

1、引入Maven依赖

		<dependency>
			<groupId>org.springframework.cloud</groupId>
			<artifactId>spring-cloud-starter-config</artifactId>
		</dependency>

2、ClassPath 下创建 bootstrap.properties,并配置 Config 客户端

#配置 客户端应用 关联的 应用(通过该选项与 服务端 相连)
# spring.cloud.config.name 是可选的,若未配置,采用 ${spring.application.name}
spring.cloud.config.name=myapplication

#关联 profile
spring.cloud.config.profile=prod

#关联 label
spring.cloud.config.label=master

#配置 Config 配置服务器URI
#激活 Config 服务器发现
spring.cloud.config.discovery.enabled=true
#配置 Config 服务器的引用名称(service-id)
spring.cloud.config.discovery.service-id=spring-cloud-config-server

3、检验效果
  启动发现,spring-cloud-config-server 服务无法找到,原因如下:

注意:
  如果当前应用需要提前获取应用信息,那么需要将 Eureka 客户端 注册到 Eureka 服务器配置项“eureka.client.service-url.defaultZone”提前至 bootstrap.properties文件。
原因:
  我们在配置Config 服务器的应用名称时,实质是 Eureka 客户端在 Eureka 服务器中通过应用名称,找到对应的 Config 服务器,所以前提是,必须先将 Eureka 客户端 注册到 Eureka服务器。而bootstrap 上下文是 Spring Boot 上下文的父上下文,它是最先加载的,所以需要将“eureka.client.service-url.defaultZone”配置项放到bootstrap.properties中。

4、将eureka.client.service-url.defaultZone配置项由application.properties转至bootstrap.propertiess
  调整后的bootstrap.properties如下:

#Spring Cloud Eureka 客户端 注册到 Eureka 服务器
#Eureka 服务端的URI/eureka
eureka.client.service-url.defaultZone=http://localhost:9090/eureka

#配置 客户端应用 关联的 应用(通过该选项与 服务端 相连)
# spring.cloud.config.name 是可选的,若未配置,采用 ${spring.application.name}
spring.cloud.config.name=myapplication

#关联 profile
spring.cloud.config.profile=prod

#关联 label
spring.cloud.config.label=master


#激活 Config 服务器发现
spring.cloud.config.discovery.enabled=true
#配置 Config 服务器的应用名称(service-id,注意这里其实是 Eureka 客户端在 Eureka 服务器中通过
# 应用名称,找到对应的 Config 服务器,所以前提是,必须先将 Eureka 客户端 注册到 Eureka 服务器。
# 而bootstrap 上下文是 Spring Boot 上下文的父上下文,它是最先加载的,所以需要将
# “eureka.client.service-url.defaultZone”配置项放到bootstrap.properties)
spring.cloud.config.discovery.service-id=spring-cloud-config-server

5、再次检验效果
  访问http://localhost:8080/env,即可发现读取了远程 git 仓库中的配置文件:

{
"name": "configService:configClient",
"properties": {
"config.client.version": {
"value": "76ad01e6c20aa2f60613eff2fd06aa902f8143e7"
}
}
}, {
"name": "configService:https://github.com/pc-nju/spring-cloud-config.git/myapplication-prod.properties",
"properties": {
"name": {
"value": "myapplication.com"
},
"my.user.id": {
"value": "1111111"
},
"my.user.name": {
"value": "nb"
}
}
}, {
"name": "configService:https://github.com/pc-nju/spring-cloud-config.git/myapplication.properties",
"properties": {
"name": {
"value": "myapplication"
}
}
},

三、Spring Cloud Config Server 、 Eureka Client 和 Eureka Server 整合之后的数据模型

在这里插入图片描述

1、首先创建一个Eureka Server
2、然后创建一个 Config Server,并将 Config Server改造成一个Eureka Client,然后将其注册到Eureka Server
3、最后,创建一个Eureka Client,同时将其改造成一个 Config Client,然后将其注册到 Eureka Server。所以这个应用,既是 Eureka 客户端,又是 Config 客户端
4、Eureka Client 通过 Config 服务器应用名(service-id),去 Eureka Server 找到配置服务器,从而读取远程配置。(有别于三、Spring cloud之服务器配置和客户端配置中 Config Client 通过具体的ip,去找配置服务器,这样更加灵活)

猜你喜欢

转载自blog.csdn.net/panchang199266/article/details/83662713