风在路上 风在路上
首页
导航站
  • Java-Se

    • Java基础
  • Java-Se进阶-多线程

    • 多线程
  • Java-Se进阶-java8新特性

    • java8新特性
  • Java-ee

    • JavaWeb
  • Java虚拟机

    • JVM
  • golang基础

    • golang基础
  • golang框架

    • gin
  • SQL 数据库

    • MySQL
  • NoSQL 数据库

    • Redis
    • ElasticSearch
    • MongoDB
  • ORM

    • MyBatis
    • MyBatis-Plus
  • Spring

    • Spring
  • SpringMVC

    • SpringMVC1
    • SpringMVC2
  • SpringCloud

    • SpringCloud
  • 中间件

    • RabbitMQ
    • Dubbo
  • 秒杀项目
  • Git
  • Linux
  • Docker
  • JWT
  • 面试
  • 刷题
开发问题😈
设计模式
关于💕
归档🕛
GitHub (opens new window)

风

摸鱼
首页
导航站
  • Java-Se

    • Java基础
  • Java-Se进阶-多线程

    • 多线程
  • Java-Se进阶-java8新特性

    • java8新特性
  • Java-ee

    • JavaWeb
  • Java虚拟机

    • JVM
  • golang基础

    • golang基础
  • golang框架

    • gin
  • SQL 数据库

    • MySQL
  • NoSQL 数据库

    • Redis
    • ElasticSearch
    • MongoDB
  • ORM

    • MyBatis
    • MyBatis-Plus
  • Spring

    • Spring
  • SpringMVC

    • SpringMVC1
    • SpringMVC2
  • SpringCloud

    • SpringCloud
  • 中间件

    • RabbitMQ
    • Dubbo
  • 秒杀项目
  • Git
  • Linux
  • Docker
  • JWT
  • 面试
  • 刷题
开发问题😈
设计模式
关于💕
归档🕛
GitHub (opens new window)
  • mybatis

  • mybatis-plus

  • Spring

  • SpringMvc

  • RabbitMQ

  • Dubbo

  • SpringCloud

    • SpringCloud知识体系
    • Eureka
      • Eureka服务注册与发现
        • 1、基础知识
        • 什么是服务治理
        • 什么是服务注册
        • 2、Eureka包含两个组件
        • Eureka Server:提供服务 注册服务
        • Eureka Client:通过注册中心进行访问
        • 3、单机Eureka服务端编写
        • 1、eureka server端项目代码
        • 1.创建maven项目 003-cloud-eureka-server7001
        • 2.pom.xml
        • 3.application.yaml
        • 4.启动类
        • 5.访问http://localhost:7001
        • 2、001-cloud-provider-payment8001工程改造使其变成生产者
        • 1.添加Eureka依赖
        • 2.新增yaml配置
        • 3.启动类新增@EnableEurekaClient注解
        • 4.测试
        • 4、集群Eureka
        • 1、原理图
        • 2、实现集群步骤
        • 5、注册生产者消费者到集群中
        • 6、生产者集群
        • 7、Actuator配置修改
        • 8、服务发现Discovery
        • 修改provider8001的controller
        • 9、Eureka的自我保护
        • 概念
        • 如何禁止自我保护
        • eureka server
        • 服务提供者
    • ZookeeperAndConsul
    • Ribbn
    • OpenFeign
    • Hystrix
    • Gateway
    • Config
    • Bus
    • Stream
    • Sleuth
    • Nacos
    • Sentinel
    • Seata
  • 框架
  • SpringCloud
zdk
2022-05-26
目录

Eureka

