什么是Eureka?
Eureka是Springcloud提供的服务注册与发现组件,它的主要功能是提供一个注册中心来为各个微服务之间的相互调用提供便捷
Eureka的角色组成
Eureka组件包含两个角色,分别是Eureka Server和Eureka Client。
- Eureka Server:Client微服务启动后,在Eureka Server中进行注册,Eureka Server通过一个注册表来存储微服务的相关信息
- Eureka Client:Client微服务启动后,向Eureka Server发送心跳(默认为30秒),如果Eureka Server在多个心跳周期内(默认为90秒)没有收到该Client发送的心跳信息,将会在注册表中剔除该服务,默认配置信息如下:
instance:
# Eureka客户端向服务端发送心跳的时间间隔,默认为30秒
lease-renewal-interval-in-seconds: 30
# Eureka客户端在接收到客户端最后一次心跳后等待时间(超时将剔除服务)
lease-expiration-duration-in-seconds: 90
创建Eureka Server服务
1.在项目中添加依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
<version>2.2.2.RELEASE</version>
</dependency>
2.配置启动类,在启动类上添加@EnableEurekaServer
注解
@SpringBootApplication
@EnableEurekaServer
public class EurekaServerApplication {
public static void main(String[] args) {
SpringApplication.run(EurekaServerApplication.class,args);
}
}
3.添加yaml配置
server:
port: 7001
spring:
application:
name: eureka-server
eureka:
instance:
# eureka服务端的实例名称
hostname: localhost
client:
# false表示不向服务端注册自己
register-with-eureka: false
# false表示不需要检索服务,因为自己就是注册中心
fetch-registry: false
# client端向服务端发起注册的地址
service-url:
defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/
4.启动服务,访问注册中心地址,效果如下
创建Eureka Client服务
1.在项目中添加依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
<version>2.2.2.RELEASE</version>
</dependency>
2.配置启动类,在启动类上添加@EnableEurekaClient
注解
@SpringBootApplication
@EnableEurekaClient
public class EurekaClientApplication {
public static void main(String[] args) {
SpringApplication.run(EurekaClientApplication.class,args);
}
}
3.添加yml配置
server:
port: 7002
spring:
application:
name: eureka-client
eureka:
instance:
hostname: loclhost
client:
register-with-eureka: true
fetch-registry: true
service-url:
defaultZone: http://localhost:7001/eureka/
4.启动服务,访问注册中心地址,效果如下
可以看到客户端服务已经注册成功
自我保护机制
在上面的图示中,我们可以看到有一长串的红色字体,这表示Eureka开启了自我保护机制
EurekaServer将会尝试保护其服务注册表中的信息,不再删除服务注册表中的数据,也就是不会注销任何服务
为什么需要自我保护
因为微服务是分布部署的,不同的微服务可能部署在不同的机器上,如果微服务本身是正常的,但是由于机器之间的网络故障导致了该服务与EurakaServer之间不能正常通信,所以当EurakaSever节点在短时间内丢失过多的客户端连接时,就会进入自我保护模式,不会立即剔除服务
所以,自我保护机制实际上是作用于网络容错的
如何关闭自我保护机制
在EurekaSever的配置中添加如下配置
application.yml
server:
# 默认开启了自我保护机制,设置为false表示关闭
enable-self-preservation: false
# 剔除服务的时间
eviction-interval-timer-in-ms: 2000
关闭后效果展示
说明自我保护模式已经关闭
Eureka集群
为什么要搭建Eureka集群
搭建Eureka集群的目的是为了实现负载均衡和故障容错,以达到高可用的效果
如何搭建Eureka集群
集群原理:相互注册
集群搭建:
1.按照创建Eureka Server服务
的方式创建多个Eureka Server服务
比如:创建三个EurekaServer服务:EurekaServer-7001、EurekaServer-7002、EurekaServer-7003
2.其余步骤没有任何变化,只需要更改yml中的Eureka部分的配置即可
EurekaServer-7001的Eureka部分的配置
eureka:
client:
register-with-eureka: true
fetch-registry: true
service-url:
defaultZone: http://localhost:7002/eureka/,http://localhost:7003/eureka/
EurekaServer-7002的Eureka部分的配置
eureka:
client:
register-with-eureka: true
fetch-registry: true
service-url:
defaultZone: http://localhost:7001/eureka/,http://localhost:7003/eureka/
EurekaServer-7003的Eureka部分的配置
eureka:
client:
register-with-eureka: true
fetch-registry: true
service-url:
defaultZone: http://localhost:7001/eureka/,http://localhost:7002/eureka/
启动上面的三个EurekaServer服务,Eureka集群就已经运行起来了
其他微服务注册到Eureka集群
因为要将服务注册到Eureka集群,所以EurekaClient的地址就必须指向集群的地址
yml中Eureka的地址配置如下:
eureka:
client:
register-with-eureka: true
fetch-registry: true
service-url:
defaultZone: http://localhost:7001/eureka/,http://localhost:7002/eureka/,http://localhost:7003/eureka/
即同时指定多个EurekaServer的地址,每个地址之间用,
分隔
集群的负载均衡
在Eureka集群搭建的时候,说过Eureka集群能够实现服务的负载均衡,那么具体如何实现呢?
首先要实现负载均衡至少需要两个条件:
1.需要一个集群对外提供服务
2.需要一种负载均衡机制来选择去集群中的哪一台机器上去获取服务
集群准备:
创建一个服务提供者,并改动端口,启动多个服务
方法如上图所示,编辑配置项
1.点击左侧的
+
,添加一个服务2.给服务区一个名字,指定主启动类,添加VM参数指定端口
3.启动该服务
启动完成后,去注册中心查看服务
可以看到一个服务名称对应了多个服务地址
服务提供者代码
Application.java
@SpringBootApplication
@EnableEurekaClient
public class ProviderApplication {
public static void main(String[] args) {
SpringApplication.run(ProviderApplication.class,args);
}
}
ProviderController.java
@RestController
@RequestMapping("provider")
public class ProviderController {
@Value("${server.port}")
private String port;
@GetMapping("port")
public String getPort(){
return port;
}
}
application.yml
server:
port: 8001
spring:
application:
name: sword-provider
eureka:
client:
register-with-eureka: true
fetch-registry: true
service-url:
defaultZone: http://localhost:7001/eureka/,http://localhost:7002/eureka/,http://localhost:7003/eureka/
负载均衡机制准备:
创建一个服务消费者,来消费Provider提供的服务
ConsumerApplication.java
@SpringBootApplication
@EnableEurekaClient
public class ConsumerApplication {
public static void main(String[] args) {
SpringApplication.run(ConsumerApplication.class,args);
}
@Bean
@LoadBalanced
public RestTemplate restTemplate(){
return new RestTemplate();
}
}
使用@Bean注解声明一个RestTemplate的bean,并在该bean上添加了@LoadBalanced注解,该注解默认提供了轮询机制的负载均衡算法
ConsumerController.java
@RestController
@RequestMapping("consumer")
public class ConsumerController {
@Autowired
private RestTemplate restTemplate;
private String Url="http://sword-provider";
@GetMapping("port")
public String getPort(){
return restTemplate.getForObject(Url+"/provider/port",String.class);
}
}
使用template调用远程服务,可以看到远程服务的url地址指向的是Provider的服务名
application.yml
server:
port: 9001
spring:
application:
name: sword-consumer
eureka:
client:
service-url:
defaultZone: http://localhost:7001/eureka/,http://localhost:7002/eureka/,http://localhost:7003/eureka/
register-with-eureka: true
fetch-registry: true
启动consumer服务,并访问接口:http://localhost:9001/consumer/port
多次刷新该接口,可以看到页面的返回值在8001和8002之间来回切换,说明消费者服务在访问的服务提供者的时候,请求了不同的服务提供者,说明负载均衡效果达到
actuator完善服务信息
actuator的作用主要有两个:主机名修改、访问信息提供ip提示
依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
主机名修改
在euraka的配置信息中添加instance-id配置
client:
service-url:
defaultZone: http://localhost:7001/eureka/,http://localhost:7002/eureka/,http://localhost:7003/eureka/
register-with-eureka: true
fetch-registry: true
# 添加instance-id配置,以修改注册信息中显示的主机名
instance:
instance-id: sword-consumer-9001
可以看到主机名称已经改变
通过接口查看微服务的状态
显示ip地址提示
instance:
instance-id: sword-consumer-9001
# 添加ip地址显示
prefer-ip-address: true
服务发现Descovery
功能:对于注册进注册中心的微服务,可以通过服务发现来获得该服务的信息
在服务提供者微服务的controller中添加如下代码:
Controller.java
@Resource
private DiscoveryClient discoveryClient;
@GetMapping("services")
public List<ServiceInstance> getServices(){
//获取服务名称列表
List<String> services = discoveryClient.getServices();
for (String s:services){
System.out.println("--item:"+s);
}
//获取服务实例信息
List<ServiceInstance> instances = discoveryClient.getInstances("SWORD-PROVIDER");
return instances;
}
在主启动类上添加@EnableDiscoveryClient
注解
@SpringBootApplication
@EnableEurekaClient
@EnableDiscoveryClient
public class ProviderApplication {
public static void main(String[] args) {
SpringApplication.run(ProviderApplication.class,args);
}
}
启动程序,并访问http://localhost:8001/provider/services,就可以获得服务的相关信息