ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

SpringCloud 2020-Eureka服务注册与发现

2021-03-20 21:32:27  阅读:131  来源: 互联网

标签:SpringCloud boot eureka 2020 7001 org Eureka com cloud


Eureka服务注册与发现

1、Eureka基础知识

在这里插入图片描述在这里插入图片描述
在这里插入图片描述在这里插入图片描述

2、单机Eureka构建步骤

2.1 新建服务注册中心(eurekaServer端)

1、新建cloud-eureka-server7001模块
Eureka1.X和2.X的对比说明
在这里插入图片描述

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>cloud2020</artifactId>
        <groupId>com.liukai.springcloud</groupId>
        <version>1.0-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>

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

    <dependencies>
        <!-- https://mvnrepository.com/artifact/org.springframework.cloud/spring-cloud-starter-eureka-server -->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
        </dependency>

        <dependency>
            <groupId>com.liukai.springcloud</groupId>
            <artifactId>cloud-api-commons</artifactId>
            <version>${project.version}</version>
        </dependency>

        <!-- https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-web -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <!-- https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-web  -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-actuator</artifactId>
        </dependency>

        <!-- https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-devtools -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-devtools</artifactId>
            <scope>runtime</scope>
            <optional>true</optional>
        </dependency>

        <!-- https://mvnrepository.com/artifact/org.projectlombok/lombok -->
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
        </dependency>

        <!-- https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-test -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
        </dependency>

    </dependencies>
</project>

3、application.yml

server:
  port: 7001

eureka:
  instance:
    hostname: localhost  #eureka服务端的实例名称
  client:
    register-with-eureka: false    #false表示不想注册中心注册自己
    fetch-registry: false   #false表示自己端就是注册中心,我的职责就是维护服务器实例,并不需要去检索服务
    service-url:
      # 设置与Eureka Server交互的地址查询服务和注册服务都需要依赖这个地址。
      defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/     # 单机版

4、主启动类EurekaMain7001

package com.liukai.springcloud;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

/**
 * @author liukai
 * @version 1.0.0
 * @ClassName EurekaMain7001.java
 * @Description TODO
 * @createTime 2021年03月20日 16:00:00
 */
@SpringBootApplication
@EnableEurekaServer // 表明7001这个模块是一个服务注册中心
public class EurekaMain7001 {
    
    public static void main(String[] args) {
            SpringApplication.run(EurekaMain7001.class);
    }
    
}

5、启动:
在这里插入图片描述在这里插入图片描述

2.2 EurekaClient端cloud-provider-payment8001将注册进EurekaServer7001成为服务提供者provider

1、修改cloud-provider-payment8001的pom.xml,添加如下

        <!-- https://mvnrepository.com/artifact/org.springframework.cloud/spring-cloud-starter-eureka-server Eureka客户端-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
        </dependency>

2、修改cloud-provider-payment8001的yml文件,修改为以下

server:
  port: 8001

spring:
  application:
    name: cloud-payment-service
  datasource:
    type: com.alibaba.druid.pool.DruidDataSource
    driver-class-name: org.gjt.mm.mysql.Driver
    url: jdbc:mysql://localhost:3306/cloud2020?useUnicode=true&characterEncoding=utf-8&useSSL=false
    username: root
    password: root