Table of Contents generated with DocToc (opens new window)

  • Eureka服务注册与发现
    • 1、基础知识
      • 什么是服务治理
      • 什么是服务注册
    • 2、Eureka包含两个组件
      • Eureka Server:提供服务 注册服务
      • Eureka Client:通过注册中心进行访问
    • 3、单机Eureka服务端编写
      • 1、eureka server端项目代码
        • 1.创建maven项目 003-cloud-eureka-server7001
        • 2.pom.xml
        • 3.application.yaml
        • 4.启动类
        • 5.访问http://localhost:7001
      • 2、001-cloud-provider-payment8001工程改造使其变成生产者
        • 1.添加Eureka依赖
        • 2.新增yaml配置
        • 3.启动类新增@EnableEurekaClient注解
        • 4.测试
    • 4、集群Eureka
      • 1、原理图
      • 2、实现集群步骤
    • 5、注册生产者消费者到集群中
    • 6、生产者集群
    • 7、Actuator配置修改
    • 8、服务发现Discovery
      • 修改provider8001的controller
    • 9、Eureka的自我保护
      • 概念
      • 如何禁止自我保护
        • eureka server
        • 服务提供者

# Eureka服务注册与发现

# 1、基础知识

# 什么是服务治理

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

# 什么是服务注册

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

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

image-20220526201152374

# 2、Eureka包含两个组件

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

各个微服务节点通过配置启动后,会在EurekaServer中进行注册,这样EurekaServer中的服务注册表中将会存储所有可用服务节点的信息,服务节点的信息可以在界面中直观看到。

# Eureka Client:通过注册中心进行访问

是一个Java客户端,用于简化Eureka Server的交互,客户端同时也具备一个内置的、使用轮询(round-robin)负载算法的负载均衡器。在应用启动后,将会向Eureka Server发送心跳(默认周期为30秒)。如果Eureka Server在多个心跳周期内没有接收到某个节点的心跳,EurekaServer将会从服务注册表中把这个服务节点移除(默认90秒)

# 3、单机Eureka服务端编写

# 1、eureka server端项目代码

# 1.创建maven项目 003-cloud-eureka-server7001
# 2.pom.xml
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <parent>
        <artifactId>springcloud</artifactId>
        <groupId>com.zdk</groupId>
        <version>1.0-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>

    <artifactId>cloud-eureka-server7001</artifactId>

    <properties>
        <maven.compiler.source>8</maven.compiler.source>
        <maven.compiler.target>8</maven.compiler.target>
    </properties>

    <dependencies>
        <!--        通用的依赖-->
        <dependency>
            <groupId>com.zdk</groupId>
            <artifactId>cloud-api-commons</artifactId>
            <version>${project.version}</version>
        </dependency>
        <!-- eureka server 依赖包 -->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-actuator</artifactId>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
        </dependency>
    </dependencies>
</project>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
# 3.application.yaml
server:
  port: 7001
spring:
  application:
    name: cloud-eureka-server7001
eureka:
  instance:
    hostname: localhost # eureka 服务端的实例名称
  client:
    # false表示不向注册中心注册自己
    register-with-eureka: false
    # false表示自己端就是注册中心,我的职责就是维护服务实例,并不需要检查服务
    fetch-registry: false
    service-url:
      defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# 4.启动类
@SpringBootApplication
//表示当前的服务是Eureka的server
@EnableEurekaServer
public class EurekaMain7001 {
    public static void main(String[] args) {
        SpringApplication.run(EurekaMain7001.class);
    }
}
1
2
3
4
5
6
7
8
# 5.访问http://localhost:7001

image-20220526203004287

# 2、001-cloud-provider-payment8001工程改造使其变成生产者

# 1.添加Eureka依赖
        <!-- eureka 客户端添加的依赖 -->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
        </dependency>
1
2
3
4
5
# 2.新增yaml配置
eureka:
  client:
    # false表示不想注册中心注册自己
    register-with-eureka: true
    # false表示自己端就是注册中心,我的职责就是维护服务实例,并不需要检查服务
    fetch-registry: true
    service-url:
      # 设置与 Eureka Server交互的地址查询服务和注册服务都需要依赖这个地址
      # 哪个主机(localhost)的哪个(7001)端口
      defaultZone: http://localhost:7001/eureka/
1
2
3
4
5
6
7
8
9
10
# 3.启动类新增@EnableEurekaClient注解
# 4.测试

1、先启动 7001 项目 eureka server

2、在启动 8001 项目 eureka client

3、将80项目入住到eureka服务器(入住方式和8001一样),然后启动

image-20220526204821677

# 4、集群Eureka

# 1、原理图

互相注册,相互守望

