服务注册和发现 Eureka
1.项目结构如图
图中的pom.xml 是父级pom
eureka-client 和 eureka-server 是两个 Module项目,创建项目都可以用 Spring Initializr 方式创建
spring-boot-starter-parent 为 2.1.1.RELEASE
spring-cloud-dependencies 为 Greenwich.RC1
spring-cloud-starter-netflix-eureka-server 为 2.0.2.RELEASE
spring-cloud-starter-netflix-eureka-client 为 2.0.2.RELEASE
2.父级pom.xml 内容
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.1.1.RELEASE</version> <relativePath/> <!-- lookup parent from repository --> </parent> <groupId>com.hc</groupId> <artifactId>demoparent</artifactId> <version>0.0.1-SNAPSHOT</version> <name>demoparent</name> <packaging>pom</packaging> <description>Demo project for Spring Boot</description> <modules> <module>eureka-client</module> <module>eureka-server</module> </modules> <properties> <java.version>1.8</java.version> <spring-cloud.version>Greenwich.RC1</spring-cloud.version> </properties> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> </dependency> </dependencies> <dependencyManagement> <dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-dependencies</artifactId> <version>${spring-cloud.version}</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build> </project>
3.eureka-server 中 pom.xml 内容
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <parent> <groupId>com.hc</groupId> <artifactId>demoparent</artifactId> <version>0.0.1-SNAPSHOT</version> <relativePath/> <!-- lookup parent from repository --> </parent> <artifactId>eureka-server</artifactId> <dependencies> <!-- 引入关于 eureka-server的依赖 --> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId> <version>2.0.2.RELEASE</version> </dependency> </dependencies> </project>
application.yml 内容
server:
port: 8761
eureka:
client:
register-with-eureka: false
fetch-registry: false
service-url:
defaultZone: http://localhost:${server.port}/eureka/
server:
# 关闭自我保护机制
enable-self-preservation: false
# 每隔10s扫描服务列表,移除失效服务
eviction-interval-timer-in-ms: 10000
主程序入口加上 @EnableEurekaServer
4.eureka-client 中 pom.xml 内容
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <parent> <groupId>com.hc</groupId> <artifactId>demoparent</artifactId> <version>0.0.1-SNAPSHOT</version> <relativePath/> <!-- lookup parent from repository --> </parent> <artifactId>eureka-client</artifactId> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <!-- 引入关于 eureka-server的依赖 --> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId> <version>2.0.2.RELEASE</version> </dependency> <!--运行状态监控--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-actuator</artifactId> </dependency> <!--mybatis配置 start--> <dependency> <groupId>org.mybatis.spring.boot</groupId> <artifactId>mybatis-spring-boot-starter</artifactId> <version>1.2.0</version> </dependency> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>5.1.39</version> </dependency> <!--mybatis配置 end--> </dependencies> </project>
application.yml 内容
server: port: 8762 spring: main: allow-bean-definition-overriding: true datasource: url: jdbc:mysql://192.168.0.1:3306/test1?useUnicode=true&characterEncoding=utf8 username: root password: 123456 driver-class-name: com.mysql.jdbc.Driver application: name: eureka-client001 eureka: client: #改变eureka server的检查方式,使用actuator 的health进行检查,可能会检查到数据库 healthcheck: enabled: true service-url: defaultZone: http://localhost:8761/eureka/ instance: prefer-ip-address: true instanceId: ${spring.application.name}:${server.port} # 每隔10s发送一次心跳 lease-renewal-interval-in-seconds: 10 # 告知服务端30秒还未收到心跳的话,就将该服务移除列表 lease-expiration-duration-in-seconds: 30 #改变eureka 服务端的 status 状态跳转查看页面 status-page-url-path: /actuator/health management: endpoints: web: exposure: include: "*" server: port: 10111 servlet: context-path: / ssl: enabled: false endpoint: health: show-details: always
主程序入口加上 @EnableEurekaClient
创建controller 接口
package com.example.eurekaclient.controller; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; @RestController public class clientController { @RequestMapping("/hello") public String hello() { return "hello this is client001"; } }
5.运行结果
6.spring cloud eureka 配置说明
见博客 https://www.cnblogs.com/li3807/p/7282492.html
配置参数 |
默认值 |
说明 |
服务注册中心配置 |
|
Bean类:org.springframework.cloud.netflix.eureka.server.EurekaServerConfigBean |
eureka.server.enable-self-preservation |
false |
关闭注册中心的保护机制,Eureka 会统计15分钟之内心跳失败的比例低于85%将会触发保护机制,不剔除服务提供者,如果关闭服务注册中心将不可用的实例正确剔除 |
服务实例类配置 |
|
Bean类:org.springframework.cloud.netflix.eureka.EurekaInstanceConfigBean |
eureka.instance.prefer-ip-address |
false |
不使用主机名来定义注册中心的地址,而使用IP地址的形式,如果设置了 eureka.instance.ip-address 属性,则使用该属性配置的IP,否则自动获取除环路IP外的第一个IP地址 |
eureka.instance.ip-address |
|
IP地址 |
eureka.instance.hostname |
|
设置当前实例的主机名称 |
eureka.instance.appname |
|
服务名,默认取 spring.application.name 配置值,如果没有则为 unknown |
eureka.instance.lease-renewal-interval-in-seconds |
30 |
定义服务续约任务(心跳)的调用间隔,单位:秒 |
eureka.instance.lease-expiration-duration-in-seconds |
90 |
定义服务失效的时间,单位:秒 |
eureka.instance.status-page-url-path |
/info |
状态页面的URL,相对路径,默认使用 HTTP 访问,如果需要使用 HTTPS则需要使用绝对路径配置 |
eureka.instance.status-page-url |
|
状态页面的URL,绝对路径 |
eureka.instance.health-check-url-path |
/health |
健康检查页面的URL,相对路径,默认使用 HTTP 访问,如果需要使用 HTTPS则需要使用绝对路径配置 |
eureka.instance.health-check-url |
|
健康检查页面的URL,绝对路径 |
服务注册类配置 |
|
Bean类:org.springframework.cloud.netflix.eureka.EurekaClientConfigBean |
eureka.client.service-url. |
|
指定服务注册中心地址,类型为 HashMap,并设置有一组默认值,默认的Key为 defaultZone;默认的Value为 http://localhost:8761/eureka ,如果服务注册中心为高可用集群时,多个注册中心地址以逗号分隔。 如果服务注册中心加入了安全验证,这里配置的地址格式为:http://<username>:<password>@localhost:8761/eureka 其中 <username> 为安全校验的用户名;<password> 为该用户的密码 |
eureka.client.fetch-registery |
true |
检索服务 |
eureka.client.registery-fetch-interval-seconds |
30 |
从Eureka服务器端获取注册信息的间隔时间,单位:秒 |
eureka.client.register-with-eureka |
true |
启动服务注册 |
eureka.client.eureka-server-connect-timeout-seconds |
5 |
连接 Eureka Server 的超时时间,单位:秒 |
eureka.client.eureka-server-read-timeout-seconds |
8 |
读取 Eureka Server 信息的超时时间,单位:秒 |
eureka.client.filter-only-up-instances |
true |
获取实例时是否过滤,只保留UP状态的实例 |
eureka.client.eureka-connection-idle-timeout-seconds |
30 |
Eureka 服务端连接空闲关闭时间,单位:秒 |
eureka.client.eureka-server-total-connections |
200 |
从Eureka 客户端到所有Eureka服务端的连接总数 |
eureka.client.eureka-server-total-connections-per-host |
50 |
从Eureka客户端到每个Eureka服务主机的连接总数 |