0
点赞
收藏
分享

微信扫一扫

Eureka 注册中心

一、服务注册中心Eureka 说明

服务注册中心是服务实现服务化管理的核心组件,主要用来存储服务信息,例如 服务提供者的 url 串、路由信息等。服务注册中心是微服务架构中最基础的设施之一。在微服务架构流行之前,注册中心就已经开始出现在分布式架构的系统中。比如 Dubbo 是一个在国内比较流行的分布式框架,被大量的中小型互联网公司所采用,它提供了比较完善的服务治理功能,而服务治理的实现主要依靠的就是注册中心。

Eureka 一词来源于古希腊词汇,是“发现了”的意思。在软件领域,Eureka 是 Netflix 公司开发的一款开源的服务注册与发现组件。Spring Cloud 将 Eureka 与 Netflix 中的其他开源服务组件(例如 Ribbon、Feign 以及 Hystrix 等)一起整合进 Spring Cloud Netflix 模块中,整合后的组件全称为 Spring Cloud Netflix Eureka。Eureka 是 Spring Cloud Netflix 模块的子模块,它是 Spring Cloud 对 Netflix Eureka 的二次封装,主要负责 Spring Cloud 的服务注册与发现功能。Spring Cloud 使用 Spring Boot 思想为 Eureka 增加了自动化配置,开发人员只需要引入相关依赖和注解,就能将 Spring Boot 构建的微服务轻松地与 Eureka 进行整合。

二、Eureka 两大组件

Eureka 采用 CS(Client/Server,客户端/服务器) 架构,它包括以下两大组件:

  • Eureka Server:Eureka 服务注册中心,主要用于提供服务注册功能。当微服务启动时,会将自己的服务注册到 Eureka Server。Eureka Server 维护了一个可用服务列表,存储了所有注册到 Eureka Server 的可用服务的信息,这些可用服务可以在 Eureka Server 的管理界面中直观看到。
  • Eureka Client:Eureka 客户端,通常指的是微服务系统中各个微服务,主要用于和 Eureka Server 进行交互。在微服务应用启动后,Eureka Client 会向 Eureka Server 发送心跳(默认周期为 30 秒)。若 Eureka Server 在多个心跳周期内没有接收到某个 Eureka Client 的心跳,Eureka Server 将它从可用服务列表中移除(默认 90 秒)。 

注意:“心跳”指的是一段定时发送的自定义信息,让对方知道自己“存活”,以确保连接的有效性。大部分 CS 架构的应用程序都采用了心跳机制,服务端和客户端都可以发心跳。通常情况下是客户端向服务器端发送心跳包,服务端用于判断客户端是否在线。

三、Eureka 服务注册与发现

Eureka 实现服务注册与发现的原理如图所示。

Eureka 注册中心_服务提供者

 上图中共涉及到以下 3 个角色:

  • 服务注册中心(Register Service):它是一个 Eureka Server,用于提供服务注册和发现功能。
  • 服务提供者(Provider Service):它是一个 Eureka Client,用于提供服务。它将自己提供的服务注册到服务注册中心,以供服务消费者发现。
  • 服务消费者(Consumer Service):它是一个 Eureka Client,用于消费服务。它可以从服务注册中心获取服务列表,调用所需的服务。

Eureka 实现服务注册与发现的流程如下:

  1. 搭建一个 Eureka Server 作为服务注册中心;
  2. 服务提供者 Eureka Client 启动时,会把当前服务器的信息以服务名(spring.application.name)的方式注册到服务注册中心;
  3. 服务消费者 Eureka Client 启动时,也会向服务注册中心注册;
  4. 服务消费者还会获取一份可用服务列表,该列表中包含了所有注册到服务注册中心的服务信息(包括服务提供者和自身的信息);
  5. 在获得了可用服务列表后,服务消费者通过 HTTP 或消息中间件远程调用服务提供者提供的服务。

服务注册中心(Eureka Server)所扮演的角色十分重要,它是服务提供者和服务消费者之间的桥梁。服务提供者只有将自己的服务注册到服务注册中心才可能被服务消费者调用,而服务消费者也只有通过服务注册中心获取可用服务列表后,才能调用所需的服务。

四、单机Eureka构建步骤

4.1.EurekaServer端服务注册中心搭建

4.1.1.创建项目Module 名为:

模块名为:cloud-eureka-server7001

Eureka 注册中心_服务提供者_02

4.1.2.在pom中添加内容