image-20220526210420909

问题:微服务RPC远程服务调用最核心的是什么

  • 高可用,试想你的注册中心只有一个only one, 它出故障会导致整个为服务环境不可用
  • 解决办法:搭建Eureka注册中心集群 ,实现负载均衡+故障容错

# 2、实现集群步骤

这里是实现两台集群,如果想继续增加,hosts文件里可以多添加,然后在yml文件中多个url使用 **,**隔开就行了,分别注册到两个或以上的服务器中

  1. 创建一个 004-cloud-eureka-server7002 项目,与 003-cloud-eureka-server7001 项目类似,pom文件相同

  2. 修改C:/Windows/System32/drivers/etc路径下的hosts文件

    127.0.0.1 eureka7001.com
    127.0.0.1 eureka7002.com
    127.0.0.1 eureka7003.com
    
    1
    2
    3
  3. 修改7001项目(server1)的yaml文件

    eureka:
      instance:
        hostname: eureka7001.com # eureka 服务端的实例名称
      client:
        # false表示不想注册中心注册自己
        register-with-eureka: false
        # false表示自己端就是注册中心,我的职责就是维护服务实例,并不需要检查服务
        fetch-registry: false
        service-url:
          # 向另一台服务器注册自己
          defaultZone: http://eureka7002.com:7002/eureka/
    
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
  4. 修改7002项目(server2)的yaml文件

    eureka:
      instance:
        hostname: eureka7002.com # eureka 服务端的实例名称
      client:
        # false表示不想注册中心注册自己
        register-with-eureka: false
        # false表示自己端就是注册中心,我的职责就是维护服务实例,并不需要检查服务
        fetch-registry: false
        service-url:
          # 设置与 Eureka Server交互的地址查询服务和注册服务都需要依赖这个地址
          defaultZone: http://eureka7001.com:7001/eureka/
    
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
  5. 逐个启动项目,然后访问

    http://eureka7001.com:7001
    http://eureka7002.com:7002
    
    1
    2
  6. 修改001-cloud-provider-payment8001 生产者项目的yaml文件

    eureka:
      client:
        # false表示不想注册中心注册自己
        register-with-eureka: true
        # false表示自己端就是注册中心,我的职责就是维护服务实例,并不需要检查服务
        fetch-registry: true
        service-url:
          # 设置与 Eureka Server交互的地址查询服务和注册服务都需要依赖这个地址
          # 哪个主机(localhost)的哪个(7001)端口
          # defaultZone: http://localhost:7001/eureka/  单机版
          
          ############################################################
          # 集群版本
          defaultZone: http://eureka7001.com:7001/eureka,http://eureka7002.com:7002/eureka
    
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
  7. 修改 002-cloud-consumer-order80 消费者项目的yaml文件

    eureka:
      client:
        # false表示不想注册中心注册自己
        register-with-eureka: true
        # false表示自己端就是注册中心,我的职责就是维护服务实例,并不需要检查服务
        fetch-registry: true
        service-url:
          # 设置与 Eureka Server交互的地址查询服务和注册服务都需要依赖这个地址
          # 哪个主机(localhost)的哪个(7001)端口
          # defaultZone: http://localhost:7001/eureka/
    
          ############################################################
          # 集群版本
          defaultZone: http://eureka7001.com/eureka:7001,http://eureka7002.com:7002/eureka
    
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
  8. 测试

    • 先要启动EurekaServer,7001/7002服务
    • 再要启动服务提供者provider,8001
    • 再要启动消费者,80

    下面的情况能出现证明集群注册成功

    image-20220526212201301

# 5、注册生产者消费者到集群中

在消费者和生产者的yaml配置文件中配置两个注册中心组成的集群的地址即可

defaultZone: http://eureka7001.com:7001/eureka/,http://eureka7002.com:7002/eureka/
1

# 6、生产者集群

基本复制cloud-provider-payment8001的代码,新建模块cloud-provider-payment8002,注意要修改yaml中的server.port为8002,其他不变即可,启动服务,注册到注册中心。

验证

