Eureka常用配置
Eureka 单节点搭建
eureka多节点
配置选项的服务注册
Eureka单独使用
Rest服务调用
/eureka/status 服务状态
注册到eureka查看服务信息
注册到eureka具体服务查看
服务续约
改变服务状态
删除状态更新
删除服务
元数据
EurekaClient
多网卡选择
Eureka 健康检查
安全配置
Server 优化
Client 优化
Eureka常用配置
服务端配置
eureka: instance: hostname:xxxxx#主机名称 prefer-ip-address:true/false#注册时显示ip server: enableSelfPreservation:true#启动自我保护 renewalPercentThreshold:0.85#续约配置百分比
还需要在spring boot设置启动类 @EnableEurekaServer
注解开启 Eureka 服务
客户端配置
eureka: client: register-with-eureka:true/false#是否向注册中心注册自己 fetch-registry:#指定客户端是否能获得该客户端eureka注册信息 service-url:#暴露服务中心地址 defaultZone:http://xxxxxx#默认配置 instance: instance-id:xxxxx#在注册中心指定当前客户端的名称
Eureka 单节点搭建
pom.xml
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId> </dependency> 还引入了一些教程spring-boot-starter-web,其实不用。因为上面的依赖已经包含了。因为上面的依赖已经包含了。pom中点此依赖进去,一共点4次spring-cloud-netflix-eureka-server,发现web的依赖。
application.yml
eureka: client: #是否注册自己Eureka Server,默认为true,因为现在是server,故而设置成false,表明服务不会向前发展eureka注册自己的信息 register-with-eureka: false #是否从eureka server由于单节点,不需要同步其他节点数据来获取注册信息,用false fetch-registry: false #设立服务注册中心URL,用于client和server端交流 service-url: defaultZone: http://localhost:7900/eureka/
application.properties
#是否注册自己Eureka Server,默认为true,因为现在是server,故而设置成false,表明服务不会向前发展eureka注册自己的信息 eureka.client.register-with-eureka=false #是否从eureka server单节点获取注册信息,不需要同步其他节点数据false eureka.client.fetch-registry=false #设立服务注册中心URL,用于client和server端交流 eureka.client.service-url.defaultZone=http://localhost:7900/eureka/
代码
将此注释标志添加到启动类,该服务是配置中心
@EnableEurekaServer
PS:Eureka会暴露一些端点。用于端点。Eureka Client注册自己,获得注册表,发送心跳。
简单看一下eureka server控制台、实例信息区、运行环境信息区、Eureka Server自身信息区。
pom.xml
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-client</artifctId>
</dependency>
application.yml
#注册中心
eureka:
client:
#设置服务注册中心的URL
service-url:
defaultZone: http://root:root@localhost:7900/eureka/
ps:不想注册,设置成false即可,实例演示结果:注册中心没有实例信息。找控制台204信息也没有找到。
spring:
cloud:
service-registry:
auto-registration:
enabled: false
注册成功:
DiscoveryClient_API-LISTEN-ORDER/api-listen-order:30.136.133.9:port - registration status: 204
eureka多节点
搭建步骤
1.准备
准备2个节点部署eureka,也可以单机部署
修改本机host文件,绑定一个主机名,单机部署时使用ip地址会有问题
2.配置文件
#是否将自己注册到其他Eureka Server,默认为true 需要
eureka.client.register-with-eureka=true
#是否从eureka server获取注册信息, 需要
eureka.client.fetch-registry=true
#设置服务注册中心的URL,用于client和server端交流
#此节点应向其他节点发起请求
eureka.client.serviceUrl.defaultZone=http://ek2.com:7902/eureka/
#主机名,必填
eureka.instance.hostname=ek1.com
management.endpoint.shutdown.enabled=true
#web端口,服务是由这个端口处理rest请求的
server.port=7901
#是否将自己注册到其他Eureka Server,默认为true 需要
eureka.client.register-with-eureka=true
#是否从eureka server获取注册信息, 需要
eureka.client.fetch-registry=true
#设置服务注册中心的URL,用于client和server端交流
#此节点应向其他节点发起请求
eureka.client.serviceUrl.defaultZone=http://ek1.com:7902/eureka/
#主机名,必填
eureka.instance.hostname=ek2.com
management.endpoint.shutdown.enabled=true
#web端口,服务是由这个端口处理rest请求的
server.port=7902
两个节点的话,如下图内容 就算成功了
服务注册的配置选项
新建一个web项目,引入starterspring-cloud-starter-netflix-eureka-client
客户端
#续约发送间隔默认30秒,心跳间隔
eureka.instance.lease-renewal-interval-in-seconds=5
#表示eureka client间隔多久去拉取服务注册信息,默认为30秒,对于api-gateway,如果要迅速获取服务注册状态,可以缩小该值,比如5秒
eureka.client.registry-fetch-interval-seconds=5
# 续约到期时间(默认90秒)
eureka.instance.lease-expiration-duration-in-seconds=60
服务端
#关闭自我保护模式
eureka.server.enable-self-preservation=false
#失效服务间隔
eureka.server.eviction-interval-timer-in-ms=3000
Eureka单独使用
Rest服务调用
官方文档
https://github.com/Netflix/eureka/wiki/Eureka-REST-operations
Register new application instance | POST /eureka/v2/apps/ | Input: JSON/XMLpayload HTTPCode: 204 on success |
De-register application instance | DELETE /eureka/v2/apps// | HTTP Code: 200 on success |
Send application instance heartbeat | PUT /eureka/v2/apps// | HTTP Code: * 200 on success * 404 if doesn’t exist |
Query for all instances | GET /eureka/v2/apps | HTTP Code: 200 on success Output: JSON/XML |
Query for all instances | GET /eureka/v2/apps/ | HTTP Code: 200 on success Output: JSON/XML |
Query for a specific / | GET /eureka/v2/apps// | HTTP Code: 200 on success Output: JSON/XML |
Query for a specific | GET /eureka/v2/instances/ | HTTP Code: 200 on success Output: JSON/XML |
Take instance out of service | PUT /eureka/v2/apps///status?value=OUT_OF_SERVICE | HTTP Code: * 200 on success * 500 on failure |
Move instance back into service (remove override) | DELETE /eureka/v2/apps///status?value=UP (The value=UP is optional, it is used as a suggestion for the fallback status due to removal of the override) | HTTP Code: * 200 on success * 500 on failure |
Update metadata | PUT /eureka/v2/apps///metadata?key=value | HTTP Code: * 200 on success * 500 on failure |
Query for all instances under a particular | GET /eureka/v2/vips/ | * HTTP Code: 200 on success Output: JSON/XML * 404 if the does not exist. |
Query for all instances under a particular | GET /eureka/v2/svips/ | * HTTP Code: 200 on success Output: JSON/XML * 404 if the does not exist. |
/eureka/status 服务状态
使用浏览器请求url会返回服务器状态信息
<com.netflix.eureka.util.StatusInfo>
<generalStats>
<environment>test</environment>
<num-of-cpus>16</num-of-cpus>
<total-avail-memory>526mb</total-avail-memory>
<current-memory-usage>183mb (34%)</current-memory-usage>
<server-uptime>00:00</server-uptime>
</generalStats>
<applicationStats>
<registered-replicas></registered-replicas>
<available-replicas></available-replicas>
<unavailable-replicas></unavailable-replicas>
</applicationStats>
<instanceInfo>
<instanceId>localhost</instanceId>
<hostName>localhost</hostName>
<app>UNKNOWN</app>
<ipAddr>192.168.29.1</ipAddr>
<status>UP</status>
<overriddenstatus>UNKNOWN</overriddenstatus>
<port enabled="true">8080</port>
<securePort enabled="false">443</securePort>
<countryId>1</countryId>
<dataCenterInfo class="com.netflix.appinfo.InstanceInfo$DefaultDataCenterInfo">
<name>MyOwn</name>
</dataCenterInfo>
<leaseInfo>
<renewalIntervalInSecs>30</renewalIntervalInSecs>
<durationInSecs>90</durationInSecs>
<registrationTimestamp>0</registrationTimestamp>
<lastRenewalTimestamp>0</lastRenewalTimestamp>
<evictionTimestamp>0</evictionTimestamp>
<serviceUpTimestamp>0</serviceUpTimestamp>
</leaseInfo>
<metadata>
<management.port>8080</management.port>
<jmx.port>7649</jmx.port>
</metadata>
<homePageUrl>http://localhost:8080/</homePageUrl>
<statusPageUrl>http://localhost:8080/actuator/info</statusPageUrl>
<healthCheckUrl>http://localhost:8080/actuator/health</healthCheckUrl>
<vipAddress>unknown</vipAddress>
<secureVipAddress>unknown</secureVipAddress>
<isCoordinatingDiscoveryServer>false</isCoordinatingDiscoveryServer>
<lastUpdatedTimestamp>1586328420409</lastUpdatedTimestamp>
<lastDirtyTimestamp>1586328420519</lastDirtyTimestamp>
</instanceInfo>
</com.netflix.eureka.util.StatusInfo>
如果需要json格式 可以加个请求头Accept:application/json
{
"generalStats": {
"environment": "test",
"num-of-cpus": "16",
"total-avail-memory": "517mb",
"current-memory-usage": "45mb (8%)",
"server-uptime": "00:03"
},
"applicationStats": {
"registered-replicas": "",
"available-replicas": "",
"unavailable-replicas": ""
},
"instanceInfo": {
"instanceId": "localhost",
"hostName": "localhost",
"app": "UNKNOWN",
"ipAddr": "192.168.29.1",
"status": "UP",
"overriddenStatus": "UNKNOWN",
"port": {
"$": 8080,
"@enabled": "true"
},
"securePort": {
"$": 443,
"@enabled": "false"
},
"countryId": 1,
"dataCenterInfo": {
"@class": "com.netflix.appinfo.InstanceInfo$DefaultDataCenterInfo",
"name": "MyOwn"
},
"leaseInfo": {
"renewalIntervalInSecs": 30,
"durationInSecs": 90,
"registrationTimestamp": 0,
"lastRenewalTimestamp": 0,
"evictionTimestamp": 0,
"serviceUpTimestamp": 0
},
"metadata": {
"management.port": "8080",
"jmx.port": "7649"
},
"homePageUrl": "http://localhost:8080/",
"statusPageUrl": "http://localhost:8080/actuator/info",
"healthCheckUrl": "http://localhost:8080/actuator/health",
"vipAddress": "unknown",
"secureVipAddress": "unknown",
"isCoordinatingDiscoveryServer": "false",
"lastUpdatedTimestamp": "1586328420409",
"lastDirtyTimestamp": "1586328420519"
}
注册到eureka的服务信息查看
get: {ip:port}/eureka/apps
注册到eureka的具体的服务查看
get: {ip:port}/eureka/apps/{appname}/{id}
服务续约
put:{ip:port}/eureka/apps/{appname}/{id}?lastDirtyTimestamp={}&status=up
更改服务状态
put:{ip:port}/eureka/apps/{appname}/{id}/status?lastDirtyTimestamp={}&value={UP/DOWN} 对应eureka源码的:InstanceResource.statusUpdate
删除状态更新
delete:{ip:port}/eureka/apps/{appname}/{id}/status?lastDirtyTimestamp={}&value={UP/DOWN}
删除服务
delete: {ip:port}/eureka/apps/{appname}/{id}
元数据
Eureka的元数据有两种:标准元数据和自定义元数据。 标准元数据:主机名、IP地址、端口号、状态页和健康检查等信息,这些信息都会被发布在服务注册表中,用于服务之间的调用。 自定义元数据:可以使用eureka.instance.metadata-map配置,这些元数据可以在远程客户端中访问,但是一般不改变客户端行为,除非客户端知道该元数据的含义。
可以在配置文件中对当前服务设置自定义元数据,可后期用户个性化使用
元数据可以配置在eureka服务器和eureka的客户端上
eureka.instance.metadata-map.dalao=mashibing
或者调用url,post请求,动态修改元数据
http://localhost:7900/eureka/apps/SERVICE-SMS/SHW12357:service-sms:8003/metadata?version=test
SERVICE-SMS:服务名
SHW12357:service-sms:8003:实例ID
服务端:
客户端:
{
"applications": {
"versions__delta": "1",
"apps__hashcode": "UP_2_",
"application": [
{
"name": "EUREKA-CONSUMER",
"instance": [
{
"instanceId": "localhost:Eureka-Consumer:9001",
"hostName": "localhost",
"app": "EUREKA-CONSUMER",
"ipAddr": "192.168.29.1",
"status": "UP",
"overriddenStatus": "UNKNOWN",
"port": {
"$": 9001,
"@enabled": "true"
},
"securePort": {
"$": 443,
"@enabled": "false"
},
"countryId": 1,
"dataCenterInfo": {
"@class": "com.netflix.appinfo.InstanceInfo$DefaultDataCenterInfo",
"name": "MyOwn"
},
"leaseInfo": {
"renewalIntervalInSecs": 30,
"durationInSecs": 90,
"registrationTimestamp": 1586331982283,
"lastRenewalTimestamp": 1586331982283,
"evictionTimestamp": 0,
"serviceUpTimestamp": 1586331982283
},
"metadata": {
"dalao": "mashibing666",
"management.port": "9001",
"jmx.port": "10158"
},
"homePageUrl": "http://localhost:9001/",
"statusPageUrl": "http://localhost:9001/actuator/info",
"healthCheckUrl": "http://localhost:9001/actuator/health",
"vipAddress": "Eureka-Consumer",
"secureVipAddress": "Eureka-Consumer",
"isCoordinatingDiscoveryServer": "false",
"lastUpdatedTimestamp": "1586331982283",
"lastDirtyTimestamp": "1586331982260",
"actionType": "ADDED"
},
{
"instanceId": "localhost:Eureka-Consumer:9000",
"hostName": "localhost",
"app": "EUREKA-CONSUMER",
"ipAddr": "192.168.29.1",
"status": "UP",
"overriddenStatus": "UNKNOWN",
"port": {
"$": 9000,
"@enabled": "true"
},
"securePort": {
"$": 443,
"@enabled": "false"
},
"countryId": 1,
"dataCenterInfo": {
"@class": "com.netflix.appinfo.InstanceInfo$DefaultDataCenterInfo",
"name": "MyOwn"
},
"leaseInfo": {
"renewalIntervalInSecs": 30,
"durationInSecs": 90,
"registrationTimestamp": 1586331637223,
"lastRenewalTimestamp": 1586332057220,
"evictionTimestamp": 0,
"serviceUpTimestamp": 1586331637223
},
"metadata": {
"dalao": "mashibing",
"management.port": "9000",
"jmx.port": "10000"
},
"homePageUrl": "http://localhost:9000/",
"statusPageUrl": "http://localhost:9000/actuator/info",
"healthCheckUrl": "http://localhost:9000/actuator/health",
"vipAddress": "Eureka-Consumer",
"secureVipAddress": "Eureka-Consumer",
"isCoordinatingDiscoveryServer": "false",
"lastUpdatedTimestamp": "1586331637223",
"lastDirtyTimestamp": "1586331637182",
"actionType": "ADDED"
}
]
}
]
}
}
EurekaClient
EurekaClient 可以在客户端获取eureka服务器上的注册者信息
org.springframework.cloud.client.discovery是SpringCloud对注册中心client的抽象封装,提供公用功能
org.springframework.cloud.client.discovery定义用来服务发现的客户端接口,是客户端进行服务发现的核心接口,是spring cloud用来进行服务发现的顶级接口,在common中可以看到其地位。在Netflix Eureka和Consul中都有具体的实现类。
代表通用于服务发现的读操作,例如在 eureka或consul中。
com.netflix.discovery.DiscoveryClient为Eureka注册中心客户端的接口,功能更丰富
有
String description();//获取实现类的描述。
List<String> getServices();//获取所有服务实例id。
List<ServiceInstance> getInstances(String serviceId);//通过服务id查询服务实例信息列表。
多网卡选择
ip注册
eureka:
instance:
prefer-ip-address: true
表示将自己的ip注册到EurekaServer上。不配置或false,表示将操作系统的hostname注册到server
服务器有多个网卡,eh0,eh1,eh2,只有eh0可以让外部其他服务访问进来,而Eureka client将eh1和eh2注册到Eureka server上,这样其他服务就无法访问该微服务了。
指定Ip
eureka:
instance:
prefer-ip-address: true
ip-address: 实际能访问到的Ip
如果设置了此时的ip-address,在元数据查看到就是此ip,其他服务也通过此ip来调用。
{
"host": "127.0.0.1",
"port": 8084,
"metadata": {
"yueyi": "2019",
"user.password": "root",
"management.port": "8084",
"jmx.port": "61378",
"user.name": "root"
},
"secure": false,
"uri": "http://127.0.0.1:8084",
"instanceId": "api-listen-order:30.136.133.11:port",
"serviceId": "API-LISTEN-ORDER",
"instanceInfo": {
"instanceId": "api-listen-order:30.136.133.11:port",
"app": "API-LISTEN-ORDER",
"appGroupName": null,
"ipAddr": "127.0.0.1",
"sid": "na",
"homePageUrl": "http://127.0.0.1:8084/",
"statusPageUrl": "http://127.0.0.1:8084/actuator/info",
"healthCheckUrl": "http://127.0.0.1:8084/actuator/health",
"secureHealthCheckUrl": null,
"vipAddress": "api-listen-order",
"secureVipAddress": "api-listen-order",
"countryId": 1,
"dataCenterInfo": {
"@class": "com.netflix.appinfo.InstanceInfo$DefaultDataCenterInfo",
"name": "MyOwn"
},
"hostName": "127.0.0.1",
"status": "UP",
"overriddenStatus": "UNKNOWN",
"leaseInfo": {
"renewalIntervalInSecs": 1,
"durationInSecs": 1,
"registrationTimestamp": 1579489514655,
"lastRenewalTimestamp": 1579489524146,
"evictionTimestamp": 0,
"serviceUpTimestamp": 1579489514147
},
"isCoordinatingDiscoveryServer": false,
"metadata": {
"yueyi": "2019",
"user.password": "root",
"management.port": "8084",
"jmx.port": "61378",
"user.name": "root"
},
"lastUpdatedTimestamp": 1579489514655,
"lastDirtyTimestamp": 1579489514111,
"actionType": "ADDED",
"asgName": null
},
"scheme": null
}
或者使用配置网卡选择
Eureka 健康检查
由于server和client通过心跳保持 服务状态,而只有状态为UP的服务才能被访问。看eureka界面中的status。
比如心跳一直正常,服务一直UP,但是此服务DB连不上了,无法正常提供服务。
此时,我们需要将 微服务的健康状态也同步到server。只需要启动eureka的健康检查就行。这样微服务就会将自己的健康状态同步到eureka。配置如下即可。
在client端配置:将自己真正的健康状态传播到server。
eureka:
client:
healthcheck:
enabled: true
Client端配置Actuator
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
改变健康状态的Service
@Service
public class HealthStatusService implements HealthIndicator{
private Boolean status = true;
public void setStatus(Boolean status) {
this.status = status;
}
@Override
public Health health() {
// TODO Auto-generated method stub
if(status)
return new Health.Builder().up().build();
return new Health.Builder().down().build();
}
public String getStatus() {
// TODO Auto-generated method stub
return this.status.toString();
}
测试用的Controller
@GetMapping("/health")
public String health(@RequestParam("status") Boolean status) {
healthStatusSrv.setStatus(status);
return healthStatusSrv.getStatus();
}
安全配置
spring.security.user.name=yiming
spring.security.user.password=123
如果服务注册报错
Root name 'timestamp' does not match expected ('instance') for type [simple
是默认开启了防止跨域攻击
在服务端增加配置类
@Configuration
@EnableWebSecurity
public class WebSecurityConfig extends WebSecurityConfigurerAdapter{
@Override
protected void configure(HttpSecurity http) throws Exception {
// TODO Auto-generated method stub
http.csrf().disable();
super.configure(http);
}
}
Server 优化
如果微服务数量少,可以开启自我保护
如果微服务数量多,可以关闭自我保护,因为10个实例,默认是0.85,只要损失2个,就进入自我保护阶段,不稳定。
server:
# 自我保护,看服务多少。
enable-self-preservation: false
# 自我保护阈值
renewal-percent-threshold: 0.85
# 剔除服务时间间隔
eviction-interval-timer-in-ms: 1000
# 关闭从readOnly读注册表
use-read-only-response-cache: false
# readWrite 和 readOnly 同步时间间隔。
response-cache-update-interval-ms: 1000
Client 优化
client配置总结
减小拉注册表的间隔和心跳时间
client:
registry-fetch-interval-seconds: 5 刷新注册表(拉取注册表)间隔
instance:
lease-renewal-interval-in-seconds: 10,心跳续约间隔。
lease-expiration-duration-in-seconds: 10,缺心跳过期时间。
可以设置饥饿加载。防止第一次请求超时。
我们在生产中配置eureka.client.service-url.defaultZone的时候,各个client端的配置尽量要随机一下,即打乱一下defaultZone中url的顺序,这是因为在拉取注册表的时候,默认从第一个url开始拉取,拉取不到才从下一个拉取,并且最多只能拉取3个;同时,在注册的时候,只会注册到第一个url,不会注册到下面的url。所以我们打乱了顺序以后,就减少了对某一个server的依赖,也降低了对某一个server的请求次数。