一、工程搭建
1、新建 microservicecloud-eureka-7001 模块
2、pom.xml文件
4.0.0
cn.smilexl.springcloud
microservicecloud
0.0.1-SNAPSHOT
microservicecloud-eureka-7001
org.springframework.cloud
spring-cloud-starter-netflix-eureka-server
org.springframework.boot
spring-boot-devtools
true
3、application.yml文件
server:
port: 7001
eureka:
instance:
hostname: localhost #eureka服务端的实例名称
client:
register-with-eureka: false #false表示不向注册中心注册自己。
fetch-registry: false #false表示自己端就是注册中心,我的职责就是维护服务实例,并不需要去检索服务
service-url:
# 设置与Eureka Server交互的地址查询服务和注册服务都需要依赖这个地址(单机)。
defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/
4、创建 EurekaServer7001_App.java 主启动类
package cn.smilexl.springcloud;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer;
@SpringBootApplication
@EnableEurekaServer //EurekaServer服务器端启动类,接受其它微服务注册进来
public class EurekaServer7001_App {
public static void main(String[] args) {
SpringApplication.run(EurekaServer7001_App.class, args);
}
}
浏览器中查看:localhost:7001
二、将已有的部门微服务注册进eureka服务中心
1、修改 microservicecloud-provider-dept-8001
(1)、pom.xml文件修改
- 修改部分
org.springframework.cloud
spring-cloud-starter-netflix-eureka-client
- 完整内容
4.0.0
cn.smilexl.springcloud
microservicecloud
0.0.1-SNAPSHOT
microservicecloud-provider-dept-8001
cn.smilexl.springcloud
microservicecloud-api
${project.version}
junit
junit
mysql
mysql-connector-java
com.alibaba
druid
ch.qos.logback
logback-core
org.mybatis.spring.boot
mybatis-spring-boot-starter
org.springframework.boot
spring-boot-starter-jetty
org.springframework.boot
spring-boot-starter-web
org.springframework.boot
spring-boot-starter-test
org.springframework.cloud
spring-cloud-starter-netflix-eureka-client
org.springframework.boot
spring-boot-starter-actuator
(2)、application.yml文件修改
- 修改部分
eureka:
client: #客户端注册进eureka服务列表内
service-url:
defaultZone: http://localhost:7001/eureka
- 完整内容
server:
port: 8001
mybatis:
# config-location: classpath:mybatis/mybatis.cfg.xml # mybatis配置文件所在路径
type-aliases-package: cn.smilexl.springcloud.entities # 所有Entity别名类所在包
mapper-locations: classpath:mapper/**/*.xml # mapper映射文件
spring:
application:
name: microservicecloud-dept # 微服务名
datasource:
type: com.alibaba.druid.pool.DruidDataSource # 当前数据源操作类型
driver-class-name: org.gjt.mm.mysql.Driver # mysql驱动包
url: jdbc:mysql://47.99.218.123:3306/clouddb01 # 数据库名称
username: root
password: 123456
dbcp2:
min-idle: 5 # 数据库连接池的最小维持连接数
initial-size: 5 # 初始化连接数
max-total: 5 # 最大连接数
max-wait-millis: 200 # 等待连接获取的最大超时时间
eureka:
client: #客户端注册进eureka服务列表内
service-url:
defaultZone: http://localhost:7001/eureka
(3)、DeptProvider8001_App.java 启动类上面添加注解
- 启动类上添加注解:
@EnableDiscoveryClient //本服务启动后会自动注册进eureka服务中;
- 完整内容
package cn.smilexl.springcloud;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
@SpringBootApplication
@EnableDiscoveryClient //本服务启动后会自动注册进eureka服务中
public class DeptProvider8001_App {
public static void main(String[] args) {
SpringApplication.run(DeptProvider8001_App.class, args);
}
}
(4)、测试
- 依次启动 microservicecloud-eureka-7001、microservicecloud-provider-dept-8001
三、actuator(制动器)与注册信息的完善
1、主机名称:微服务名称修改
(1)、当前问题: 含有主机名称。
(2)、修改 microservicecloud-provider-dept-8001
- yml修改部分
eureka:
client: #客户端注册进eureka服务列表内
service-url:
defaultZone: http://localhost:7001/eureka
instance:
instance-id: microservicecloud-dept-8001 #自定义服务名称信息
prefer-ip-address: true #访问路径可以显示IP地址
- yml完整部分
server:
port: 8001
mybatis:
config-location: classpath:mybatis/mybatis.cfg.xml # mybatis配置文件所在路径
type-aliases-package: com.smilexl.springcloud.entities # 所有Entity别名类所在包
mapper-locations:
- classpath:mybatis/mapper/**/*.xml # mapper映射文件
spring:
application:
name: servicespringcloud-dept
datasource:
type: com.alibaba.druid.pool.DruidDataSource # 当前数据源操作类型
driver-class-name: org.gjt.mm.mysql.Driver # mysql驱动包
url: jdbc:mysql://47.99.218.123:3306/clouddb01 # 数据库名称
username: root
password: 123456
dbcp2:
min-idle: 5 # 数据库连接池的最小维持连接数
initial-size: 5 # 初始化连接数
max-total: 5 # 最大连接数
max-wait-millis: 200 # 等待连接获取的最大超时时间
eureka:
client: #客户端注册进eureka服务列表内
service-url:
defaultZone: http://localhost:7001/eureka
instance:
instance-id: microservicecloud-dept-8001 #自定义服务名称信息
prefer-ip-address: true #访问路径可以显示IP地址
(3)、修改完之后
2、微服务info内容详细信息
(1)、当前问题:点击超链接报错
(2)、修改 microservicecloud-provider-dept-8001
- pom.xml 文件添加依赖
org.springframework.boot
spring-boot-starter-actuator
(3)、总的父工程 microservicecloud 修改pom.xml添加构建 build 信息
microservicecloud
src/main/resources
true
org.apache.maven.plugins
maven-resources-plugin
$
(4)、修改 microservicecloud-provider-dept-8001
- yml 文件中添加内容
#点击超链接后显示信息
info:
app.name: microservicecloud
company.name: www.smilexl.com
build.artifactId: $project.artifactId$
build.version: $project.version$
- yml 完整内容
server:
port: 8001
mybatis:
# config-location: classpath:mybatis/mybatis.cfg.xml # mybatis配置文件所在路径
type-aliases-package: cn.smilexl.springcloud.entities # 所有Entity别名类所在包
mapper-locations: classpath:mapper/**/*.xml # mapper映射文件
spring:
application:
name: servicespringcloud-dept # 微服务名
datasource:
type: com.alibaba.druid.pool.DruidDataSource # 当前数据源操作类型
driver-class-name: org.gjt.mm.mysql.Driver # mysql驱动包
url: jdbc:mysql://47.99.218.123:3306/clouddb01 # 数据库名称
username: root
password: 123456
dbcp2:
min-idle: 5 # 数据库连接池的最小维持连接数
initial-size: 5 # 初始化连接数
max-total: 5 # 最大连接数
max-wait-millis: 200 # 等待连接获取的最大超时时间
eureka:
client: #客户端注册进eureka服务列表内
service-url:
defaultZone: http://localhost:7001/eureka
instance:
instance-id: microservicecloud-dept-8001 #自定义服务名称信息
prefer-ip-address: true #访问路径可以显示IP地址
#点击超链接后显示信息
info:
app.name: microservicecloud
company.name: www.smilexl.com
build.artifactId: $project.artifactId$
build.version: $project.version$
四、Eureka自我保护机制
在自我保护模式中,EurekaServer会保护服务注册表中的信息,不再注销任何服务实例。当它收到的心跳数重新恢复到阈值以上时,该EurekaServer节点就会自动退出自我保护模式。它的设计哲学就是宁可保留错误的服务注册信息,也不盲目注销任何可能健康的服务实列。一句话:好死不如赖活着。
自我保护模式时一种应对网络异常的安全保护措施,它的架构哲学时宁可同时保留所有微服务(健康的微服务和不健康的微服务都会保留),也不盲目注销任何健康的微服务,使用自我保护模式,可以让Eureka集群更加的健壮、稳定。
一句话,某时刻某一个服务不可用了,eureka不会立刻清理,依旧会对该微服务的信息进行保存。
可以啊使用 eureka.server.enable-self-preservation = false 禁用自我保护模式。
五、Eureka服务发现Discovery(了解)
对注册进eureka里面的微服务,可以通过服务发现来获得该服务的信息
六、Eureka集群配置
1、原理说明
- 处于不同节点的eureka通过Replicate进行数据同步;
- Application Service 为服务提供者;
- Application Client 为服务消费者;
- Make Remote Call 完成一次服务调用;
服务启动后向Eureka注册,Eureka Server 会将注册信息向其他Eureka Server 进行同步,当服务消费者要调用服务提供者,则向服务注册中心获取服务提供者地址,然后将服务提供者地址缓存在本地,下次再调用时,则直接从本地缓存中取,完成一次调用。
当服务注册中心 Eureka Server 检测到服务提供者因为宕机、网络原因不可用时,则在服务注册中心将服务置为DOWN状态,并把当前服务提供者状态向订阅者发布,订阅过的服务消费者更新本地缓存。服务提供者在启动或,周期性(默认30秒)向Eureka Server 发送心跳,以证明当前服务是可用状态。Eureka Server 在一定的时间(默认90秒)未收到客户的心跳,则认为服务宕机,注销该实列。
2、搭建集群
(1)、新建工程 microservicecloud-eureka-7002、microservicecloud-eureka-7003
(2)、按照7001为模板,粘贴 pom.xml 文件
org.springframework.cloud
spring-cloud-starter-netflix-eureka-server
org.springframework.boot
spring-boot-devtools
true
(3)、修改7002、7003 的主启动类
@SpringBootApplication
@EnableEurekaServer //EurekaServer服务器端启动类,接受其它微服务注册进来
public class EurekaServer7002_App {
public static void main(String[] args) {
SpringApplication.run(EurekaServer7002_App.class, args);
}
}
@SpringBootApplication
@EnableEurekaServer //EurekaServer服务器端启动类,接受其它微服务注册进来
public class EurekaServer7003_App {
public static void main(String[] args) {
SpringApplication.run(EurekaServer7003_App.class, args);
}
}
(4)、修改映射配置
找到 C:\Windows\System32\drivers\etc 路径下的host文件
修改映射配置添加进hosts文件
添加如下配置:
127.0.0.1 eureka7001.com
127.0.0.1 eureka7002.com
127.0.0.1 eureka7003.com
(5)、3台eureka服务器的yml配置
- 7001的yml配置文件
server:
port: 7001
eureka:
instance:
hostname: eureka7001.com #eureka服务端的实例名称
client:
register-with-eureka: false #false表示不向注册中心注册自己。
fetch-registry: false #false表示自己端就是注册中心,我的职责就是维护服务实例,并不需要去检索服务
service-url:
# 设置与Eureka Server交互的地址查询服务和注册服务都需要依赖这个地址(单机)。
# 单机 defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/
defaultZone: http://eureka7002.com:7002/eureka/,http://eureka7003.com:7003/eureka/
- 7002的yml配置文件
server:
port: 7002
eureka:
instance:
hostname: eureka7002.com #eureka服务端的实例名称
client:
register-with-eureka: false #false表示不向注册中心注册自己。
fetch-registry: false #false表示自己端就是注册中心,我的职责就是维护服务实例,并不需要去检索服务
service-url:
# 设置与Eureka Server交互的地址查询服务和注册服务都需要依赖这个地址(单机)。
# 单机 defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/
defaultZone: http://eureka7001.com:7001/eureka/,http://eureka7003.com:7003/eureka/
- 7003的yml配置文件
server:
port: 7003
eureka:
instance:
hostname: eureka7003.com #eureka服务端的实例名称
client:
register-with-eureka: false #false表示不向注册中心注册自己。
fetch-registry: false #false表示自己端就是注册中心,我的职责就是维护服务实例,并不需要去检索服务
service-url:
# 设置与Eureka Server交互的地址查询服务和注册服务都需要依赖这个地址(单机)。
# 单机 defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/
defaultZone: http://eureka7001.com:7001/eureka/,http://eureka7002.com:7002/eureka/
(6)、microservicecloud-provider-dept-8001微服务发布到上面3台eureka集群配置中
修改yml配置文件,如下:
server:
port: 8001
#mybatis相关配置
mybatis:
# config-location: classpath:mybatis/mybatis.cfg.xml # mybatis配置文件所在路径
type-aliases-package: cn.smilexl.springcloud.entities # 所有Entity别名类所在包
mapper-locations: classpath:mapper/**/*.xml # mapper映射文件
spring:
application:
name: microservicecloud-dept # 微服务名
datasource:
type: com.alibaba.druid.pool.DruidDataSource # 当前数据源操作类型
driver-class-name: org.gjt.mm.mysql.Driver # mysql驱动包
url: jdbc:mysql://47.99.218.123:3306/clouddb01 # 数据库名称
username: root
password: 123456
dbcp2:
min-idle: 5 # 数据库连接池的最小维持连接数
initial-size: 5 # 初始化连接数
max-total: 5 # 最大连接数
max-wait-millis: 200 # 等待连接获取的最大超时时间
#eureka相关配置
eureka:
client: #客户端注册进eureka服务列表内
service-url:
# defaultZone: http://localhost:7001/eureka
defaultZone: http://eureka7001.com:7001/eureka,http://eureka7002.com:7002/eureka,http://eureka7003.com:7003/eureka
instance:
instance-id: microservicecloud-dept-8001 #自定义服务名称信息
prefer-ip-address: true #访问路径可以显示IP地址
#点击超链接后显示信息
info:
app.name: microservicecloud
company.name: www.smilexl.cn
build.artifactId: $project.artifactId$
build.version: $project.version$
(6)、依次启动7001、7002、7003、8001测试
效果如下:
七、作为服务注册中心,Eureka比Zookeeper好在哪里?
Eureka比Zookeeper对比:https://www.jianshu.com/p/5e46fbb6c7cc