为了验证服务调用的负载均衡,我们使用服务名称作为url,且添加server.port输出来表示调用的是哪一个服务实例

  1. 首先在order消费者的controller中修改调用url为服务名称
/**
     * 调用地址改为微服务的名称(yaml中的application.name,这样调用时就会去eureka中获取提供者)
     */
    public static final String PAYMENT_URL = "http://cloud-payment-service";
1
2
3
4
  1. 然后修改输出信息提示

image-20221024162423264

  1. 此时直接访问http://localhost/consumer/payment/get/1会报错,这是因为目前使用的RestTemplate还没有走Eureka的服务发现,所以报了java.net不识别上面的主机名的错误,此时需要给RestTemplate加上负载均衡即可走Eureka了

    /**
    * 消费者端的配置中,给RestTemplate的Bean加上org.springframework.cloud.client.loadbalancer.LoadBalanced注解
    **/
    @Configuration
    public class ApplicationContextConfig {
        @Bean
        @LoadBalanced
        public RestTemplate restTemplate(){
            return new RestTemplate();
        }
    }
    
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
  2. 再次调用即可发现,实现了负载均衡,多次调用发现,默认策略是轮询

    image-20221024164800923

# 7、Actuator配置修改

需要以下依赖

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
1
2
3
4
5
6
7
8
eureka:
	instance:
		#指定在Eureka控制台显示的实例名称
		#可以使其不带有主机名等敏感信息
    	instance-id: payment8002
    	#鼠标悬停实例名称上是否显示ip
    	prefer-ip-address: true
1
2
3
4
5
6
7

image-20221024171015611

# 8、服务发现Discovery

概述

对于注册进eureka的微服务实例,可以通过此Discovery来获得服务的信息

# 修改provider8001的controller

新增一个接口,展示服务信息

@GetMapping("/payment/discovery")
public Object discovery(){
    List<String> services = discoveryClient.getServices();
    for (String service : services) {
        log.info("service->{}",service);
    }
    List<ServiceInstance> instances = discoveryClient.getInstances("cloud-payment-service");
    for (ServiceInstance instance : instances) {
        log.info(instance.getServiceId()+"\t"+instance.getHost()
        +"\t"+instance.getPort()+"\t"+instance.getUri());
    }
    return discoveryClient;
}
1
2
3
4
5
6
7
8
9
10
11
12
13

同时需要在启动类上增加@EnableDiscoveryClient注解

结果:

image-20221024175707689

# 9、Eureka的自我保护

# 概念

概述

保护模式主要用于一组客户端的Eureka Server之间存在网络分区场景下的保护,一旦进入保护模式,Eureka Server将会尝试保护其服务注册表中的信息,不再删除服务注册表中的数据,也就是不会销毁任何服务

如果在Eureka Server的首页看到以下这段提示,则说明Eureka进入了保护模式

image-20221024180032051

总的来说就是,如果某时刻某一个微服务不可以用了,Eureka并不会立刻清理掉这个微服务的信息,依旧会对信息进行保存,属于CAP里面的AP分支

Eureka的28

# 如何禁止自我保护

# eureka server

进行以下配置即可关闭自我保护(默认是true)

eureka:	
	server:
    	enable-self-preservation: false
		# 设置接受心跳的时间间隔 单位毫秒 默认是0
		eviction-interval-timer-in-ms: 2000
1
2
3
4
5
# 服务提供者
eureka:
  instance:
    #Eureka客户端向服务端发送心跳的时间间隔,单位为秒(默认是30秒)
    lease-renewal-interval-in-seconds: 1
    #Eureka Server在收到最后一次心跳后的等待时间上限,单位为秒(默认是90秒),超时将剔除服务
    lease-expiration-duration-in-seconds: 2
1
2
3
4
5
6

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

在 GitHub 上编辑此页 (opens new window)
#Eureka
最后更新: 2022/10/25, 18:10:00
SpringCloud知识体系
ZookeeperAndConsul

← SpringCloud知识体系 ZookeeperAndConsul→

Theme by Vdoing | Copyright © 2022-2025 zdk | notes
湘ICP备2022001117号-1
川公网安备 51142102511562号
本网站由 提供CDN加速/云存储服务
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式