0%

【SpringCloud】服务注册中心:Eureka

服务注册中心:Eureka的基本使用

1 服务中心作用

  • 用于监控权限,浏览管控,来进行服务器的调度协调
  • 类似病人看医生,需要去前台挂号,前台负责分配哪些病人访问哪些医生,进行协调

2. 基础知识

2.1 服务治理

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

2.2 服务注册

  • Eureka作为服务注册的服务器,它是服务注册的中心
  • 系统中的其他微服务,使用Eurka的客户端连接到Eurka Server并维持心跳连接,这样维护人员就可以通过Eureka Server来监控微服务是否正常运行

2.3 Eurka组件

  • Eureka Server:提供服务注册服务

    • EurkaServer中的服务注册表中将会存储所有可用服务节点的信息,服务节点的信息可以在界面中直观看到
  • Eureka Client:通过注册中心进行访问

    • 一个Java客户端,用于简化Eureka Server的交互
    • 启动后,会向Eureka Server发送信条(默认周期30秒)。如果Eureka Server在多个心跳周期内没有接收到某个检点的心跳,Eureka Server会从服务注册表中把这个服务器节点移除(默认90秒)

3 单机构建Eureka

3.1 安装Eureka Server

  • (1)创建maven项目cloud-eureka-server7001

  • (2)引入依赖

1
2
3
4
5
6
7
8
9
10
<!-- Eureka Server -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>
<!-- web -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
  • (3)配置yaml
1
2
3
4
5
6
7
8
9
10
11
server:
port: 7001

eureka:
instance:
hostname: localhost #eureka服务器的实例名称
client:
register-with-eureka: false #不向eureka-server注册自己
fetch-registry: false # 表示是否从Eureka Server获取注册信息,默认为true。因为这是一个单点的Eureka Server,不需要同步其他的Eureka Server节点的数据
service-url:
defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/ #设置与eureka server交互的地址,查询服务和注册服务都需要这个地址
  • (4)启动类
1
2
3
4
5
6
7
@SpringBootApplication
@EnableEurekaServer //表示此启动时eureka server
public class EurekaMain7001 {
public static void main(String[] args) {
SpringApplication.run(EurekaMain7001.class, args);
}
}

3.2 服务器安装Eureka Client

  • (1)引入依赖
1
2
3
4
5
<!-- eureka client -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
  • (2)修改yaml
1
2
3
4
5
6
eureka:
client:
register-with-eureka: true # 是否注册进eureka服务端
fetch-registry: true # 是否从eureka server从获取已有的注册信息,默认true。单节点无所谓,集群的话需要
service-url:
defaultZone: http://localhost:7001/eureka
  • (3)主启动类
1
2
3
4
5
6
7
@SpringBootApplication
@EnableEurekaClient //表示此服务器是eureka client
public class PaymentMain8001 {
public static void main(String[] args) {
SpringApplication.run(PaymentMain8001.class, args);
}
}
  • (4)启动
    • 将eureka server 和 eureka client都启动,进入http://localhost:7001

3.3 客户端安装eureka client

  • 方法步骤和服务器的一样,只需要主要yaml配置文件中server.application.name是该客户端的名字
  • 运行结果:

4 集群构建Eureka

集群用来解决eureka发生故障时,仍能继续工作,而不是整个系统瘫痪

4.1 Eureka集群原理

  • 一句话概括:互相注册、互相守望

4.2 Eureka Server集群搭建

  • (1)创建一个与端口7001一摸一样的服务器,端口7002
  • (2)修改本机的映射
    • 由于我们只有一台机器,所有只能用不同的端口号来映射同一个地址
    • C:Windows\System32\drivers\etchosts文件
    • 添加127.0.0.1 eurka7001.com127.0.0.1 eureka7002.com
  • (3)修改yaml文件
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
# eureka7001
server:
port: 7001
eureka:
instance:
hostname: eureka7001.com # eureka服务器的实例名称
client:
register-with-eureka: false
fetch-registry: false
service-url:
defaultZone: http://eureka7002.com:7002/eureka/ # 注册地址改成eureka7002的


# eureka7002
server:
port: 7002
eureka:
instance:
hostname: eureka7002.com
client:
register-with-eureka: false
fetch-registry: false
service-url:
defaultZone: http://eureka7001.com:7001/eureka/ # 注册地址改成eureka7001的
  • (4)启动效果

4.3 服务器和客户端注册到集群

  • 操作非常简单:只需要修改yaml中的eureka server的地址即可
1
2
3
eureka:
client:
defaultZone: http://eureka7001.com:7001/eureka,http://eureka7002.com:7002/eureka/

5 服务器集群搭建

不仅ekure server需要集群,服务器也要进行集群,避免服务器挂了,整个服务都瘫痪

  • (1)创建一份与payment8001的服务器payment8002
  • (2)修改Controller
    • 为了知道我们访问链接时,是哪个端口提供服务
1
2
3
4
5
6
7
8
9
@GetMapping("/payment/get/{id}")
public CommonResult getPaymentById(@PathVariable("id") Long id) {
Payment payment = paymentService.getPaymentById(id);
log.info("****查询结果:" + payment);
if(payment != null ) {
return new CommonResult(200, "查询成功, 端口号:xxxx", payment); //返回结果添加端口号信息,8001, 8002都要写
}
return new CommonResult(400, "查询失败", null);
}
  • (3)运行测试
  • (4)客户端开启负载均衡
1
2
3
//修改OrderController
// private static final String PAYMENT_URL = "http://localhost:8001";
private static final String PAYMENT_URL = "http://cloud-payment-service"; //不写死端口号,只写服务器名称
1
2
3
4
5
6
7
8
9
//修改ApplicationContextConfig
@Configuration
public class ApplicationContextConfig {
@Bean
@LoadBalanced //负载均衡,自动分配请求集群的端口
public RestTemplate getTemplate() {
return new RestTemplate();
}
}

6 actuator微服务信息完善

  • 通过修改yaml配置文件可以优化以上问题
    1
    2
    3
    4
    eureka:
    instance:
    instance-id: payment8002 # eureka中服务名称
    prefer-ip-address: true # 访问路径是否可以显示IP地址

7 服务Discovery

  • 服务的discovery可以显示服务器的一些信息
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
//修改PaymentController来演示

@Autowired
private DiscoveryClient discoveryClient;

@GetMapping("/payment/discovery")
public Object discovery() {
List<String> services = discoveryClient.getServices(); //获取服务器名称
for(String service : services) {
log.info("**** " + service);
}

List<ServiceInstance> instances = discoveryClient.getInstances("cloud-payment-service"); //获取服务器实例信息
for (ServiceInstance instance : instances) {
log.info("**** " + instance.getServiceId() + "\t" + instance.getUri());
}

return discoveryClient;
}

8 Eureka自我保护理论知识

8.1 自我保护理论

  • 当Eureka出现一下红字时,证明处理了自我保护中
  • 出现原因:某时刻某一个微服务不可用了,Eureka不会立刻清理,依旧会对该微服务的信息进行保存,避免因为网络延迟导致无法接受到心跳,导致错误删除服务

8.2 关闭自我保护

1
2
3
4
5
# 服务端修改yaml

eureka:
server:
enable-self-preservation: false # 是否开启自动保护机制
  • 关闭后会出现以下提示