直接复制里面的内容即可:

<dependencies>
<!--eureka-server-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>
<dependency>
<groupId>com.augus.springcloud</groupId>
<artifactId>cloud-api-common</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<!--一般为通用配置-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<scope>runtime</scope>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>

4.1.3.在resources目录下创建配置文件

创建配置文件名为:application.yml。内容如下:

server:
port: 7001

spring:
application:
name: cloud-eureka-server

4.1.4.创建主启动类

在com.augus.cloud 包下创建主启动类

注意:需要在启动类上添加 @EnableEurekaServer  声明为eureka的服务端

package com.augus.cloud;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer;

@SpringBootApplication
@EnableEurekaServer
public class EurekaMain7001 {
public static void main(String[] args) {
SpringApplication.run(EurekaMain7001.class, args);
}
}

4.1.5.测试

访问地址:http://localhost:7001/,即可查看如下内容:

Eureka 注册中心_Server_03

注意:出现No application available没有服务被发现 ,因为没有注册服务进来当前不可能有服务被发现

4.2.将EurekaClient端 cloud-provider-payment8001 注册到eureka server作为服务提供者

4.2.1.在 cloud-provider-payment8001的pom中添加eureka依赖

由于8001之前已经创建好了,只需要添加进去即可,引入即可

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

4.2.2.在 cloud-provider-payment8001的application.yml中添加内容

添加的内容,就是设置将8001注册到eurekaServer,直接复制到application.yml中即可

eureka:
client:
# 表示是否将自己注册进eureka实例
register-with-eureka: true
# 是否从eurekaServer抓取已有的注册信息,默认为true
fetch-registry: true
service-url:
defaultZone: http://localhost:7001/eureka

4.2.3.修改主启动类

给主启动类添加  @EnableEurekaClient 注解,表示为eurekaClient

package com.augus.cloud;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;

@SpringBootApplication
@EnableEurekaClient
public class PaymentMain8001 {
public static void main(String[] args) {
SpringApplication.run(PaymentMain8001.class,args);
}
}

4.2.4.测试

先启动EurekaServer

​​http://localhost:7001/​​

Eureka 注册中心_spring_04

4.3.作为服务提供者EurekaClient端cloud-consumer-order80 将注册进EurekaServer成为服务消费者consumer

4.3.1.在cloud-consumer-order80的pom中添加eureka依赖

由于之前已经创建好了,只需要在pom中引入即可

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

4.3.2.在cloud-consumer-order80的application.yml中添加内容

添加的内容,就是设置将80注册到eurekaServer,直接复制到application.yml中即可

eureka:
client:
# 表示是否将自己注册进eureka实例
register-with-eureka: true
# 是否从eurekaServer抓取已有的注册信息,默认为true
fetch-registry: true
service-url:
defaultZone: http://localhost:7001/eureka

4.3.3.修改主启动类

给主启动类添加  @EnableEurekaClient 注解,表示为eurekaClient

package com.augus.springcloud;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;

@SpringBootApplication
@EnableEurekaClient
public class OrderMain80 {
public static void main(String[] args) {
SpringApplication.run(OrderMain80.class,args);
}
}

4.3.4.在测试

先启动EurekaServer,然后访问 http://localhost:7001/,如下图

Eureka 注册中心_spring_05

五、集群Eureka构建步骤

5.1.集群Eureka 原理说明

Eureka 注册中心_Server_06

eureka 注册中心工作原理:

  • 服务注册:将服务信息注册到注册中心,
  • 服务发现:从注册中心上获取服务信息
  • 上述本质是存key服务命令,根据key取value调用地址

eureka集群工作原理

服务提供者集群:

  • 先注册eureka注册中心
  • 启动服务提供者payment支付服务
  • 支付服务启动后,会将自身信息例如像服务地址以别名方式注册进eureka
  • 消费者order服务在需要调用接口的时候,使用服务别名去注册中心获取实际的rpc远程调用地址
  • 消费者获得调用地址后,底层实际是利用httpclient技术实现远程调用
  • 消费者获得远程调用地址后会缓存在本地jvm内存中,默认每次间隔30秒更新一次服务调用地址

微服务RPC远程服务调用最核心的高可用,所以eureka注册中心如果只有一个,出现故障,将会导致整个环境不可用,所以解决的办法就是搭建eureka集群注册中心,实现负载均衡和故障容错,同时可以思考一下,如果服务器提供者也是只有一个,同样也面临着,如果出现故障则整个服务不可用的情况,所以也需要集群解决

