1 总工程项目
2 Eureka
创建 springcloud-eureka 模块。
2.1 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">
<parent>
<artifactId>springcloud</artifactId>
<groupId>com.pky</groupId>
<version>1.0.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>springcloud-eureka</artifactId>
<dependencies>
<!-- springcloud begin -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-eureka-server</artifactId>
</dependency>
<!-- springcloud end -->
<!-- springboot begin -->
<!-- 权限认证 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>
<!-- springboot end -->
</dependencies>
</project>
我这里的eureka 版本是 1.4.6.RELEASE。可以放在总工程中的 pom.xml 进行依赖管理。
2.2 application.yml
server:
port: 7001
spring:
application:
name: springcloud-eureka
## 权限认证,来保证安全性。
security:
user:
name: pkyShare
password: 123456
eureka:
instance:
hostname: eureka7001 # eureka 服务端实例名称
server:
# 自我保护机制,默认true。打开后,心跳失败在15分钟内低于85%(renewalPercentThreshold)的服务,也不进行剔除。
# 关闭后,主页提示:RENEWALS ARE LESSER THAN THE THRESHOLD. THE SELF PRESERVATION MODE IS TURNED OFF.
enableSelfPreservation: true # 本地调试时可fasle关闭。但生产建议打开,可防止因网络不稳定等原因导致误剔除服务。
renewalPercentThreshold: 0.85 # 默认85%
client:
# 单点时,如果 registerWithEureka 配置为 true,则 eureka server 会报错C annot execute request on any known server
registerWithEureka: false # 是否注册到 eureka 服务,默认为 true,当前已为 eureka server,且单点 eureka,故配置为 false
fetchRegistry: false # 是否在本地缓存注册表信息,默认为 true,当前为单点 eureka server,不需要从其他 eureka 除获取注册表信息,更谈不上缓存,故配置为 false
serviceUrl:
# 配置其他 eureka 的地址,如果多台则逗号分隔。
defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/
2.3 权限认证配置类
SpringSecurity 默认开启跨域保护。因此需要配置关闭跨域保护
/**
* 权限认证配置类
*/
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http) throws Exception {
http.csrf().disable(); // 关闭跨域保护
super.configure(http);
}
}
如果不关闭,当启动其他服务进行注册时,会出现 com.netflix.discovery.shared.transport.TransportException: Cannot execute request on any known server 的异常。
2.4 启动类
@SpringBootApplication
@EnableEurekaServer // 表明自己是注册中心
public class EurekaApplication {
public static void main(String[] args) {
SpringApplication.run(EurekaApplication.class, args);
}
}
2.5 启动测试
浏览器输入 localhost:7001,然后输入账号密码 即可访问,如下:
如果启动时报如下错误,则说明SpringCloud 与 SpringBoot 版本不对应,查阅版本对照进行修改即可。
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'bootstrapImportSelectorConfiguration': Initialization of bean failed; nested exception is java.lang.NoClassDefFoundError: org/springframework/boot/context/properties/ConfigurationPropertiesBean
3 服务注册进入 Eureka
上述并没有任何服务注册进入 Eureka,因此先将服务提供者注册。
3.1 添加 pom.xml 中的依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-eureka</artifactId>
</dependency>
3.2 yml
在 yml 中主要添加如下配置,具体其他配置参考创建 springcloud 总工程项目。
server:
port: 9001
spring:
application:
name: springcloud-provider9001
# eureka 配置
eureka:
client:
service-url:
# eureka 服务端地址(即注册地址),若 eureka 开启了权限认证,则需要携带账号密码
defaultZone: http://pkyShare:123456@localhost:7001/eureka/
3.3 启动类
@SpringBootApplication
@MapperScan(basePackages = "com.pky.springcloud.provider.mapper") //扫描 Mapper
@EnableEurekaClient // 表明自己是个 eureka 客户端,会自动注册到 eureka 服务端中
public class ProviderApplication {
public static void main(String[] args) {
SpringApplication.run(ProviderApplication.class, args);
}
}
3.4 启动测试
将服务提供者启动后,会自动注册到 eureka 中。
可以发现已经注册了。
4 Eureka 自我保护机制
当某一个服务不可用了,Eureka 不会立刻清理,依旧会对改服务的信息进行保存!
默认情况下,如果 EurekaServer 在一定时间内没有接受到某个服务实例的心跳,EurekaServer 将会注销改实例(默认 90 秒)。但是当网络分区故障发生时,服务于 Eureka 之间无法正常通信,此时不应该注销改服务。Eureka 通过自我保护机制来解决这个问题。即 EurekaServer 节点在短时间内丢失过多客户端时,那么这个节点就会进入自我保护模式,EruekaServer 就会保护服务注册表中的信息,不再删除服务注册表中的数据。当网络故障恢复后,该 EurekaServer 节点会自动退出自我保护模式。
yml 中的 eureka.server 来配置自我保护模式。
5 Eureka 集群
5.1 DNS
分别创建 springcloud-eureka2 和 springcloud-eureka3 模块,pom.xml 的依赖、启动类等信息和上述的一致。然后修改 C:\Windows\System32\drivers\etc 路径下的 hosts 文件,文末添加三行,进行自定义 DNS
127.0.0.1 localhost
127.0.0.1 eureka7001.com
127.0.0.1 eureka7002.com
127.0.0.1 eureka7003.com
5.2 yml
主要是对 serviceUrl.defaultZone 进行添加多个注册地址。
- 7001
server:
port: 7001
spring:
application:
name: springcloud-eureka1
security:
user:
name: pkyShare
password: 123456
eureka:
instance:
hostname: eureka7001 # eureka 服务端实例名称
client:
# 单点时,如果 registerWithEureka 配置为 true,则 eureka server 会报错C annot execute request on any known server
registerWithEureka: false # 是否注册到 eureka 服务,默认为 true,当前已为 eureka server,且单点 eureka,故配置为 false
fetchRegistry: false # 是否在本地缓存注册表信息,默认为 true,当前为单点 eureka server,不需要从其他 eureka 除获取注册表信息,更谈不上缓存,故配置为 false
serviceUrl:
# 配置其他 eureka 的地址,如果多台则逗号分隔。
defaultZone: http://pkyShare:123456@eureka7002.com:7002/eureka/,http://pkyShare:123456@eureka7003.com:7003/eureka/
- 7002
server:
port: 7002
spring:
application:
name: springcloud-eureka2
security:
user:
name: pkyShare
password: 123456
eureka:
instance:
hostname: eureka7002 # eureka 服务端实例名称
client:
# 单点时,如果 registerWithEureka 配置为 true,则 eureka server 会报错C annot execute request on any known server
registerWithEureka: false # 是否注册到 eureka 服务,默认为 true,当前已为 eureka server,且单点 eureka,故配置为 false
fetchRegistry: false # 是否在本地缓存注册表信息,默认为 true,当前为单点 eureka server,不需要从其他 eureka 除获取注册表信息,更谈不上缓存,故配置为 false
serviceUrl:
# 配置其他 eureka 的地址,如果多台则逗号分隔。
defaultZone: http://pkyShare:123456@eureka7001.com:7001/eureka/,http://pkyShare:123456@eureka7003.com:7003/eureka/
- 7003
server:
port: 7003
spring:
application:
name: springcloud-eureka3
eureka:
instance:
hostname: eureka7003 # eureka 服务端实例名称
client:
# 单点时,如果 registerWithEureka 配置为 true,则 eureka server 会报错C annot execute request on any known server
registerWithEureka: false # 是否注册到 eureka 服务,默认为 true,当前已为 eureka server,且单点 eureka,故配置为 false
fetchRegistry: false # 是否在本地缓存注册表信息,默认为 true,当前为单点 eureka server,不需要从其他 eureka 除获取注册表信息,更谈不上缓存,故配置为 false
serviceUrl:
# 配置其他 eureka 的地址,如果多台则逗号分隔。
defaultZone: http://pkyShare:123456@eureka7001.com:7001/eureka,http://pkyShare:123456@eureka7002.com:7002/eureka
5.3 分别启动测试
这样就成功了。
5.4 客户端服务端分别注册到集群
- 修改客户端和服务端的配置
# eureka 配置
eureka:
client:
service-url:
# eureka 服务端地址(即注册地址),若 eureka 开启了权限认证,则需要携带账号密码
defaultZone: http://pkyShare:123456@eureka7001.com:7001/eureka/,http://pkyShare:123456@eureka7002.com:7002/eureka/,http://pkyShare:123456@eureka7003.com:7003/eureka/
- 分别启动