mybatis:
  mapper-locations: classpath:mapper/*.xml
  type-aliases-package: com.liukai.springcloud.entities  # 所有Entity 别名类所在包

eureka:
  client:
    register-with-eureka: true
    fetchRegistry: true
    service-url:
      defaultZone: http://localhost:7001/eureka
 

3、cloud-provider-payment8001的主启动类添加 @EnableEurekaClient 注解
4、启动测试:先启动7001,再启动8001
在这里插入图片描述
可以发现cloud-payment-service注册成功了
在这里插入图片描述

2.3 EurekaClient端cloud-consumer-order80注册进EurekaServer成为服务消费者consumer

1、修改cloud-consumer-order80的pom.xml,添加如下代码

 <!-- https://mvnrepository.com/artifact/org.springframework.cloud/spring-cloud-starter-eureka-server -->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
        </dependency>

2、修改cloud-consumer-order80的yml,修改为如下

server:
  port: 80

spring:
  application:
    name: cloud-order-service

# 需要先搭建好EurekaServer后在用得着这个
eureka:
  client:
    # 表示是否要将自己注册进EurekaServer,默认为true
    register-with-eureka: true
    # 是否从EurekaServer中抓取已有信息,默认为true。单节点无所谓,集群必须设置true才能配合Ribbon使用负载均衡。
    fetchRegistry: true
    service-url:
      defaultZone: http://localhost:7001/eureka

3、cloud-consumer-order80的主启动类添加 @EnableEurekaClient 注解
4、启动测试:先启动7001,在启动8001,最后启动80
在这里插入图片描述cloud-order-service注册成功在这里插入图片描述

3、集群Eureka构建步骤

Eureka集群原理说明
在这里插入图片描述
解决办法:搭建Eureka注册中心集群,实现负载均衡+故障容错

3.1 参考cloud-eureka-server7001新建cloud-eureka-server7002

1、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>cloud2020</artifactId>
        <groupId>com.liukai.springcloud</groupId>
        <version>1.0-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>

    <artifactId>cloud-eureka-server7002</artifactId>

    <dependencies>
        <!-- https://mvnrepository.com/artifact/org.springframework.cloud/spring-cloud-starter-eureka-server -->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
        </dependency>

        <dependency>
            <groupId>com.liukai.springcloud</groupId>
            <artifactId>cloud-api-commons</artifactId>
            <version>${project.version}</version>
        </dependency>

        <!-- https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-web -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <!-- https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-web  -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-actuator</artifactId>
        </dependency>

        <!-- https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-devtools -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-devtools</artifactId>
            <scope>runtime</scope>
            <optional>true</optional>
        </dependency>

        <!-- https://mvnrepository.com/artifact/org.projectlombok/lombok -->
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
        </dependency>

        <!-- https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-test -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
        </dependency>

    </dependencies>
</project>

2、修改映射配置,找到C:\Windows\System32\drivers\etc路径下的hosts文件
在这里插入图片描述在末尾添加以下代码,表示将eureka7001.com等映射成为127.0.0.1

127.0.0.1  eureka7001.com
127.0.0.1  eureka7002.com
127.0.0.1  eureka7003.com

在这里插入图片描述

3、7002的application.yml

server:
  port: 7002

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

4、7001的application.yml修改为

server:
  port: 7001

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

5、cloud-eureka-server7002的主启动类EurekaMain7002

package com.liukai.springcloud;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer;

/**
 * @author liukai
 * @version 1.0.0
 * @ClassName EurekaMain7002.java
 * @Description TODO
 * @createTime 2021年03月20日 17:30:00
 */
@SpringBootApplication
@EnableEurekaServer // 表明7001这个模块是一个服务注册中心
public class EurekaMain7002 {

    public static void main(String[] args) {
            SpringApplication.run(EurekaMain7002.class);
    }

}

6、修改8001和80的yml文件,将defaultZone修改为以下

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

7、测试:依次启动7001,7002,8001,80在这里插入图片描述在这里插入图片描述
因为将eureka7001.com和eureka7002.com都映射到了localhost,所以直接访问http://eureka7001.com:7001/和http://eureka7002.com:7002/,可以发现,7001和7002都启动成功了,并且相互守望,8001和80也都注册进了7001和7002。
在这里插入图片描述
获取数据也成功

3.2 支付服务提供者8001集群环境构建

1、参考cloud-provider-payment8001新建cloud-provider-payment8002
2、cloud-provider-payment8002的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>cloud2020</artifactId>
        <groupId>com.liukai.springcloud</groupId>
        <version>1.0-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>

    <artifactId>cloud-provider-payment8002</artifactId>


    <dependencies>
        <!--        eureka-client-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
        </dependency>
        <!--        引入公共api模块-->
        <dependency>
            <groupId>com.liukai.springcloud</groupId>
            <artifactId>cloud-api-commons</artifactId>
            <version>${project.version}</version>
        </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.mybatis.spring.boot</groupId>
            <artifactId>mybatis-spring-boot-starter</artifactId>
        </dependency>
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid-spring-boot-starter</artifactId>
            <version>1.1.10</version>
        </dependency>
        <!--mysql-connector-java-->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
        </dependency>
        <!--jdbc-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-jdbc</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-devtools</artifactId>
            <scope>runtime</scope>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>

</project>

3、cloud-provider-payment8002的yml

server:
  port: 8002

spring:
  application:
    name: cloud-payment-service
  datasource:
    type: com.alibaba.druid.pool.DruidDataSource
    driver-class-name: org.gjt.mm.mysql.Driver
    url: jdbc:mysql://localhost:3306/cloud2020?useUnicode=true&characterEncoding=utf-8&useSSL=false
    username: root
    password: root

mybatis:
  mapper-locations: classpath:mapper/*.xml
  type-aliases-package: com.liukai.springcloud.entities  # 所有Entity 别名类所在包

eureka:
  client:
    register-with-eureka: true
    fetchRegistry: true
    service-url:
      defaultZone: http://eureka7001.com:7001/eureka,http://eureka7002.com:7002/eureka  #集群版
      #defaultZone: http://localhost:7001/eureka

4、将8001的以下文件拷贝到8002对应的位置
在这里插入图片描述
5、将PaymentMain8001修改为PaymentMain8002

package com.liukai.springcloud;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;

/**
 * @author liukai
 * @version 1.0.0
 * @ClassName PaymentMain8001.java
 * @Description TODO
 * @createTime 2021年03月19日 16:47:00
 */
@SpringBootApplication
@EnableEurekaClient
public class PaymentMain8002 {
    
    public static void main(String[] args) {
            SpringApplication.run(PaymentMain8002.class);
    }
    
}

6、测试8002能否访问成功
在这里插入图片描述

