一. Eureka介绍
Eureka是Netflix开源的服务注册发现组件,是一个基于REST的服务,Spring Cloud Eureka是对Netflix公司的Eureka的二次封装,它实现了服务治理的功能,提供了Eureka Server服务端与 Eureka Client客户端,服务端即Eureka服务注册中心,系统中的其他服务,使用Eureka的客户端连接到EurekaServer并维持心跳连接。这样系统的维护人员就可以通过EurekaServer来监控系统中各个微服务是否正常运行,客户端完成微服务向Eureka服务的注册与发现。客户端同时也具备一个内置的使用轮询(round-robin)负载算法均衡器。在微服务启动后,将会向Eureka Server发送心跳(默认周期30秒)。如果Eureka Server在多个心跳周期内没有接收到某个节点的心跳,EurekaServer将会从服务注册表中把这个服务节点移除(默认90秒)。
Eureka Server与 Eureka Client的关系图如下:
1. Eureka Server 是服务端,负责管理各个微服务注册与发现。
2. 在服务上添加Eureka Client代码,就会访问到Eureka Server将此微服务注册在Eureka Server中,从而使服务消费方能够找到。
3. 微服务(服务消费者)需要调用另一个微服务(服务提供者)时,从Eureka Server中获取服务调用地址,进行远程调用。
二. 搭建集群版Eureka 服务注册中心
为了避免Eureka Server的失效,Eureka Server高可用环境需要部署两个及以上Eureka Server,它们互相向对方注册。
2.1 创建两个Eureka Server模块
2.1.1 项目结构,两个服务注册中心的构建类似
2.2.2 配置pom.xml
<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.dsx</groupId>
<artifactId>springcloud-parent</artifactId>
<version>0.0.1-SNAPSHOT</version>
<relativePath>../springcloud-parent/pom.xml</relativePath>
</parent>
<artifactId>springcloud-eureka</artifactId>
<dependencies>
<!-- 导入Eureka-server 服务端依赖 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>
</dependencies>
</project>
2.2.3 配置主启动类
package com.dsx;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer;
@SpringBootApplication
@EnableEurekaServer //标识一个Eureka Server服务注册中心
public class EurekaServerApp_6001 {
public static void main(String[] args) {
SpringApplication.run(EurekaServerApp_6001.class, args);
}
}
2.2.4 配置2台Eureka Server服务端的yml文件
6001服务端模块的application.yml
server:
port: 6001
eureka:
instance:
# eureka服务端的实例名称
hostname: eureka6001.com
client:
# 服务注册,false表示不将自已注册到Eureka服务中
registerWithEureka: false
# 服务发现,false表示自己不从Eureka服务中获取注册信息
fetchRegistry: false
# Eureka客户端与Eureka服务端的交互地址,集群版配置对方的地址,单机版配置自 己(如果不配置则默认本机8761端口)
serviceUrl:
#单机版
# defalutZone: http://${eureka.instance.hostname}:${server.port}/eureka/
# 集群版: 配置其他的Eureka Server服务端访问地址
defaultZone: http://eureka6002.com:6002/eureka/
6002服务端模块的application.yml
server:
port: 6002
eureka:
instance:
# eureka服务端的实例名称
hostname: eureka6002.com
client:
# 服务注册,false表示不将自已注册到Eureka服务中
registerWithEureka: false
# 服务发现,false表示自己不从Eureka服务中获取注册信息
fetchRegistry: false
# Eureka客户端与Eureka服务端的交互地址,集群版配置对方的地址,单机版配置自 己(如果不配置则默认本机8761端口)
serviceUrl:
#单机版
# defalutZone: http://${eureka.instance.hostname}:${server.port}/eureka/
# 集群版: 配置其他的Eureka Server服务端访问地址,多个地址以逗号分隔
defaultZone: http://eureka6001.com:6001/eureka/
2.2.5 将服务提供者注册到2台Eureka Server集群中
基于REST风格的实现,此处只介绍服务提供者的application.xml
server:
port: 8002
mybatis:
config-location: classpath:mybatis/mybatis.cfg.xml # mybatis配置文件所在路径
type-aliases-package: com.dsx.domain # 所有Entity别名类所在包
mapper-locations: classpath:mybatis/mapper/**/*.xml # mapper映射文件
spring:
application:
name: microservice-product #这个很重要,这在以后的服务与服务之间相互调用一般都是根据这个name
datasource:
type: com.alibaba.druid.pool.DruidDataSource # 当前数据源操作类型
driver-class-name: com.mysql.cj.jdbc.Driver # mysql驱动包
url: jdbc:mysql://127.0.0.1:3306/springcloud_db01?serverTimezone=GMT%2B8&characterEncoding=utf-8 # 数据库名称
username: root
password: 数据库密码
dbcp2:
min-idle: 5 # 数据库连接池的最小维持连接数
initial-size: 5 # 初始化连接数
max-total: 5 # 最大连接数
max-wait-millis: 150 # 等待连接获取的最大超时时间
eureka:
client:
# 服务注册开关 开启
registerWithEureka: true
# 服务发现开关
fetchRegistry: true
# 客户端(服务提供者)注册到哪一个Eureka Server服务注册中心,多个用逗号分隔
serviceUrl:
#集群版 Eureka服务注册中心
defaultZone: http://eureka6001.com:6001/eureka,http://eureka6002.com:6002/eureka
#单机版 Eureka服务注册中心
# defaultZone: http://localhost:6001/eureka
instance:
instanceId: ${spring.application.name}:${server.port}#指定实例ID,就不会显示主机
preferIpAddress: true#访问路径可以显示IP地址
服务提供者的pom文件
<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.dsx</groupId>
<artifactId>springcloud-parent</artifactId>
<version>0.0.1-SNAPSHOT</version>
<relativePath>../springcloud-parent/pom.xml</relativePath>
</parent>
<artifactId>springcloud-eureka-provider-8002</artifactId>
<dependencies>
<dependency>
<groupId>com.dsx</groupId>
<artifactId>springcloud-api</artifactId>
<version>${project.version}</version>
</dependency>
<!-- 导入Eureka客户端的依赖,将 微服务提供者 注册进 Eureka -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
<!--springboot web启动器-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- mybatis 启动器-->
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
</dependency>
</dependencies>
</project>
父工程的pom文件
<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>
<groupId>com.dsx</groupId>
<artifactId>springcloud-parent</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>pom</packaging>
<modules>
<module>springcloud-api</module>
<module>springcloud-consumer</module>
<module>springcloud-eureka</module>
<module>springcloud-eureka-provider-8002</module>
<module>springcloud-eureka-6002</module>
</modules>
<!-- spring boot 采用 2.0.7 版本 -->
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.0.7.RELEASE</version>
<relativePath/>
</parent>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
<junit.version>4.12</junit.version>
<!-- spring cloud 采用 Finchley.SR2 版本 -->
<spring-cloud.version>Finchley.SR2</spring-cloud.version>
</properties>
<!--依赖声明-->
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>${spring-cloud.version}</version>
<type>pom</type>
<!--maven不支持多继承,使用import来依赖管理配置-->
<scope>import</scope>
</dependency>
<!--导入 mybatis 启动器-->
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>1.3.2</version>
</dependency>
<!--druid数据源-->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.1.12</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.13</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>${junit.version}</version>
<scope>test</scope>
</dependency>
</dependencies>
</dependencyManagement>
</project>
2.2.6 先启动2个Eureka Server集群(6001,6002)
访问地址:
http://eureka6001.com:6001/
至此简单的Eureka Server的集群就完成了,在搭建项目时,首先要思路清晰,知道每个模块需要实现什么功能及它如何才能实现此功能。在具体代码操作时,还要注意yml文件的格式,避免不必要的错误。Eclipse搭建父子工程可参考博客:https://blog.csdn.net/duan196_118/article/details/104323889
yml语法:
大小写敏感
使用缩进表示层级关系
缩进时不允许使用Tab键,只允许使用空格。
缩进的空格数目不重要,只要相同层级的元素左侧对齐即可
#表示注释,从这个字符一直到行尾,都会被解析器忽略。
如有不同意见,欢迎留言指正。望不吝赐教!!!