SpringCloud学习笔记-Eureka基础
Spring Cloud Eureka是Spring Cloud Netflix微服务套件中的一部分,它基于Netflix Eureka做了二次封装,主要负责完成微服务架构中的微服务治理功能.
服务端
依赖
settings.gradle
pluginManagement {
resolutionStrategy {
}
repositories {
maven { url "http://maven.aliyun.com/nexus/content/groups/public" }
gradlePluginPortal()
}
}
rootProject.name = 'swb-infra-eureka'
build.gradle
buildscript {
ext {
//定义一个变量,统一规定springboot的版本
springBootVersion = '2.0.1.RELEASE'
}
}
plugins {
id "idea"
id "java"
id 'org.springframework.boot' version "2.0.1.RELEASE"
id 'io.spring.dependency-management' version "1.0.8.RELEASE"
}
group = 'com.swb'
version = '0.0.1-SNAPSHOT'
description = """swb-infra-eureka"""
sourceCompatibility = 1.8
targetCompatibility = 1.8
tasks.withType(JavaCompile) {
options.encoding = 'UTF-8'
}
repositories {
maven { url "http://maven.aliyun.com/nexus/content/groups/public" }
}
dependencyManagement {
imports {
mavenBom "org.springframework.boot:spring-boot-starter-parent:${springBootVersion}"
mavenBom 'org.springframework.cloud:spring-cloud-dependencies:Finchley.SR1'
}
}
dependencies {
compile "org.springframework.cloud:spring-cloud-starter-netflix-eureka-server"
}
配置文件
application.yml
spring:
application:
name: swb-infra-eureka
profiles:
active: ${ACTIVE_PROFILE:default}
cloud:
inetutils:
# 首选的网络地址,支持JAVA正则表达式
preferred-networks: ${CLOUD_INETUTILS_PREFERRED_NETWORKS:127.0.0.1}
# 忽略的网卡名,支持JAVA正则表达式,这在使用docker启动时很有用,解决多网卡注册问题.
ignored-interfaces: docker0, veth.*
server:
port: 19100
servlet:
context-path: /
eureka:
# lease-expiration-duration-in-seconds: 20
# 生产环境中官方是不建议修改默认配置,因为那样会破坏 eureka server 的保护模式
server:
# 关闭保护模式(生产环境不建议修改)
enable-self-preservation: false
# 清理间隔(默认是60 * 1000 毫秒)(生产环境不建议修改)
eviction-interval-timer-in-ms: 10000
# Eureka 拉取服务列表时间(默认:30秒)(生产环境不建议修改)
remote-region-registry-fetch-interval: 5
client:
# eureka server 没必要自己把自己注册上去,所以可以设置成 false
register-with-eureka: false
# 是否从Eureka Server上获取注册信息,默认为true,此处建议修改成 false (单机设置的意义不大,如果设置成 true 启动会去抓取一次注册表,获取不到更新缓存就会出错(该错误不影响 eureka 正常使用))
fetch-registry: false
service-url:
# 默认注册地址 this.serviceUrl.put("defaultZone", "http://localhost:8761/eureka/");
# 划重点:此处的 defaultZone 千万别写成 default-zone
defaultZone: http://${EUREKA_IP:127.0.0.1}:${server.port}/eureka/
# 从 Eureka 服务器端获取注册信息的间隔时间(默认:30秒)
registry-fetch-interval-seconds: 5
开启注册服务
在启动类上添加注解@EnableEurekaServer
.
客户端
依赖
settings.gradle
略
build.gradle
buildscript {
ext {
//定义一个变量,统一规定springboot的版本
springBootVersion = '2.0.1.RELEASE'
}
repositories {
maven { url "http://maven.aliyun.com/nexus/content/groups/public" }
}
}
plugins {
id "org.springframework.boot" version "2.0.1.RELEASE"
id "io.spring.dependency-management" version "1.0.8.RELEASE"
id "idea"
id "java"
}
group = 'com.XXX'
version = '0.0.1-SNAPSHOT'
description = """XXX"""
sourceCompatibility = 1.8
targetCompatibility = 1.8
tasks.withType(JavaCompile) {
options.encoding = 'UTF-8'
}
// 实时刷新依赖
configurations.all {
resolutionStrategy {
cacheChangingModulesFor 0, 'seconds'
cacheDynamicVersionsFor 0, 'seconds'
}
}
repositories {
maven { url "http://maven.aliyun.com/nexus/content/groups/public" }
}
dependencyManagement {
imports {
mavenBom 'org.springframework.cloud:spring-cloud-dependencies:Finchley.SR1'
}
}
dependencies {
compile "org.springframework.cloud:spring-cloud-starter-netflix-eureka-client"
}
配置
application.yml
只展示与eureka相关配置
eureka:
instance:
ip-address: ${EUREKA_INSTANCE_IP:${spring.cloud.client.ip-address:127.0.0.1}} #❶
prefer-ip-address: true
instance-id: ${eureka.instance.ip-address}:${server.port}:${spring.application.name} #❷
client:
serviceUrl:
defaultZone: http://${EUREKA_IP:${spring.cloud.client.ip-address:127.0.0.1}}:19100/eureka/
启动
启动类添加注解@EnableDiscoveryClient
或@EnableEurekaClient
Notes
❶ 1.5.X版本可以将此设置为${spring.cloud.client.ipAddress}
,2.X对应的是${spring.cloud.client.ip-address}
,此处设置默认值127.0.0.1
是为了兼容版本.它们对应的源码类全路径是org.springframework.cloud.client.HostInfoEnvironmentPostProcessor
❷eureka.instance.instance-id
是在eureka上展示的数据,真实访问的IP为eureka.instance.ip-address
,此处为了保持一致,因此直接引用了${eureka.instance.ip-address}
Tips
- Spring Cloud 是套件,不是单独的一个项目,因此版本号采用命名的方式,这也是为什么gradle中使用插件
dependency-management
的原因.可以参考SpringBoot及SpringCloud版本管理(Gradle版本) - 一般情况下不用配置
spring.cloud.inetutils
,这个主要是解决在使用docker启动时将服务注册在docker0
网卡上导致服务间通信阻塞问题.
参考
一起来学Spring Cloud(F版) | 第一篇:认识Eureka
https://plugins.gradle.org/plugin/io.spring.dependency-management
https://stackoverflow.com/questions/38221227/gradle-configuration-of-pluginrepository