7、负载均衡

  • 修改80端口的OrderController,即将PAYMENT_URL 修改为以下
// 将地址修改为服务的地址,而不是指定某个端口号
    public static final String PAYMENT_URL = "http://CLOUD-PAYMENT-SERVICE";
  • 修改80端口的java配置类 ApplicationContextConfig ,使用@LoadBalanced注解赋予RestTemplate负载均衡的能力。
// 注入RestTemplate
    @Bean
    @LoadBalanced
    public RestTemplate getRestTemplate(){
        return new RestTemplate();
    }

8、测试:依次启动7001,7002,8001,8002,80,访问http://localhost/consumer/payment/get/31,发现每次查询的端口号都在8001和8002轮询,每次都不一样
在这里插入图片描述

Ribbon和Eureka整合后Consumer可以直接调用服务而不用再关心地址和端口号,且该服务还有负载功能了

4、actuator微服务信息完善

1、修改8001和8002的yml中的eureka部分,添加instance。8001的instance-id为payment8001;8002的instance-id为payment8002。

eureka:
  client:
    register-with-eureka: true
    fetchRegistry: true
    service-url:
      defaultZone: http://eureka7001.com:7001/eureka,http://eureka7002.com:7002/eureka  #集群版
      #defaultZone: http://localhost:7001/eureka
  instance:
    instance-id: payment8002
    prefer-ip-address: true	# 显示ip

在这里插入图片描述
可以发现,8001和8002的服务名称发生改变,而且鼠标悬停在payment8001上,页面左下角会显示服务的ip地址和端口号。

5、服务发现Discovery

对于注册进eureka里面的微服务,可以通过服务发现来获得该服务的信息

1、修改cloud-provider-payment8001的Controller,添加如下内容,8002也做相同操作

    // 服务发现Discovery
    @Resource
    private DiscoveryClient discoveryClient;

    @GetMapping("/payment/discovery")
    public Object discovery(){
        List<String> services = discoveryClient.getServices();
        services.forEach(System.out::println);
        List<ServiceInstance> instances = discoveryClient.getInstances("CLOUD-PAYMENT-SERVICE");
        for (ServiceInstance instance : instances) {
            log.info("ServiceId:" + instance.getServiceId() + ",Port:" + instance.getPort() + ",Host:" + instance.getHost());
        }
        return discoveryClient;
    }

2、测试,访问http://localhost:8001/payment/discovery,8002同样的可以
在这里插入图片描述在这里插入图片描述

6、Eureka自我保护机制

1、故障现象
在这里插入图片描述
2、导致原因
在这里插入图片描述在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

一句话:某时刻某一个微服务不可用了,Eureka不会立刻清理,依旧会对该微服务的信息进行保存。属于CAP里面的AP分支

3、怎么禁止自我保护(一般生产环境中不会禁止自我保护)

  • 注册中心eureakeServer端7001:出厂默认,自我保护机制是开启的。修改7001的yml文件,将eureka修改为以下。
eureka:
  instance:
    hostname: eureka7001.com  #eureka服务端的实例名称
  client:
    register-with-eureka: false    #false表示不想注册中心注册自己
    fetch-registry: false   #false表示自己端就是注册中心,我的职责就是维护服务器实例,并不需要去检索服务
    service-url:
      # 设置与Eureka Server交互的地址查询服务和注册服务都需要依赖这个地址。
      defaultZone: http://eureka7002.com:7002/eureka/     # 集群版,相互守望
  server:
    enable-self-preservation: false # 禁用自我保护模式
    eviction-interval-timer-in-ms: 2000 # 将默认保护时间90秒改为2秒
  • 生产者客户端eureakeClient端8001:修改8001的yml文件,将eureka修改为以下。
eureka:
  client:
    register-with-eureka: true
    fetchRegistry: true
    service-url:
      defaultZone: http://eureka7001.com:7001/eureka,http://eureka7002.com:7002/eureka  #集群版
      #defaultZone: http://localhost:7001/eureka
  instance:
    instance-id: payment8001 # 设置主机名称   http://localhost:8002/actuator/health健康检查
    prefer-ip-address: true # 访问路径可以显示IP地址
    # Eureka客户端向服务端发送心跳的时间间隔,单位为秒(默认是30秒)
    lease-expiration-duration-in-seconds: 1
    # Eureka服务端在收到最后一次心跳后等待时间上限,单位为秒(默认是30秒),超时将剔除服务
    lease-renewal-interval-in-seconds: 2
  • 测试,关闭所有服务,先启动7001,再启动8001。发现7001的eureka关闭了自我保护机制,8001也成功入驻。

在这里插入图片描述* 关闭8001服务,7001的eureka中立马清理掉8001
在这里插入图片描述

此笔记的视频地址:尚硅谷SprngCloud(H版&alibaba框架开发教程(大牛讲授SpringCloud))

标签:SpringCloud,boot,eureka,2020,7001,org,Eureka,com,cloud
来源: https://blog.csdn.net/Cool_Boy23955/article/details/115028975

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有