微服务注册中心Eureka

微服务注册中心Eureka

Posted by John Doe on 2021-05-15
Words 1.5k and Reading Time 6 Minutes
Viewed Times

前言

什么是服务治理

​ Spring Cloud封装了Netfilx公司开发的Eureka模块来实现服务治理

​ 在传统的rpc远程调用框架中,管理每个服务与服务之间依赖关系比较复杂,管理比较复杂,所以需要使用服务治理,管理服务于服务之间依赖关系,可以实现服务调用、负载均衡、容错等,实现服务注册与发现。

什么是服务治理

​ Eureka采用了CS的设计架构,Eureka Server作为服务注册功能的服务器,它是服务注册中心。而系统中的其他微服务,使用Eureka的客户端连接到Eureka Server并维持心跳连接。这样系统的维护人员就可以通过Eureka Server来监控系统中各个微服务是否正常运行。

​ 在服务注册于发现中,有一个注册中心,当服务器启动的时候,会把当前自己服务器的信息比如服务地址通讯地址等以别名方式注册到注册中心上。另一方(消费者|服务提供者),以该别名的方式去注册中心上获取到实际的服务通讯地址,然后再实现本地RPC调用RPC远程调用框架核心设计思想:在于注册中,因为使用注册中心管理每个服务与服务之间的一个依赖关系(服务治理概念)。在任何rpc远程框架中,都会有一个注册中心(存放服务地址相关信息(接口地址))。

项目地址

来源:尚硅谷spring cloud2020

项目地址:https://github.com/raineddown/spring-cloud-demo

Eureka系统架构与Dubbo架构对比

Eureka和Dubbo对比

Eureka的两个组件:Eureka Server和Eureka Client

Eureka Server和Eureka Client

依赖:

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

相关注解

1
@EnableEurekaClient
1
@EnableEurekaServer

Eureka单体demo

项目地址:https://github.com/raineddown/spring-cloud-demo

涉及服务:cloud-api-commons、cloud-provider-payment8001、cloud-consumer-order80、cloud-eureka-server7001

集群版eureka

涉及服务:cloud-api-commons、cloud-provider-payment8001、cloud-consumer-order80、cloud-eureka-server7001

1
2
3
4
就是pay模块启动时,注册自己,并且自身信息也放入eureka
2.order模块,首先也注册自己,放入信息,当要调用pay时,先从eureka拿到pay的调用地址
3.通过HttpClient调用
并且还会缓存一份到本地,每30秒更新一次

集群构建原理:

互相注册

EurekaServer端(互相注册)

服务1配置文件:

1
2
3
4
5
6
7
8
9
10
11
12
13
server:
port: 7001

#集群版
eureka:
instance:
hostname: eureka7001.com #eureka服务端的实例名字
client:
register-with-eureka: false #表示不向注册中心注册自己
fetch-registry: false #表示自己就是注册中心,职责是维护服务实例,并不需要去检索服务
service-url:
#设置与eureka server交互的地址查询服务和注册服务都需要依赖这个地址
defaultZone: http://eureka7002.com:7002/eureka/ 这个是集群版开启 互相注册

服务2配置文件:

1
2
3
4
5
6
7
8
9
10
11
12
13
server:
port: 7002

#集群版
eureka:
instance:
hostname: eureka7002.com #eureka服务端的实例名字
client:
register-with-eureka: false #表识不向注册中心注册自己
fetch-registry: false #表示自己就是注册中心,职责是维护服务实例,并不需要去检索服务
service-url:
#设置与eureka server交互的地址查询服务和注册服务都需要依赖这个地址
defaultZone: http://eureka7001.com:7001/eureka/

EurekaClient端

注意:服务的消费者端,即向注册中心发现服务地址端的RestTemplate需添加@LoadBalanced注解保证负载均衡以使用集群中多个服务中的一个。

1
2
3
4
5
6
7
8
9
10
11
12
@Configuration
public class ApplicationContextConfig {

// 配置bean 不然后面没法依赖注入,就像以前ssm整合时配置依赖注入一样,
// 需要在配置文件配置之后,代码中才可以依赖注入
// 当前文件就是spring的配置文件
@Bean
@LoadBalanced //让这个RestTemplate在请求时拥有客户端负载均衡的能力 //将此注解注释掉,使用自己的轮询算法不使用默认的
public RestTemplate getRestTemplate() {
return new RestTemplate();
}
}

PAYMENT_URL 为服务消费者在注册中心找到服务提供者的服务名

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
@RestController
@RequestMapping("consumer")
public class OrderController {

// public static final String PAYMENT_URL = "http://localhost:8001";

public static final String PAYMENT_URL = "http://CLOUD-PAYMENT-SERVICE";

@Resource
private RestTemplate restTemplate;


@PostMapping("/payment/create")
public CommonResult<Payment> create(@RequestBody Payment payment) {
return restTemplate.postForObject(PAYMENT_URL + "/payment/create", payment, CommonResult.class);

相关配置:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
server:
port: 8001

spring:
application:
name: cloud-payment-service


eureka:
client:
register-with-eureka: true #是否向注册中心注册自己
fetchRegistry: true #是否从注册中心抓取已有的注册信息 默认true,集群必须设置为true
service-url:
# 设置与eureka server交互的地址查询服务和注册服务都需要依赖这个地址
defaultZone: http://eureka7001.com:7001/eureka,http://eureka7002.com:7002/eureka #集群版
instance:
instance-id: payment8001
prefer-ip-address: true #访问路径可以显示IP地址

Eureka自我保护

设置接受心跳时间间隔

客户端(比如pay模块):

上图表示每隔一秒Eureka客户端向服务端发送心跳,2秒后无心跳剔除服务注册中心

1
2
3
4
5
6
7
8
9
10
11
12
13
14
eureka:
instance:
hostname: eureka7001.com #eureka服务端的实例名字
client:
register-with-eureka: false #表示不向注册中心注册自己
fetch-registry: false #表示自己就是注册中心,职责是维护服务实例,并不需要去检索服务
service-url:
#设置与eureka server交互的地址查询服务和注册服务都需要依赖这个地址
defaultZone: http://eureka7001.com:7001/eureka/
# defaultZone: http://eureka7002.com:7002/eureka/ 这个是集群版开启 互相注册
server:
# 关闭自我保护机制,保证不可用服务被及时踢除
enable-self-preservation: false
eviction-interval-timer-in-ms: 2000

上面配置表示关闭Eureka自我保护机制

此时启动erueka和pay.此时如果直接关闭了pay,那么erueka会直接删除其注册信息

注意:Eureka2.0已停止更新,见网址https://github.com/Netflix/eureka/wiki

附:服务发现DiscoveryClient

1
org.springframework.cloud.client.discovery.DiscoveryClient


This is copyright.

...

...

00:00
00:00