5.2.Eureka集群环境构建步骤

5.2.1.参考cloud-eureka-server7001创建cloud-eureka-server7002作为第二个注册中心

选择maven项目

Eureka 注册中心_Server_07

设置项目名称为 cloud-eureka-server7002

 

Eureka 注册中心_spring_08

5.2.2.修改pom

添加的内容如下,这里直接复制即可:

<dependencies>
<!--eureka-server-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>
<dependency>
<groupId>com.augus.springcloud</groupId>
<artifactId>cloud-api-common</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<!--一般为通用配置-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<scope>runtime</scope>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>

5.2.3.修改pom

修改映射配置,Windows找到C:\Windows\System32\drivers\etc路径下的hosts文件,修改映射配置添加hosts文件,添加内容如下,完成后一定需要保存:

127.0.0.1 eureka7001.com
127.0.0.1 eureka7002.com

Eureka 注册中心_Server_09

5.2.3.设置application.yml 配置文件内容

由于集群版设置的和单机版本不一致,所以7001和7002都需要进行修改需要进行修改,内容如下:

  • cloud-eureka-server7001,修改后如下:

server:
port: 7001

spring:
application:
name: cloud-eureka-server

eureka:
instance:
# eureka服务端的实例名称
hostname: eureka7001.com
client:
# false表示不向注册中心注册自己
register-with-eureka: false
# false表示自己端就是注册中心,我的职责就是维护服务实例,并不需要检索服务
fetch-registry: false
service-url:
# 设置与Eureka Server交互的地址查询服务和注册服务都需要依赖这个地址
defaultZone: http://eureka7002.com:7002/eureka/

  • cloud-eureka-server7002,修改后如下:

server:
port: 7002

spring:
application:
name: cloud-eureka-server

eureka:
instance:
# eureka服务端的实例名称
hostname: eureka7002.com
client:
# false表示不向注册中心注册自己
register-with-eureka: false
# false表示自己端就是注册中心,我的职责就是维护服务实例,并不需要检索服务
fetch-registry: false
service-url:
# 设置与Eureka Server交互的地址查询服务和注册服务都需要依赖这个地址
defaultZone: http://eureka7001.com:7001/eureka/

5.2.4.设置cloud-eureka-server7002主启动类

在com.augus.cloud包下创建主启动类 ,主要需要添加@EnableEurekaServer注解

package com.augus.cloud;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer;

@SpringBootApplication
@EnableEurekaServer
public class EurekaMain7002 {
public static void main(String[] args) {
SpringApplication.run(EurekaMain7002.class, args);
}
}

5.2.5.将支付服务8001微服务发布到上面2台Eureka集群配置中

application.yml里面修改后内容如下:

server:
port: 8001

spring:
application:
name: cloud-payment-service
datasource:
# 使用阿里的Druid连接池
type: com.alibaba.druid.pool.DruidDataSource
driver-class-name: com.mysql.cj.jdbc.Driver
# 填写你数据库的url、登录名、密码和数据库名
url: jdbc:mysql://127.0.0.1:3306/db2022?useSSL=false&useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai
username: root
password: 123456
druid:
# 连接池的配置信息
# 初始化大小,最小,最大
initial-size: 5
min-idle: 5
maxActive: 20
# 配置获取连接等待超时的时间
maxWait: 60000
# 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒
timeBetweenEvictionRunsMillis: 60000
# 配置一个连接在池中最小生存的时间,单位是毫秒
minEvictableIdleTimeMillis: 300000
validationQuery: SELECT 1
testWhileIdle: true
testOnBorrow: false
testOnReturn: false
# 打开PSCache,并且指定每个连接上PSCache的大小
poolPreparedStatements: true
maxPoolPreparedStatementPerConnectionSize: 20
# 配置监控统计拦截的filters,去掉后监控界面sql无法统计,'wall'用于防火墙
filters: stat,wall,slf4j
# 通过connectProperties属性来打开mergeSql功能;慢SQL记录
connectionProperties: druid.stat.mergeSql\=true;druid.stat.slowSqlMillis\=5000
# 配置DruidStatFilter
web-stat-filter:
enabled: true
url-pattern: "/*"
exclusions: "*.js,*.gif,*.jpg,*.bmp,*.png,*.css,*.ico,/druid/*"
# 配置DruidStatViewServlet
stat-view-servlet:
url-pattern: "/druid/*"
# IP白名单(没有配置或者为空,则允许所有访问)
allow: 127.0.0.1,192.168.8.109
# IP黑名单 (存在共同时,deny优先于allow)
deny: 192.168.1.188
# 禁用HTML页面上的“Reset All”功能
reset-enable: false
# 登录名
login-username: admin
# 登录密码
login-password: 123456
servlet:
multipart:
#设置文件上传单个文件的大小
max-file-size: 10MB
#设置多个文件上传总文件的大小
file-size-threshold: 100MB

