【笔记】Eureka学习笔记

前言

Eureka is a REST (Representational State Transfer) based service that is primarily used in the AWS cloud for locating services for the purpose of load balancing and failover of middle-tier servers.(Github

Eureka中微服务的角色分类

  • EurekaServer服务端
    • 注册中心
      • 记录服务信息
      • 心跳监控
  • EurekaClient客户端
    • Provider生产者
      • 注册自己的信息到EurekaServer服务端
      • 每隔30秒向EurekaServer发送心跳
    • Consumer消费者
      • 根据服务名称从EurekaServer拉去服务列表
      • 基于服务列表做负载均衡,选中一个微服务后发起远程调用

父级依赖

  • 通过父级依赖统一控制子级依赖的版本
pom.xml
1
2
3
4
5
6
7
8
9
10
11
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>Hoxton.SR10</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>

单台注册中心

  • 单台服务端,多台客户端

EurekaServer服务端

引入依赖

pom.xml
1
2
3
4
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>

启动类注册

  • 在启动类添加@EnableEurekaServer注解启动Eureka
1
2
3
4
5
6
7
@EnableEurekaServer
@SpringBootApplication
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}

修改配置

server.port:端口号,默认为8761
spring.application.name:服务名称。服务名称不是域名,不能被直接访问
eureka.client.service-url.defaultZone::注册服务到注册中心,单台中指向自己
eureka.server.instance.hostname:主机名,集群中区分不同服务器的域名
eureka.server.enable-self-preservation:是否开启保护模式,默认为true,开发期间禁用保护模式
eureka.client.register-with-eureka=false:单台服务器不向自身注册
eureka.client.fetch-registry=false:单台服务器不从自身拉取注册信息
eureka.instance.lease-expiration-duration-in-seconds:最后一次心跳后,间隔多久认定微服务不可用,默认90

src/main/resources/application.yml
1
2
3
4
5
6
7
8
9
spring:
application:
name: eureka-server
server:
port: 8000
eureka:
client:
service-url:
defaultZone: http://127.0.0.1:8000/eureka
  • eureka 的自我保护状态:心跳失败的比例,在15分钟内是否超过85%,如果出现了超过的情况,Eureka Server会将当前的实例注册信息保护起来,同时提示一个警告,一旦进入保护模式,Eureka Server将会尝试保护其服务注册表中的信息,不再删除服务注册表中的数据。也就是不会注销任何微服务

启动服务端

<server>:服务端jar包

1
java -jar <server>.jar --server.port=8001 --eureka.client.service-url.defaultZone=8001

EurekaClient客户端

引入依赖

pom.xml
1
2
3
4
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>

修改配置

src/main/resources/application.yml
1
2
3
4
5
6
7
8
9
spring:
application:
name: eureka-serveice
server:
port: 8080
eureka:
client:
service-url:
defaultZone: http://127.0.0.1:8000/eureka

启动客户端

  • 启动2个客户端,指向注册中心

<client>:客户端jar包

1
2
java -jar <client>.jar --spring.application.name=user-serveice --server.port=8081 --eureka.client.service-url.defaultZone=http://127.0.0.1:8001/eureka
java -jar <client>.jar --spring.application.name=order-serveice --server.port=8082 --eureka.client.service-url.defaultZone=http://127.0.0.1:8001/eureka

多台注册中心集群

  • 多台服务端,多台客户端

EurekaServer服务端

引入依赖

pom.xml
1
2
3
4
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>

启动类注册

  • 在启动类添加@EnableEurekaServer注解启动Eureka
1
2
3
4
5
6
7
@EnableEurekaServer
@SpringBootApplication
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}

修改配置

eureka.client.service-url.defaultZone::注册服务到注册中心,集群中指向其他注册中心

src/main/resources/application.yml
1
2
3
4
5
6
7
8
9
spring:
application:
name: eureka-server
server:
port: 8000
eureka:
client:
service-url:
defaultZone: http://127.0.0.1:8000/eureka

启动服务端

<server>:服务端jar包

1
2
java -jar <server>.jar --server.port=8001 --eureka.instance.hostname=eureka1 --eureka.client.service-url.defaultZone=http://127.0.0.1:8002/eureka
java -jar <server>.jar --server.port=8002 --eureka.instance.hostname=eureka2 --eureka.client.service-url.defaultZone=http://127.0.0.1:8001/eureka