mybatis:
# 指定实体类存放位置
type-aliases-package: com.augus.cloud.pojo
# 配置日志,方便调试
mapper-locations: classpath:mapper/*.xml

# 集群版本
eureka:
client:
register-with-eureka: true
fetch-registry: true
service-url:
# 集群版
defaultZone: http://eureka7001.com:7001/eureka,http://eureka7002.com:7002/eureka

5.2.6.将服务消费者80微服务发布到上面2台Eureka集群配置中

application.yml里面修改后内容如下:

server:
port: 80

spring:
application:
name: cloud-consumer-order

eureka:
client:
register-with-eureka: true
fetch-registry: true
service-url:
#defaultZone: http://localhost:7001/eureka
# 集群版
defaultZone: http://eureka7001.com:7001/eureka,http://eureka7002.com:7002/eureka

5.2.7.测试

先要启动EurekaServer,7001/7002服务,再要启动服务提供者provider,8001,再要启动消费者80

查看注册中心7001,如下图

Eureka 注册中心_服务提供者_10

 查看注册中心7002,如下图:

Eureka 注册中心_服务提供者_11

 通过消费者访问http://localhost/consumer/payment/get/1 查询结果如下:

Eureka 注册中心_spring_12

5.2.8.支付服务提供者集群环境搭建

  • 新建cloud-provider-payment8002,如下:

Eureka 注册中心_spring_13

  •  设置模块名:

Eureka 注册中心_Server_14

  • 给POM中添加内容

<dependencies>

<!-- https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-web -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>

<!-- https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-web -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>

<!-- https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-web -->
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
</dependency>

<!-- https://mvnrepository.com/artifact/com.alibaba/druid -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid-spring-boot-starter</artifactId>
<version>1.2.3</version>
</dependency>

<!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>

<!-- https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-jdbc -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>

<!-- https://mvnrepository.com/artifact/org.projectlombok/lombok -->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>

<!-- https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-test -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>

<!--热部署需要依赖-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<scope>runtime</scope>
<optional>true</optional>
</dependency>

<dependency>
<groupId>com.augus.springcloud</groupId>
<artifactId>cloud-api-common</artifactId>
<version>${project.version}</version>
</dependency>

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

</dependencies>

  • 创建application.yml 内容如下:

server:
port: 8002

spring:
application:
name: cloud-payment-service
datasource:
# 使用阿里的Druid连接池
type: com.alibaba.druid.pool.DruidDataSource
driver-class-name: com.mysql.cj.jdbc.Driver
# 填写你数据库的url、登录名、密码和数据库名
url: jdbc:mysql://127.0.0.1:3306/db2022?useSSL=false&useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai
username: root
password: 123456
druid:
# 连接池的配置信息
# 初始化大小,最小,最大
initial-size: 5
min-idle: 5
maxActive: 20
# 配置获取连接等待超时的时间
maxWait: 60000
# 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒
timeBetweenEvictionRunsMillis: 60000
# 配置一个连接在池中最小生存的时间,单位是毫秒
minEvictableIdleTimeMillis: 300000
validationQuery: SELECT 1
testWhileIdle: true
testOnBorrow: false
testOnReturn: false
# 打开PSCache,并且指定每个连接上PSCache的大小
poolPreparedStatements: true
maxPoolPreparedStatementPerConnectionSize: 20
# 配置监控统计拦截的filters,去掉后监控界面sql无法统计,'wall'用于防火墙
filters: stat,wall,slf4j
# 通过connectProperties属性来打开mergeSql功能;慢SQL记录
connectionProperties: druid.stat.mergeSql\=true;druid.stat.slowSqlMillis\=5000
# 配置DruidStatFilter
web-stat-filter:
enabled: true
url-pattern: "/*"
exclusions: "*.js,*.gif,*.jpg,*.bmp,*.png,*.css,*.ico,/druid/*"
# 配置DruidStatViewServlet
stat-view-servlet:
url-pattern: "/druid/*"
# IP白名单(没有配置或者为空,则允许所有访问)
allow: 127.0.0.1,192.168.8.109
# IP黑名单 (存在共同时,deny优先于allow)
deny: 192.168.1.188
# 禁用HTML页面上的“Reset All”功能
reset-enable: false
# 登录名
login-username: admin
# 登录密码
login-password: 123456
servlet:
multipart:
#设置文件上传单个文件的大小
max-file-size: 10MB
#设置多个文件上传总文件的大小
file-size-threshold: 100MB

mybatis:
# 指定实体类存放位置
type-aliases-package: com.augus.cloud.pojo
# 配置日志,方便调试
mapper-locations: classpath:mapper/*.xml

# 集群版本
eureka:
client:
register-with-eureka: true
fetch-registry: true
service-url:
# 集群版
defaultZone: http://eureka7001.com:7001/eureka,http://eureka7002.com:7002/eureka

  • 创建主启动类,注意需要添加 @EnableEurekaClient 注解

package com.augus.cloud;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;

@SpringBootApplication
@EnableEurekaClient
public class PaymentMain8002 {
public static void main(String[] args) {
SpringApplication.run(PaymentMain8002.class, args);
}
}

  • 创建业务类

业务类中controller、service、dao、mapper只需要从8001复制过来即可,不需要过多处理,就没有列出

  • 修改服务提供者 8001/8002的controller 中内容,如下:

Eureka 注册中心_spring_15

5.2.9.负载均衡设置

修改订单服务访问地址不能固定写死,否则永远只会调用8001这个服务

Eureka 注册中心_Server_16

使用@LoadBalanced注解赋予RestTemplate负载均衡的能力

Eureka 注册中心_服务提供者_17

5.2.10.测试

先要启动EurekaServer,7001/7002服务,再要启动服务提供者provider,8001/8002服务,然后访问 http://localhost/consumer/payment/get/1 会看到8001和8002交替出现,Ribbon和Eureka整合后Consumer可以直接调用服务而不用再关心地址和端口号,且该服务有负载功能.

Eureka 注册中心_Server_18

 

Eureka 注册中心_Server_19

六、actuator微服务信息完善

6.1.主机名称:服务名称修改

6.1.1.当前在注册中心,显示注册的服务的时候,显示的主机名称

如下显示

Eureka 注册中心_服务提供者_20

6.1.2.修改8001和8002的服务名称,指定内容在注册中心显示

在8001和8002的application.yml中添加如下内容:

instance:
# 指定显示的在页面的名称
instance-id: payment8001

Eureka 注册中心_spring_21

6.1.3.修改后,重启所有的服务,内容如下:

会发现他不会在显示主机名,而是会显示指定的服务名称

Eureka 注册中心_Server_22

6.2.访问注册服务 IP信息提示

6.2.1.目前存在问题,访问服务,

你再注册中心显示该服务的时候,没有ip地址的显示,很不方便

6.2.2.解决方法

修改8001和8002的application.yml 配置文件,内容如下:

Eureka 注册中心_服务提供者_23

6.2.3.效果

Eureka 注册中心_spring_24

七、服务发现Discovery

 对于注册eureka里面的微服务,可以通过服务发现来获得该服务的信息

7.1.修改cloud-provider-payment8001的Controller

修改后内容如下:

package com.augus.cloud.controller;

import com.augus.cloud.pojo.CommonResult;
import com.augus.cloud.pojo.Payment;
import com.augus.cloud.service.PaymentService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.cloud.client.ServiceInstance;
import org.springframework.cloud.client.discovery.DiscoveryClient;
import org.springframework.web.bind.annotation.*;

import java.util.List;

@RestController
@Slf4j
public class PaymentController {

@Autowired
private PaymentService paymentService;

@Autowired
private DiscoveryClient discoveryClient;

@Value("${server.port}")
private String serverPort;


@PostMapping(value = "/payment/create")
public CommonResult create(@RequestBody Payment payment){
int i = paymentService.create(payment);
log.info("******插入结果******"+i);
if(i>0){
return new CommonResult(200,"数据新增成功!!!serverPort:"+serverPort, i);
}else {
return new CommonResult(405,"数据新增失败!!!");
}
}


@GetMapping(value = "/payment/get/{id}")
public CommonResult create(@PathVariable("id") Long id){
Payment payment = paymentService.queryById(id);
if (payment!=null){
return new CommonResult(200,"查询成功serverPort:"+serverPort, payment);
}else{
return new CommonResult(400,"查无记录");
}
}

@GetMapping(value = "/payment/discovery")
public Object discovery(){
List<String> services = discoveryClient.getServices();
for (String service : services) {
log.info("**********service:"+service);
}
//显示一个微服务下的所有实例
List<ServiceInstance> instances = discoveryClient.getInstances("CLOUD-PAYMENT-SERVICE");
for (ServiceInstance instance : instances) {
log.info(instance.getServiceId()+"\t"+instance.getHost()+"\t"+instance.getPort()+instance.getUri());
}

return this.discoveryClient;

}

}

Eureka 注册中心_spring_25

7.2.修改8001的启动类

给启动类添加@EnableDiscoveryClient注解

package com.augus.cloud;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;

@SpringBootApplication
@EnableEurekaClient
@EnableDiscoveryClient
public class PaymentMain8001 {
public static void main(String[] args) {
SpringApplication.run(PaymentMain8001.class,args);
}
}

7.3.测试

先要启动EurekaServer,再启动8001主启动类,需要稍等一会,访问http://localhost:8001/payment/discovery,如下图:

Eureka 注册中心_spring_26

八、eureka自我保护

8.1.Eureka的自我保护机制

Eureka服务端会检查最近15分钟内所有Eureka 实例正常心跳占比,如果低于85%就会触发自我保护机制。触发了保护机制,Eureka将暂时把这些失效的服务保护起来,不让其过期,但这些服务也并不是永远不会过期。Eureka在启动完成后,每隔60秒会检查一次服务健康状态,如果这些被保护起来失效的服务过一段时间后(默认90秒)还是没有恢复,就会把这些服务剔除。如果在此期间服务恢复了并且实例心跳占比高于85%时,就会自动关闭自我保护机制。

8.2.为什么会有自我保护机制?

Eureka服务端为了防止Eureka客户端本身是可以正常访问的,但是由于网路通信故障等原因,造成Eureka服务端失去于客户端的连接,从而形成的不可用。因为网络通信是可能恢复的,但是Eureka客户端只会在启动时才去服务端注册。如果因为网络的原因而剔除了客户端,将造成客户端无法再注册到服务端。

8.3.如何选择关闭还是开启自我保护机制

Eureka服务端默认情况下是会开启自我保护机制的。但我们在不同环境应该选择是否开启保护机制。一般情况下,我们会选择在开发环境下关闭自我保护机制,而在生产环境下启动自我保护机制。

开发环境下,我们我们启动的服务数量较少而且会经常修改重启。如果开启自我保护机制,很容易触发Eureka客户端心跳占比低于85%的情况。使得Eureka不会剔除我们的服务,从而在我们访问的时候,会访问到可能已经失效的服务,导致请求失败,影响我们的开发。

在生产环境下,我们启动的服务多且不会反复启动修改。环境也相对稳定,影响服务正常运行的人为情况较少。适合开启自我保护机制,让Eureka进行管理。

如何关闭自我保护机制

8.4.怎么禁止自我保护

8.4.1.注册中心eurekaServer端7001和7002设置
  • 默认,自我保护机制是开启的

eureka.server.enable-self-preservation=true

  • 使用eureka.server.enable-self-preservation=false 可以禁用自我保护模式

分别在7001和7002的application.yml中添加如下内容:

server:
# 关闭自我保护机制,保证不可用服务被及时清除
enable-self-preservation: false
eviction-interval-timer-in-ms: 2000

Eureka 注册中心_服务提供者_27

  •  关闭效果

Eureka 注册中心_服务提供者_28

8.4.2.生产者客户端eurekaClient端8001和8002设置
  • 默认

instance:
# 客户端向注册中心发送心跳的时间间隔,(默认30秒)
lease-renewal-interval-in-seconds: 30
#Eureka注册中心(服务端)在收到客户端心跳之后,等待下一次心跳的超时时间,如果在这个时间内没有收到下次心跳,则移除该客户端。(默认90秒)
lease-expiration-duration-in-seconds: 90

  •  在8001和8002的application.yml中添加如下设置

Eureka 注册中心_服务提供者_29

  • 测试

7001、7002、8001、8002都配置成功,先启动7001、7002再启动8001和8002,先关闭8001,即可看到8001马上在注册中心被剔除了

Eureka 注册中心_Server_30



举报

相关推荐

0 条评论