EurekaClient客户端

引入依赖

pom.xml
1
2
3
4
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>

修改配置

  • 每个客户端同时注册两个服务端
src/main/resources/application.yml
1
2
3
4
5
6
7
8
9
spring:
application:
name: eureka-service-user
server:
port: 8080
eureka:
client:
service-url:
defaultZone: http://127.0.0.1:8000/eureka,http://127.0.0.1:8000/eureka

启动客户端

  • 启动时添加启动参数作为多个客户端启动多台

<client>:客户端jar包

1
2
java -jar <client>.jar --server.port=8081 --eureka.client.service-url.defaultZone=http://127.0.0.1:8001/eureka,http://127.0.0.1:8002/eureka
java -jar <client>.jar --server.port=8082 --eureka.client.service-url.defaultZone=http://127.0.0.1:8001/eureka,http://127.0.0.1:8002/eureka

消费者访问生产者

添加RestTemplate的Bean

  • 在Bean上添加@LoadBalanced注解实现向生产者发送请求时的负载均衡
  • @LoadBalanced注解标注的RestTemplate,发出的请求会被Ribbon拦截,Ribbon会先向Eureka根据服务名拉取请求的真实地址,再进行负载均衡
src/main/java/com/conf/RestTemplateConfig.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
package com.conf;

import org.springframework.boot.SpringBootConfiguration;
import org.springframework.cloud.client.loadbalancer.LoadBalanced;
import org.springframework.context.annotation.Bean;
import org.springframework.web.client.RestTemplate;

@SpringBootConfiguration
public class RestTemplateConfig {

@LoadBalanced
@Bean
public RestTemplate restTemplate() {
return new RestTemplate();
}
}

消费者通过服务名访问生产者

1
2
3
4
5
6
7
@Autowired
RestTemplate restTemplate

public void method() {
String url = "http://eureka-service-user/users/" + order.getUserId();
User user = restTemplate.getForObject(url, User.class);
}

修改负载均衡的方式

通过配置类修改

  • 为所有服务修改负载均衡方式

轮询方式

src/main/java/com/conf/RestTemplateConfig.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
package com.conf;

import org.springframework.boot.SpringBootConfiguration;
import org.springframework.context.annotation.Bean;
import org.springframework.web.client.RestTemplate;

@SpringBootConfiguration
public class RestTemplateConfig {

@LoadBalanced
@Bean
public RestTemplate restTemplate() {
return new RestTemplate();
}

@Bean
public IRule iRule() {
return new ZoneAvoidanceRule();
}
}

随机方式

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
package com.conf;

import com.netflix.loadbalancer.IRule;
import com.netflix.loadbalancer.RandomRule;
import org.springframework.boot.SpringBootConfiguration;
import org.springframework.cloud.client.loadbalancer.LoadBalanced;
import org.springframework.context.annotation.Bean;
import org.springframework.web.client.RestTemplate;

@SpringBootConfiguration
public class RestTemplateConfig {

@LoadBalanced
@Bean
public RestTemplate restTemplate() {
return new RestTemplate();
}

@Bean
public IRule iRule() {
return new RandomRule();
}
}

通过配置文件修改

  • 为指定服务修改负载均衡方式

轮询方式

src/main/resources/application.yml
1
2
3
服务名:
ribbon:
NFLoadBalancerRuleClassName: com.netflix.loadbalancer.ZoneAvoidanceRule

随机方式

src/main/resources/application.yml
1
2
3
服务名:
ribbon:
NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule

饥饿加载配置

  • Ribbon默认使用懒加载方式,只有第一次访问服务时,才会去Eureka注册中心拉取服务地址
  • 与懒加载相对应的是饥饿加载,当开启了饥饿加载,当启动服务器时就会在Eureka注册中心拉取服务地址

ribbon.eager-load.enable:指定是否开启饥饿加载
ribbon.eager-load.clients:指定需要饥饿加载的服务名。如果是多个服务,需要指定Yaml集合。如果不指定,则所有服务都被饥饿加载

src/main/resources/application.yml
1
2
3
ribbon:
eager-load:
enable: true

完成

  • 单台

  • 集群

参考文献

哔哩哔哩——黑马程序员